Arduino与Python之间的回声程序
我想通过Python里的pyserial库把一些数据发送到Arduino上。我希望Arduino能从串口读取可变长度的字符串数据,然后再把这些数据写回去,这样Python就能读取到。不过我一直没能做到,所以下面的代码只让Python发送了一个字符。以下是Python的代码:
import serial
import sys
import pywapi
import time
def main():
ser = serial.Serial(3, 9600, timeout=1)
print "Conn established"
print "Sending: %s" % "z".__repr__()
print ser.write('z'.encode("ascii"))
time.sleep(2)
print "Received: %s" % ser.read(10).__repr__()
ser.close()
这是Arduino的代码:
void setup(){
analogReference(DEFAULT);
Serial.begin(9600);
}
void loop(){
if(Serial.available() > 0)
Serial.println("x");
while(Serial.available() > 0){
Serial.print(Serial.read(), BYTE);
}
}
输出结果:
Conn established
Sending: 'z'
1
Received: ''
我知道Arduino的代码是有效的,因为当我从Arduino终端发送数据时,它能正常工作。但是一旦我尝试从Python发送任何东西,它就失败了。我今天一直在为这个问题苦恼,任何帮助都将非常感激。
4 个回答
你需要把发送的字符从任何保留的串口缓冲区中清除吗?
可能你的字符实际上并没有离开COM端口,也没有到达Arduino。当你用Arduino终端测试时(我想你指的是开发环境中的用户界面终端),你实际上是在发送你的字符串加上一个回车符,我觉得,而不仅仅是那个字符。(也就是说,你在测试时输入'z'后,是不是按了回车?)
试试ser.flush(),或者也可以发送一个\r字符。从你的测试来看,Arduino工作得很好,问题出在Python程序上,它似乎没有发送任何东西。
我建议你分别检查这两个部分,可以使用电脑上的一个独立串口和串口通信软件。
比如,如果你的电脑有两个串口,可以用一个空调制(回环)电缆把它们连接起来。或者使用com0com来创建一对链接的虚拟串口。在一个串口上运行你的Python软件,在另一个串口上运行一个终端程序(比如Hyperterminal或RealTerm)。这样你就可以手动检查Python程序的运行情况。
然后,像往常一样把电脑直接连接到Arduino上,使用终端软件手动检查Arduino软件的运行情况。
这个过程可以帮助你缩小问题的范围。一旦你确认它们都正常工作,它们应该可以很好地配合。
串口监控器
你还可以使用一种软件,它可以接入电脑的串口驱动,帮助你监控串口上的数据传输。我以前使用过HHD Software的免费串口监控器,效果很好。它可以监控电脑上的任何串口,并显示一个日志(十六进制和文本格式),记录串口上双向传输的数据。
试着增加或者去掉超时时间,同时把读取的大小设置为1。你也可以考虑增加休眠的时间,或者干脆实现一个简单的读取循环。
可以像这样做:
try:
while True:
data = ser.read(1).__repr__()
if data:
print "Received: %s." % data
else:
print "Looping."
except KeyboardInterrupt:
print "Done."
except:
raise
finally:
ser.close()
print "Closed port."
然后只需要按下ctrl-c就可以停止它了。