PySerial 读取 Arduino 行数据的延迟
我正在使用Arduino Uno,按照这里的基本“DigitalReadSerial”设置进行操作: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()
有没有人有什么想法?
4 个回答
我刚遇到过同样的问题,我可以肯定PySerial没有延迟。
延迟是因为我在PyQT线程中的延迟。我在Arduino上每0.1秒通过串口打印一行,但我在QThread中读取串口输出时却有0.5秒的延迟,这就是问题所在。随着时间的推移,这个延迟会越来越大。
我通过从我的项目中提取pyserial的读取代码来验证了这一点。记住,读取的频率不能低于写入的频率。
从你的代码来看,我猜你的Python环境可能不够快,无法及时接收Arduino的数据。
试着在两次打印之间插入一个小延迟,来减慢串口打印的速度。
你在Arduino代码里用的是Serial.print
还是Serial.println
呢?如果你用的是前者,也就是Serial.print
,那么它不会自动换行,而你的代码里的ser.readline()
会一直等着换行符。
这看起来像是一个缓存或同步的问题,类似于常见文件系统中影响文件同步的那些问题。我在使用我的Arduino和pyserial的时候也遇到过这个问题……直到现在?
根据这个链接 http://pyserial.sourceforge.net/pyserial_api.html,如果我在我的程序里加入三个清空命令:ser.flush()、ser.flushInput() 和 ser.flushOutput(),那么它似乎就能按预期工作了。