Pyserial无法阅读“大型”字样。多线程中的数据

时间:2014-07-30 16:13:47

标签: python windows multithreading buffer pyserial

我一直试图从Linux上将脚本移植到Windows,通过串口记录来自麦克风阵列的数据。 Linux版本使用Windows上不支持的termios模块,因此我使用Pyserial代替。

脚本启动三个threads,每个线程重复将~4MB数据放入队列。我的问题是,使用Pyserial,如果每个线程读取的数量超过4k接收buffer,则只有一个线程或者没有线程实际从.read()接收数据。下面是一个用于演示我的问题的小测试脚本。

numThreads = 3
readSize = 4128000
q = Queue.Queue()
comPort = serial.Serial(port = 'COM5', baudrate = 115200)

def read_task(port, threadID, readSize):
    q.put((threadID, comPort.read(readSize)))

threads = [threading.Thread(target=read_task, args=(i,) for i in range(numThreads)]
for t in threads:
    t.daemon = True
    t.start()

for t in threads:
    t.join()

while 1:
    try:
        _,item = q.get(False)
        print hex(ord(item[0]))
        print len(item)
    except Queue.Empty:
        break  

最后,我打印出每个队列元素的第一个字节的十六进制值。我这样做是因为我知道如果线程实际上正在读取数据,那么每个字节都将是一个非零值 所以输出看起来像是:

0x94
4128000
0x00
4128000
0x00
4128000  

因此,调用read的第一个线程能够读取数据而另外两个不能读取,只返回一个0x00的字符串。我能做些什么来让多个线程一次读取那么多数据。

我看了Pyserial在kernel32.dll中使用的serialwin32.py函数来执行.read()但是我没有使用win32 API的经验,而且我对python还不太新所以我无法确定从这里开始的地方。

我被告知尝试编辑serialwin32中的读取功能,以便它不会重叠"。我要试一试。

0 个答案:

没有答案