Python 2.7 pySerial read()返回Python解释器中的所有字符,但不返回Python脚本。还需要强大的读取方式,直到缓冲区为空

时间:2015-08-10 03:03:25

标签: python-2.7 pyserial

我正在与微控制器通信,每当您打开其串行端口时,微控制器会自动初始化其闪存。因此,在串行端口读取时,微控制器最多可打印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()

1 个答案:

答案 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

根据您的微控制器,您可以大大减少这些超时值,并且仍然具有相当强大的解决方案,可以从微控制器中检索所有启动数据。