我正在使用带有基本“DigitalReadSerial”设置的arduino uno,如下所示:http://arduino.cc/en/Tutorial/DigitalReadSerial
如果我使用arduino IDE附带的串行监视器,它会立即显示按下按钮后的任何更改。
这就是我想要的pyserial,取决于按钮是否按下0或1。 (最终触发计时器)
只是为了测试它,我把它扔在一起,而不是最漂亮,但它似乎读出了按钮状态,但是有20秒的延迟。
import serial
ser = serial.Serial()
ser.setPort("COM2")
ser.baudrate = 9600
ser.open()
while 1==1:
ser.readline()
有没有人有任何想法?
答案 0 :(得分:3)
它似乎是一个缓存/同步问题,类似于影响公共文件系统中文件同步的问题。我的arduino / pyserial遇到了这个问题......到现在为止?
从http://pyserial.sourceforge.net/pyserial_api.html开始,如果我在程序中放入3个flush命令:ser.flush(),ser.flushInput()和ser.flushOutput(),它似乎按预期工作。
答案 1 :(得分:1)
您是否在Arduino代码中使用Serial.print
或Serial.println
?如果是前者,它不会发出回车,代码中的ser.readline()
将等待一个。
答案 2 :(得分:1)
我刚遇到同样的问题,我确信PySerial没有延迟。
延迟是由我的PyQT线程延迟造成的。我通过arduino中的串口打印一行/ 0.1秒但我在QThread中读取串行输出,延迟时间为0.5秒,这就是问题。随着时间的推移,延迟会增加。
我通过从项目中提取pyserial读取代码来验证。请记住,读取频率不应低于写入频率。
从您的代码中,我假设您的python环境,如果不够快,无法及时从arduino接收数据。
尝试通过在两次打印之间插入一个小延迟来降低串行打印速度。
答案 3 :(得分:1)
只有在有东西要读的情况下才开始读取,否则它会在等待eol时阻塞,或者它可能会在读取串行缓冲区的一半时间超时,截断你的字符串。这样可以加快循环速度,并允许您使用短暂的超时,非常适合循环使用多个端口。使用pyserial3.0 ...
while 1:
if ser.in_waiting > 0:
data = ser.readline()
print(data)
还尝试类似
的内容while 1:
if ser.in_waiting > 0:
data = ser.read(32)
print(data)
如果缓冲区包含的字节数少于指定的字节,那么我有时会这样做,因为它会读取/清除缓冲区中已建立的额外数据。