2. 串口参数配置
任务说明
本案例要求实现一个串口参数配置工具,能够设置波特率、数据位、停止位、校验位,并验证不同参数组合下两台设备(或回环测试)能否正常通信。核心目标是:通过代码修改串口参数后,实际发送数据并确认接收端收到的内容与发送端一致,以此判定参数配置是否生效且通信正常。
实现方案
使用Python的pyserial库完成串口参数配置与通信测试。采用回环测试方式:将串口的TX与RX短接(或使用USB转串口模块的自收发模式),在同一台计算机上打开两个串口实例——一个作为发送端,一个作为接收端,分别配置相同参数后互发数据验证。若硬件不支持回环,可将两个USB转串口模块交叉连接(TX接RX,RX接TX,GND共地)。
代码实现
import serial
import serial.tools.list_ports
import time
# 可用串口参数组合(波特率, 数据位, 停止位, 校验位)
PARAM_SETS = [
(9600, 8, 1, 'N'),
(19200, 8, 1, 'E'),
(115200, 8, 2, 'N'),
(57600, 7, 1, 'E'),
]
def list_serial_ports():
"""列出所有可用串口"""
ports = serial.tools.list_ports.comports()
return [p.device for p in ports]
def configure_serial(port, baudrate, bytesize, stopbits, parity):
"""创建并配置串口对象"""
parity_map = {'N': serial.PARITY_NONE,
'E': serial.PARITY_EVEN,
'O': serial.PARITY_ODD}
bytesize_map = {5: serial.FIVEBITS, 6: serial.SIXBITS,
7: serial.SEVENBITS, 8: serial.EIGHTBITS}
stopbits_map = {1: serial.STOPBITS_ONE, 2: serial.STOPBITS_TWO}
ser = serial.Serial()
ser.port = port
ser.baudrate = baudrate
ser.bytesize = bytesize_map[bytesize]
ser.parity = parity_map[parity]
ser.stopbits = stopbits_map[stopbits]
ser.timeout = 2
return ser
def test_communication(tx_ser, rx_ser, test_data):
"""发送测试数据并验证接收内容"""
tx_ser.reset_input_buffer()
rx_ser.reset_input_buffer()
tx_ser.write(test_data)
time.sleep(0.1) # 等待数据到达
received = rx_ser.read(len(test_data))
return received == test_data, received
def main():
ports = list_serial_ports()
if len(ports) < 2:
print("错误:至少需要2个可用串口(或1个支持回环的串口)")
print("当前可用串口:", ports)
return
# 使用前两个串口,或同一串口回环
tx_port = ports[0]
rx_port = ports[1] if len(ports) > 1 else ports[0]
print(f"发送端: {tx_port}, 接收端: {rx_port}")
test_message = b"UART-Param-Test-123"
for baud, data_bits, stop_bits, parity in PARAM_SETS:
print(f"\n测试参数: 波特率={baud}, 数据位={data_bits}, "
f"停止位={stop_bits}, 校验位={parity}")
tx_ser = None
rx_ser = None
try:
tx_ser = configure_serial(tx_port, baud, data_bits,
stop_bits, parity)
rx_ser = configure_serial(rx_port, baud, data_bits,
stop_bits, parity)
tx_ser.open()
rx_ser.open()
if not (tx_ser.is_open and rx_ser.is_open):
print(" [失败] 串口打开失败")
continue
success, received = test_communication(tx_ser, rx_ser, test_message)
if success:
print(f" [通过] 发送 {len(test_message)} 字节,接收内容一致")
else:
print(f" [失败] 发送: {test_message}")
print(f" 接收: {received}")
except serial.SerialException as e:
print(f" [异常] {e}")
finally:
if tx_ser and tx_ser.is_open:
tx_ser.close()
if rx_ser and rx_ser.is_open:
rx_ser.close()
if __name__ == "__main__":
main()
运行与验证
依赖安装:
pip install pyserial
硬件准备:将USB转串口模块的TX与RX短接(回环模式),或使用两个模块交叉连接。将模块插入计算机USB口,确认系统识别出串口设备。
运行程序:
python uart_param_config.py
判定标准:程序依次测试4组参数组合,每组输出[通过]表示该参数配置下通信正常,发送与接收数据完全一致;输出[失败]或[异常]则说明该参数配置存在问题。全部4组均通过,即可确认串口参数配置功能正确且不同参数下通信均正常。
关键说明
- 程序自动检测可用串口,优先使用前两个;若只有一个串口,则自动使用同一串口进行回环测试(需硬件支持自收发)。
- 每组参数测试前会清空收发缓冲区,避免残留数据干扰判定。
- 校验位为
E(偶校验)时,若数据位设为8,部分硬件可能不支持,此时可改用7位数据位(代码中已包含该组合)。 - 若某组参数打开串口失败,程序会捕获异常并继续测试下一组,不会中断整个流程。