pySerial 3.3中read(n)的意外行为

时间:2017-04-29 10:39:40

标签: python serial-port embedded pyserial

我正在使用STM32F407_VG板编写一个项目,该板使用RS232连接在串行端口上发送不同大小(~400字节)的批量数据,这些数据必须写在文件上。在桌面端我使用python 3脚本和pyserial 3.3。

我已经尝试用 ser.read()读取单个字节,但我认为它太慢了,因为我丢失了一些数据。因此,我试图在批处理本身之前将批处理的大小作为整数发送,以减少开销,并在批处理和后续处理期间的时间间隔内将数据写入文件。

问题是:ser.read(n)以非常奇怪的方式运行,并且在读取批处理并且不返回时它会阻塞99%的次数。有时它也可以读取第一批并将其成功写入文件,但它会在第二次循环迭代时阻塞。这很奇怪,因为我可以使用ser.read(4)来获得零问题的批量大小,并且在收听启动信号时我在脚本开头使用ser.readline(),但我无法读取数据。

我确信数据存在并且形成良好,因为我使用逻辑分析仪进行了检查,并且我已经尝试过启用和禁用流量控制或在电路板和脚本上设置不同的波特率。我认为这可能是python的配置问题,但实际上我的想法已经用完了。

PYTHON SCRIPT CODE -SNIPPET

ser = serial.Serial(str(sys.argv[1]),           \
                int(sys.argv[2]),               \
                stopbits=serial.STOPBITS_ONE,   \
                parity=serial.PARITY_NONE,      \
                bytesize=serial.EIGHTBITS,      \
                timeout=None                    \
                )
outputFile = open(sys.argv[3],"wb")

# wait for begin string
beginSignal = "ready"
word = ""
while word != beginSignal:
   word = ser.readline().decode()
   word = sample.split("\n")[0]
print("Started receiving...")

while True:
   # read size of next batch
   nextBatchSize = ser.read(4)
   nextBatchSize = int.from_bytes(nextBatchSize,byteorder='little', signed=True)
   # reads the batch: 
   # THIS IS THE ONE THAT CREATES PROBLEMS
   batch = ser.read(nextBatchSize)
   # write data to file
   outputFile.write(batch)

董事会代码 - SNIPPET

// this function sends the size of the batch and the batch itself
void sendToSerial(unsigned char* mp3data, int size){
   // send actual size of the batch
   write(STDOUT_FILENO,&size,sizeof(int));
   // send the batch of data
   write(STDOUT_FILENO,mp3data,size);
}

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

您可能已经尝试过此操作,但打印出nextBatchSize以确认它是您所期望的,以防万一字节顺序颠倒。如果这是错的,你的Python代码可能会尝试读取太多字节,因此会阻塞。

此外,您可以检查ser.in_waiting以查看在尝试读取之前可从输入缓冲区读取的字节数:

print(ser.in_waiting)
batch = ser.read(nextBatchSize)

您还应该检查C代码中write()的返回值,即实际写入的字节数,如果有错误,则返回-1。 write()不保证写入给定缓冲区中的所有字节,因此可能仍有一些未写入。或者可能存在错误。

数据丢失表明存在流量控制问题。您需要确保在两端都启用它。您已经说过尝试过,但是在您发布的代码中没有启用它。如何在板端打开和配置串口?