如何在python中一致地从串行打印数据

如何在python中一致地从串行打印数据,python,macos,arduino,Python,Macos,Arduino,我正试图打印从Arduino系列中获得的数据,但我无法打印。我的尝试代码如下: import serial import time s = serial.Serial('/dev/tty.usbmodemfd141',9600) while 1: if s.inWaiting(): val = s.readline(s.inWaiting()) print val 然而,在大约30行被吐出后,我得到以下错误消息: Traceback (most recent c

我正试图打印从Arduino系列中获得的数据,但我无法打印。我的尝试代码如下:

import serial
import time
s = serial.Serial('/dev/tty.usbmodemfd141',9600)

while 1:
   if s.inWaiting():
      val = s.readline(s.inWaiting())
      print val
然而,在大约30行被吐出后,我得到以下错误消息:

Traceback (most recent call last):
  File "py_test.py", line 7, in <module>
    val = s.readline(s.inWaiting())
  File "build/bdist.macosx-10.8-intel/egg/serial/serialposix.py", line 460, in read
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected?)
回溯(最近一次呼叫最后一次):
文件“py_test.py”,第7行,在
val=s.readline(s.inWaiting())
文件“build/bdist.macosx-10.8-intel/egg/serial/serialposix.py”,第460行,已读
serial.serialutil.SerialException:设备报告已准备好读取,但未返回任何数据(设备已断开连接?)

我想我没有正确地使用inWaiting,但我不知道如何以其他方式使用它。

您是否尝试过将读线包装到try/except SerialException块中?然后可以传递SerialException。当接收缓冲区中没有数据时,串行驱动程序可能会报告数据,在这种情况下,代码将继续运行。这不是一个很好的解决方案,但它可能会引导您找到正确的解决方案

try:
    s.read(s.inWaiting())
except serial.serialutil.SerialException:
    pass # or maybe print s.inWaiting() to identify out how many chars the driver thinks there is

我相信您希望使用函数read(),而不是readline()。您正在检索缓冲区中的字符数,它们不一定以新行结尾

您的循环变成:

while 1:
   if s.inWaiting():
      val = s.read(s.inWaiting())
      print val

如果您只想打印串行连接设备中的数据,您可以 只需使用readline()即可。 首先使用open()打开端口,然后需要使用readline()

注意:/dev/ttyUSB0是linux的端口号,com0是windows的端口号

这是密码

导入序列号
波特率=115200
设备名称=“ttyUSB0”
tty=设备名称
s=串行。串行(“/dev/”+tty,波特率=波特率)
s、 开()
印刷品
尝试:
尽管如此:
line=s.readline()//在此之后,还可以在导入时间模块之前将睡眠时间作为time.sleep(1)指定。
打印行
最后:
s、 关闭()

SerialException实际上导致了另一个错误,因为Python说该异常不存在。不过,如果我只是将其作为一个异常,而没有标记为exception,那么它仍然有效。哦,对不起,您必须完全限定SerialException的名称空间。我更正了上面的代码。另外,下面的poster@TomK是正确的,您只需读取()以获取接收缓冲区中的字节数。行缓冲读取可能不合适。我仍然有兴趣知道当您发生此异常时有多少个字符处于“inWaiting”状态(在exception块中打印s.inWaiting())