python调用pyserial库实现对RS232命令的自动化控制


前言

RS232串口的使用在底层开发中占据着无可替代的地位,在大部分的嵌入式设备中都会有对RS232指令的开发使用,因而掌握了使用python实现对RS232串口指令的发送,可对嵌入式设备的RS232指令进行灵活的发送控制,从而实现对RS232指令的自动化控制。


一、需要克服的问题点

在使用串口工具的时候,我们会发现对RS232的功能操作,主要有以下的几个点:
1、接入RS232转USB串口线,在电脑的设备管理器里找到对应的USB端口号(若识别不到设备,请相应的驱动包是否正确安装)
2、 打开串口调试助手工具(sscom、XCOM等),选中对应的USB端口号,设置波特率、根据需要勾选hex发送、设置校验位,打开串口
3、发送指令,接受返回值
从上面可以看出,若要实现python进行串口的使用,最基本的要求便是需要实现:连接串口、设置串口通信的参数、发送和接收返回值这几个操作,下面要做的就是给大家介绍如何利用python的pyserial库来实现这个操作。

二、使用步骤,两种例子

1.前期准备,确保串口功能无异常

在使用python的pyserial库时,我们可先用我们的串口调试工具确认串口指令功能是否正常,而后再进行下一步的调用实验,避免因串口功能异常,影响正常的代码编写。
RS232与window电脑的连接方式

2.python调用pyserial库发送字符串指令

import time
import serial

#RS232指令,使用一个字典,把需要被操作的RS232命令封装到一起
RS232_Command = {
    
    
    'command1_utf8': 'DCBA',
    'command2_utf8': 'ABCD',
}

#把字符串类型转换为bytes数据流进行发送,RS232命令发送函数
def serial_sent_utf(command):
	#从字典里获取对应的RS232命令
    var = RS232_Command["%s" % command]
    #encode()函数是编码,把字符串数据转换成bytes数据流
    ser.write(var.encode())
    data = ser.read(10)
    # 获取指令的返回值,并且进行类型转换,转换为字符串后便可以进行字符串对比,因而便可以根据返回值进行判断是否执行特定功能
    data = str(data, encoding="utf-8")
    return data

if __name__ == '__main__':
    #实现串口的连接
    ser = serial.Serial('COM7', 115200, timeout=3)
    command1_utf8 = serial_sent_utf('command1_utf8')
    command2_utf8 = serial_sent_utf('command2_utf8')
    

(1)连接串口
连接方法与使用串口调试助手的连接是一样的,window系统PC的USB口通过USB转RS232线连接上嵌入式设备的RS232接口。
(2)设置串口通信的参数
连接上串口,使用串口调试助手测试过自己的RS232指令无误后,便可以进行我们的python编码。给我们的python安装好pyserial库,并导入python代码中,便可开始我们的编码:

第一步:使用 ser = serial.Serial(‘COM7’, 115200, timeout=3) 函数实现串口端口的连接,这里的COM7为PC连接嵌入式设备的USB端口号,115200为串口的波特率,timeout为连接超时。

第二步:连接上串口后,命令的发送,这边编写了一个简单的函数:serial_sent_utf(command),使用var = RS232_Command[“%s” % command]把需要发送的RS232命令赋值给 var,然后通过pyserial库里面的 ser.write(var.encode())函数发送到嵌入式设备,这里要注意 var.encode(),因为这里我们发送的RS232命令为字符串格式数据,但一般发送到嵌入式设备的数据是比特流格式,所以这边使用encode()函数进行编码,把发送的数据变成比特流发送。

第三步:发送了RS232命令后,一般都会有返回值,这里我们可通过pyserial库里面的data = ser.read()函数获取返回值,并把返回值赋值给data,使用read()相关函数时要注意避免出现一直读取返回值的情况。这里获取到的数据格式也是比特流数据,所以为了便于后续对返回值的判断等操作,这里加入了函数str(data, encoding=“utf-8”)对data的数值格式进行了转换,转换成utf-8的格式数据。

3.python调用pyserial库发送HEX指令

import time
import serial

#RS232指令,使用一个字典,把需要被操作的RS232命令封装到一起
RS232_Command = {
    
    
    'command_hex1': '6B 30 31 73 50 32 30 31 0D',
    'command_hex2': '6B 30 31 73 50 32 30 30 0D',
}

#把16进制的数据转换为bytes数据流进行发送,RS232命令发送函数
def serial_sent_hex(command):
    #bytes.fromhex(),使用这个函数进行数据转换,可以把16进制的数值转换字节数据(即比特流,字符串与比特流间还可以用encode()和decode()进行编解码)
    var = bytes.fromhex(RS232_Command["%s" % command])
    ser.write(var)
    data = ser.read(10)
    # 获取指令的返回值,并且进行类型转换,转换为字符串后便可以进行字符串对比,因而便可以根据返回值进行判断是否执行特定功能
    data = str(data, encoding="utf-8")
    return data

if __name__ == '__main__':
    #实现串口的连接
    ser = serial.Serial('COM7', 115200, timeout=3)
    command_hex1 = serial_sent_hex('command_hex1')
    command_hex2 = serial_sent_hex('command_hex2')
    

发送字符串命令与发送HEX格式命令的原理是一样的,唯一的不同地方就是其对发送的数据类型的不一样,发送HEX格式的命令,这里用了var = bytes.fromhex(RS232_Command[“%s” % command]),这里使用了bytes.fromhex()函数把hex的数据类型转换成比特流数据。


4、总结

综上所述,在对串口库的使用过程中,要特别留意对发送数据的处理:要根据实际情况进行数据转换,把字符或HEX格式数据转换成bytes数据流发送。实际上python的pyserial库不仅仅只有以上介绍的几个函数,这里用到的函数:serial.Serial(‘COM7’, 115200, timeout=3)、ser.read(10)、ser.write(var)都只是基本的串口功能函数,在面对更复杂的情况时,可自行查阅pyserial库的函数介绍,根据实际情况编写更合适的脚本,封装出属于自己的串口发送的类函数。

扫描二维码关注公众号,回复: 17259219 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_46166916/article/details/125570612