使用python的pyserial包进行串口通信比较简单,但也有一些需要注意的事情,本文是为了让没有串口通信知识的朋友从零开始学用的笔记。
常见的四接线串口通信指通用异步收发器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种串行、异步、全双工的通信协议。
工作原理是将传输数据的每个二进制位一位接一位地传输。在UART通信协议中信号线上的状态为高电平时代表‘1’,信号线上的状态为低电平时代表‘0’。比如使用UART通信协议进行一个字节数据的传输时就是在信号线上产生八个高低电平的组合。
串口通信使用二进制字节流进行,发送和接收缓冲区均为char型的数组。
这时候就需要在两个uart设备上指定相同的传输速率,以及空闲位、起始位、校验位、结束位,也就是遵循相同的协议。
*因此,波特率是必须要优先选择好的,两个设备应该以同样的波特率收发信息,否则串口不会工作。
与其他python包相同,直接在window的cmd中使用以下命令即可
(具体我也不太懂,反正pip install就是可以用来方便的安装python包)
pip install pyserial
习惯使用anaconda的用户也可以在anaconda的powershell中用conda的安装命令。
pyserial的官方帮助文档
首先,要将pyserial包导入
import serial
ser = serial.Serial('COM6',19200,timeout=timex)
serial.Serial是一个类,也是最基本的串口函数,我们通过实例化得到一个叫ser的实例。(具体请学习python的「类」)
下面是几个参数的说明。
1.'COM6’
'COM6’是window系统的串口设备名,可以在设备管理器中查看有哪些串口可供使用。
在linux系统中可以通过以下的指令来命令python查看所有可用的port
python -m serial.tools.list_ports
2.19200
是波特率,需要与串口所连接的另一个设备匹配。
3.timeout
我是指定了修改timeout参数,这是终止时间,用以终止串口操作。比如说我使用read函数读取串口数据,程序就会持续读取timeout的时长来读取数据
注:以下所有函数都是serial.Serial的方法,也就是使用
ser.function()
的格式来调用。(ser为刚刚创建的实例)
使用例子:
串口通信只支持传输byte格式的数据,不能传递int型数据(就是不能直接传送数字,不管是什么进制都不行)
需要把字符型数据编码成byte格式进行传输(常用的是UTF-8编码方式)
python的encode和decode编码,以及常见编码类型
例如:
发送一个十六进制的数据
使用fromHex()函数来进行字符到byte的转换。
(业余人士用python一定要去找那些封包的函数,不要去用那些奇奇怪怪的代码。。自己心里也迷糊)
字符串’xxxxxxxx’的byte型数据用b’xxxxxxxx’表示。
Measure_tem_comand='55 AA 11 00 03 13'#要发送的十六进制字符串,两个数字(字母)一组,用空格隔开
byte_Measure_tem_comand=bytes.fromhex(Measure_tem_comand)#使用fromhex函数将16进制指令转换为byte类型
ser.write(byte_Measure_tem_comand)#使用write函数将命令写入串口
recive_sta = ser.readall()#从串口中读取数据
if recive_sta!=b'':#判断是否有读取到数据。
# 将接受的16进制数据格式如b'h\x12\x90xV5\x12h\x91\n4737E\xc3\xab\x89hE\xe0\x16'
# 转换成b'6812907856351268910a3437333745c3ab896845e016'
# 通过[]去除前后的b'',得到我们真正想要的数据
print("receive",str(binascii.b2a_hex(recive_sta))[2:-1])
这样子就可以对串口所连接的仪器进行操作啦!