Python串口测试:pyserial

pyserial是Python平台下的串口操作库,它支持多平台,所以许多地方都能见到它。在串口测试任务中,我们用它来处理串口数据收发事务。

本文介绍它的基本用法。

1. 安装和导入包

$ pip install pyserial

import serial

2. 打开串口

# 如果初始化时信息完整,就自动打开串口,无需调用serial.open()
serial_port = serial.Serial(port='COM1', baudrate=115200, timeout=1)

# 如果初始化时信息不完整,需要手动打开串口
serial_port = serial.serial
serial_port.port = 'COM1'
serial_port.baudrate = 115200
serial_port.timeout = 1
serial_port.open()

这里的timeout参数以秒为单位,可以设置小数,比如0.01表示10ms。它可以用于有条件的数据接收,当接收条件一直无法满足时程序会暂停,等timeout超时程序强制返回,避免卡死。

3. 发送数据

msg = b'hello'
serial_port.write(msg)

数据格式必须是bytes类型,不能是字符串或整数数组。

4. 接收数据

# 接收指定数量的数据
serial_port.read(size=1)

# 接收一行(以'\r'或'\n'结尾)
serial_port.readline()

# 持续接收,直到遇到某个字符,或达到某个长度
serial_port.read_until(terminator='\r', size=None)

在芯片里处理串口数据,通常会关注串口接收中断,在回调函数中处理收到的数据,但在Python中没有硬件中断的概念,开发者不知道串口线上什么时候会有数据,当数据来临时候也不知道它有多长,什么时候结束,这一切都得在应用层去设计和协调。

当调用read函数,此时串口线上并没有数据,将返回b''空字节。

设计时需要考虑几个状态:

  • 开始接收数据,进入接收状态
  • 在接收状态持续接收
  • 触发停止条件,退出接收状态

对于测试项目,通常是Python发送一段数据,然后进入接收状态,在接收状态中持续调用接收函数,并检测数据内容。停止条件通常是一段特定的数据内容,当接收到的数据内容与停止条件匹配,就停止接收退出循环。

def seril_read()
	output = ''
	while True:
        _line = serial_port.readline()
        if _line == STOP_STRING:
            break
        if _line != b'':
            output += _line
            
	return output

5. 关闭串口

serial_port.close()

(完)