也许我误解了你的问题,但由于它是一条串行线路,你必须按顺序读取从 Arduino 发送的所有内容 - 它会在 Arduino 中缓冲,直到你阅读它。
如果您想要一个状态显示来显示最新发送的内容 - 使用一个包含您问题中的代码的线程(减去睡眠),并将最后一个完整的行读取为 Arduino 的最新行。
更新: mtasic
的示例代码非常好,但是如果 Arduino 在inWaiting()
被调用时发送了部分行,你会得到一个截断的行。相反,您要做的是将最后一个完整行放入last_received
中,并将部分行保留在其中,buffer
以便可以将其附加到下一次循环中。像这样的东西:
def receiving(ser):
global last_received
buffer_string = ''
while True:
buffer_string = buffer_string + ser.read(ser.inWaiting())
if '\n' in buffer_string:
lines = buffer_string.split('\n') # Guaranteed to have at least 2 entries
last_received = lines[-2]
#If the Arduino sends lots of empty lines, you'll lose the
#last filled line, so you could make the above statement conditional
#like so: if lines[-2]: last_received = lines[-2]
buffer_string = lines[-1]
关于使用readline()
:这是 Pyserial 文档必须说的(为了清楚起见,稍作编辑,并提到了 readlines()):
使用“readline”时要小心。打开串口时一定要指定超时,否则如果没有收到换行符,它可能会永远阻塞。另请注意,“readlines()”仅适用于超时。它取决于超时并将其解释为 EOF(文件结尾)。
这对我来说似乎很合理!