我正在使用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
答案 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