You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 06:54:05