Python读取RS232串口数据存CSV失败:无法获取有效数据求助
解决方案
1. 修正基础代码问题
你的代码存在几个可直接调整的基础问题:
- 你打印的
rs232.isOpen是方法对象,pyserial 3.5推荐用is_open属性判断串口状态 - 代码未显式导入
time模块,会导致time.sleep(1)报错(你运行时无报错应该是实际代码已补充,但需明确写出) - 用
inWaiting()读取当前缓冲区字节数,容易拿到不完整的数据包;你的目标是读取整行文本,应改用readline()
2. 匹配设备串口参数
RS232通信必须保证波特率、奇偶校验、停止位、字节数与发送端完全一致,默认的8N1(8位数据位、无校验、1位停止位)不一定适配你的设备。先确认设备的通信参数,比如设备是偶校验则设置parity='E',停止位为2则设置stopbits=2。
3. 完整实现代码(含CSV定时写入)
以下代码针对你的需求优化,实现按行读取串口数据、每5秒批量写入CSV:
import serial import time import csv # 配置串口参数,根据设备实际情况调整 ser = serial.Serial( port='COM6', baudrate=115200, parity='N', # 替换为设备的奇偶校验:N无/E偶/O奇 stopbits=1, # 替换为设备的停止位:1/1.5/2 bytesize=8, # 替换为设备的字节数:5/6/7/8 timeout=1 ) # 初始化CSV相关变量 csv_file = open('serial_data.csv', 'a', newline='', encoding='utf-8') csv_writer = csv.writer(csv_file) last_write_time = time.time() data_buffer = [] try: if ser.is_open: print("串口已打开,开始读取数据...") while True: # 读取一行数据并解码为字符串 raw_data = ser.readline() if raw_data: try: # 优先用ASCII解码,若有特殊字符可改用'ISO-8859-1' line = raw_data.decode('ascii').strip() if line: # 过滤空行 print(f"收到数据:{line}") data_buffer.append(line.split()) # 按空格拆分存入缓冲区 except UnicodeDecodeError: print(f"解码失败,原始数据:{raw_data}") # 每5秒批量写入一次CSV current_time = time.time() if current_time - last_write_time >= 5 and data_buffer: csv_writer.writerows(data_buffer) csv_file.flush() # 强制写入磁盘避免数据丢失 print(f"已写入{len(data_buffer)}条数据到CSV") data_buffer = [] last_write_time = current_time time.sleep(0.1) # 降低循环频率,减少系统资源占用 finally: # 程序退出时关闭串口与文件 if ser.is_open: ser.close() csv_file.close() print("串口与文件已关闭")
4. 关键排查方向
- 先验证硬件通信:用串口调试工具(如Putty、串口助手)按相同参数连接COM6,确认是否能收到你示例中的文本数据。如果调试工具也收不到,说明是硬件连接(如串口线、设备供电)或设备端的问题,与Python代码无关。
- 编码适配:如果解码报错,尝试改用
raw_data.decode('ISO-8859-1'),部分设备可能用非ASCII编码发送数据。 - 流控制设置:如果设备启用了RTS/CTS或XON/XOFF流控制,需在
serial.Serial中添加rtscts=True或xonxoff=True。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

