读取串行数据传输时出错

时间:2014-10-22 03:26:08

标签: python serial-port raspberry-pi pyserial

使用树莓派我在读取连续传输的数据时遇到问题。当我在另一台机器上测试时,我的代码工作正常,但现在不能正常工作。

波特率为9600 w /无奇偶校验,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')

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

1 个答案:

答案 0 :(得分:0)

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