回声计划中的Arduino和Python之间
题
我想通过pyserial在Python一些数据发送到一个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的失败。我这个整天一直在挣扎。任何帮助,将不胜感激。
解决方案
尝试增加或删除超时,并设置读取的大小为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将其停止。
其他提示
我建议独立地验证所述两个部分,在PC上使用一个单独的串行端口和串行通信的软件。
E.g。如果您的电脑有两个串行端口,然后使用一个零调制解调器(回环)电缆进行连接。或使用 com0com 使一对连接虚拟串行端口。一个串行端口上运行你的Python软件和终端程序的其它(HyperTerminal或 RealTerm )串行端口。手动验证Python程序的操作的方式。
然后,直接连接PC到Arduino像往常一样,并使用终端软件手动验证的Arduino软件操作。
这过程将允许您缩小问题。一旦你验证了他们两个,他们应该很好地协同工作。
<强>串行端口监视器强>
您可以使用另一种方法是软件,挂接到PC的串口驱动程序,并允许您监视串行端口的流量。我已经在过去使用的HHD软件的免费串行端口监视器软件,它我们的目的运作良好。它可以让你监视任何串行数据的PC的串行端口,并显示您日志(十六进制和文本)会在端口双向的。
你需要刷新SENT的性格任何手持串行缓冲器的?
这可能是因为你的性格是不是真正退出COM口,并在Arduino的到达。在测试此与Arduino的终端(我假设你的意思是在开发环境中的UI终端),你实际上是将您的字符串+回车,我认为,不只是人物。 (即你打回您在测试中键入“Z”之后?)
尝试ser.flush()或也许还发送一个\ r字符。从测试的Arduino工作得很好,它的Python程序,似乎没有被发送任何。
您可能要发送两次的原因是,如果你通过USB连接,第一个串行连接将重置Arduino的。