Pyserial非民意调查

时间:2013-12-31 05:10:12

标签: python serial-port pyserial

我正在使用Pyserial(一个Python串口库)从树莓派上的串口读取十六进制数据,操作系统是无懈可击的。

我需要每次从串口读取一个字节,并立即处理数据而不会有任何时间延迟。我现在这样做的方式就是轮询,不断从循环内的端口读取。问题是它占用了近95%的CPU,并使其他过程变慢。

我相信有一种更好的方法可以在不使用太多CPU资源的情况下实现这一目标。我使用'minicom'监控串口,并没有占用太多CPU。所以我想知道熟悉Pyserial的人可以帮助我,或者任何人都可以告诉我minicom是如何做到的。

这是我的代码。非常感谢

while True:
    try:
        reading = ser.read().encode('hex')

        if reading == "":
            continue

        #always add to packet when it's not empty
        data_packet.append(reading)

        if check_byte == True:
            #sometimes, check byte could be 2a
            check_byte = False
            continue
        elif length_byte == True:
            #this byte is length
            packet_length = int(reading, 16)
            length_byte = False

        if packet_length == 0 and hex_equals(reading, "2a"):
            #start of a string
            #next byte is length
            length_byte = True
        elif packet_length > 0:
            packet_length -= 1
        elif hex_equals(reading, "23"):
            #end of packet
            data_packet_handle = data_packet
            data_packet = []
            handle_data(data_packet_handle)
        elif packet_length == 0:
            #if it's zero, the packet is over, but still have check and ending character
            #next byte is check byte
            check_byte = True
    except Exception, err:
        pass
        print Exception, err

1 个答案:

答案 0 :(得分:2)

我刚解决了自己的问题。

以前,我设置'timeout = 0',因此它会不断检查串口。

现在我设置'timeout = None',它会等到有足够数据来自串口。现在CPU使用率仅在有来自串口的数据时使用,而且不是那么多。

以下是打开串口的代码:

ser = serial.Serial(port=serial_port, baudrate=2400, bytesize=8, parity='N', stopbits=1, timeout=None)  # open first serial port