python中的高速uart

时间:2016-11-08 00:16:45

标签: python uart highspeed

我有一个微控制器,通过UART以3 MBaud发送数据。微控制器每8000字节发送一个启动/状态字节。我喜欢我的python脚本来读取所有数据并分析起始字节之间的数据。

我知道Python能够处理3 MBaud,因为该代码片段显示了起始字节的正确位置:

ser =  serial.Serial('COM3', 3000000, timeout=None)

_RawData = ser.read(100000)

for cnt in range(0, 100000, 1):
    #search for start byte and print the position    
    if(_RawData[cnt] < 128): print(cnt)

但是我需要经常读取数据流,在这个例子中,我在&#34; ser.read(x)&#34;之间丢失了数据。命令。所以我需要在阅读流时比较数据:

ser =  serial.Serial('COM3', 3000000, timeout=None)

_RawData = []
cnt = 0

for c in ser.read():   
    cnt += 1 
    #search for start byte    
    if(c < 128):
        #print start byte position
        print(cnt)

        # -= start thread =-

        _RawData.clear()
    _RawData.append(c)

但是发现读取单个字节对于该波特率来说太慢,起始字节位置实际上是随机生成的。有没有办法可以读取我的数据流而不会丢失?

1 个答案:

答案 0 :(得分:1)

我设法让它为我工作。正如在其他线程中所建议的,我实现了函数ser.inWaiting(),它给出了在输入缓冲区中等待的字节数(在我的系统上限制为4096字节)并从uart读取该数量。然后我查找了起始字节并启动了一个线程来分析数据:

ser =  serial.Serial('COM3', 3000000, timeout=None)
_RawData = []

while True:
    #get data in input buffer
    bytesToRead = ser.inWaiting()
    Buffer = ser.read(bytesToRead)

    for cnt in range(0,bytesToRead,1):
        #search for start byte   
        if(Buffer[cnt] < 128):
            #print bytes between start bytes
            print(len(_RawData))

            # -= start thread =-

            _RawData.clear()

        _RawData.append(Buffer[cnt])

    #wait a short time for the buffer to fill    
    time.sleep(0.001)

这似乎现在有效。谢谢你的帮助。