【问题标题】:Error reading serial data transmission读取串行数据传输时出错
【发布时间】:2014-10-22 12:37:05
【问题描述】:

使用树莓派我在读取串行传输的数据时遇到问题。我的代码在另一台机器上测试时可以正常工作,但现在无法正常工作。

波特率为 9600,无奇偶校验,8 个数据位,1 个停止位,我希望程序处理可变长度的字符(有时 100K+)。代码阅读部分如下:

ser = serial.Serial('/dev/ttyAMA0', 9600, parity = serial.PARITY_NONE, timeout=1)

While True:
    data = ser.read(1)
    bytesToRead = ser.inWaiting()
    if bytesToRead:
       data = data + ser.read(bytesToRead)
       encodedData = data.encode('hex')

使用此代码,只要波特/奇偶校验/等与传输系统匹配,我是否应该能够将所有字符读取为十六进制?

【问题讨论】:

  • 之后您打算如何处理这些数据? data.encode('hex') 返回一串数字(不是数字)——这是你想要的吗?
  • 是的,我需要来自系统的十六进制,这样我就可以解码位数组/光栅数据。

标签: python serial-port raspberry-pi pyserial


【解决方案1】:
While True:
    data = ser.read(1) 

这会等待读取单个字符(由于 Serial 构造函数中指定的超时,在 1s 后超时)并将其存储在 data

    bytesToRead = ser.inWaiting()
    if bytesToRead:
       data = data + ser.read(bytesToRead)
       encodedData = data.encode('hex')

现在立即检查缓冲区中的任何其他字符 - 这通常为零。由于您以 9600 波特率运行,Python 通常会一次看到一个字符。因此,您的if bytesToRead 语句大部分是错误的,因为每个传入的字符都被上述ser.read(1) 消耗。

如果你只想单独处理每个字符,你可以这样做:

While True:
    data = ser.read(1) 
    if data:
       encodedData = data.encode('hex')

或者,如果您想继续将其添加到缓冲区,请使用以下内容:

data = ''
While True:
    bytesToRead = ser.inWaiting()
    if bytesToRead:
        data += ser.read(bytesToRead) 
        encodedData = data.encode('hex')
        if encodedData.startswith('1234deadb33f`):
            data = data[6:] # strip 6 chars from start of data

【讨论】:

  • 感谢您的回答!我将调整一些东西,让你知道它是否有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多