PySerial:前 256 个字节的数据损坏

Posted

技术标签:

【中文标题】PySerial:前 256 个字节的数据损坏【英文标题】:PySerial: Data Corruption in first 256 Bytes 【发布时间】:2014-07-03 12:40:50 【问题描述】:

我正在使用 pyserial 处理一些通过 1.25MBaud 串行接口传输的数据。我正在使用一个非常简单的线程来收集数据:

class SerialReadThread(StoppableThread):

    def __init__(self, port):
        super(SerialReadThread, self).__init__()
        self.serial = s.Serial(
            port=port,
            baudrate=1250000, # 1.25 MBaud
            bytesize=s.EIGHTBITS,
            parity=s.PARITY_NONE,
            stopbits=s.STOPBITS_ONE,
            timeout=0.5 # Do not wait longer than a half second for next message
        )
        self.data = []

    def run(self):
        # Discard old Buffer Data
        self.serial.flushInput()
        #self.serial.read(256)
        while not self.stopped():
            data = self.serial.read(64)
            self.data.append(data)
            log.debug(":".join(":02x".format(ord(c)) for c in data))

如果我读取和处理数据,我总是在前 256 个字节中得到一个错误的字节。通常 8 字节的消息之一是 9 字节长,我不知道这个额外的字节来自哪里。如果我在启动接收器后启动发送器,则不会传输错误的字节。到目前为止,唯一可行的解​​决方案是在self.serial.read(256) 行中发表评论。之后,即使我读取大量数据也不会出现错误。

除了跳过第一条消息之外,还有其他解决方案吗?

【问题讨论】:

【参考方案1】:

这可能只是线路上的一些噪音。通常对于超过 115200 的波特率,您需要 2 个停止位,因此它将是:

stopbits=s.STOPBITS_TWO

【讨论】:

我不认为噪音。为什么在前 256 个字节中应该有噪音,而在这之后就再也没有?而且我不能只将停止位设置为两个,这与发件人指定的设置不匹配。 有寄生电感(I)和电容(C)之类的东西,因此当线路开始通过改变电压来改变 I 和 C 时,在传输开始时噪声会更大。基本上在传输开始时在线会有更大的振荡。为了证明或反驳,您需要数字示波器。但无论如何,根据我的经验,你需要 2 个停止位在这样的波特率 您也可以尝试购买质量好的USB线,但不能保证它会起作用,因为问题可能出在芯片的外围设备上。

以上是关于PySerial:前 256 个字节的数据损坏的主要内容,如果未能解决你的问题,请参考以下文章

使用 Arduino 和 PySerial 回显一系列字节

pyserial 中的 ser.write() 函数

pyserial中的ser.write()函数

获取 IllegalBlockSizeException:使用 rsa 时数据不得超过 256 个字节

运行 Pyserial 时出错

将小端序列中的4个字节转换为无符号整数