我一直试图从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中的读取功能,以便它不会重叠"。我要试一试。