我正在与微控制器通信,每当您打开其串行端口时,微控制器会自动初始化其闪存。因此,在串行端口读取时,微控制器最多可打印10,000个字节的数据,显示地址及其初始值。您需要将端口保持打开以进行整个打印,以确保完成初始化。我不会执行任何写操作,只需读取。
我将pySerial缓冲区从4k修改为32k,因为我不希望读取之间有任何中断(后续读取只会重新启动init循环)。下面是我从微控制器串口读取的代码片段。当我从解释器运行这个片段时,我可以从print和sizeof告诉我temp包含所有9956个字节。但是当我运行py文件时,我只得到296个字节。我在read()之后插入了sleep()方法,但这没有任何效果。如果初始化完成,我无法从微控制器判断出来。
在串行缓冲区为空之前是否有一种强大的读取方式?微控制器映像是特定于应用程序的,因此我无法始终预测所需的read()大小或超时。
我能尝试什么想法?我搜索了其他主题,但没有找到任何特定于此问题的内容。
# Create serial port instance
self.ser_port = serial.Serial()
self.ser_port.port = 0
self.ser_port.timeout = 0
.
.
.
self.ser_port.open()
time.sleep(1)
temp = self.ser_port.read(32768)
time.sleep(4)
self.ser_port.close()
答案 0 :(得分:0)
超时为0表示pySerial立即返回任何已有的数据。如果您希望read()
等待允许更多数据进入,请使用非零超时。
第一个sleep()
可能会导致您丢失open
之后但read
之前的一些数据,因为内部缓冲区可能没有您所使用的缓冲区那么大传递给read()
。但这是高度依赖于应用程序的 - 如果您正在通信的设备在open()之后需要一段时间才能响应,那么它可能不是问题。
第二个sleep()
对您没有任何帮助,因为此时read()
已经完成。
请注意,超时值是等待的最长总时间。 read()
将在填充缓冲区时返回,或者在调用缓冲区后很长时间内返回,以先到者为准。
以下是一些在以下情况下将返回的示例代码:
a)没有数据的10-12秒
b)如果收到至少100个字节,则返回最后一个数据后2-4个静默秒
self.ser_port = serial.Serial()
self.ser_port.port = 0
self.ser_port.timeout = 2
.
.
.
self.ser_port.open()
timeout_count = 0
received = []
data_count = 0
while 1:
buffer = self.ser_port.read(32768)
if buffer:
received.append(buffer)
data_count += len(buffer)
timeout_count = 0
continue
if data_count > 100:
# Break if we received at least 100 bytes of data,
# and haven't received any data for at least 2 seconds
break
timeout_count += 1
if timeout_count >= 5:
# Break if we haven't received any data for at
# least 10 seconds, even if we never received
# any data
break
received = ''.join(received) # If you need all the data
根据您的微控制器,您可以大大减少这些超时值,并且仍然具有相当强大的解决方案,可以从微控制器中检索所有启动数据。