2010-02-24 311 views
4

我想通过Python中的pyserial发送一些数据到Arduino。我希望Arduino所做的就是从串口读取可变长度的字符串数据,并将其写回以便Python可以读取它。由于我一直无法做到这一点,下面的代码只有Python发送字符。这里的Python代码:Arduino和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发送任何东西的时候,它就会失败。我一整天都在苦苦挣扎。任何帮助将不胜感激。

+0

“奇怪的结果”是什么意思?也许这是一个握手问题 – 2010-02-24 23:53:36

+0

对不起,奇怪的结果意味着我在这里发布的东西,即没有。 – JohnS 2010-02-25 00:48:54

+0

什么是您的操作系统? Windows或* nix? – Earlz 2010-02-25 19:07:11

回答

3

尝试增加或删除超时值,并将读取大小设置为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停止它。

+0

出于某种原因,第一次阅读总是返回''。在为测试目的而实现第二次读取之后,它开始工作(尽管在python程序启动时我仍然必须进行虚拟读取)。 – JohnS 2010-02-27 22:52:52

+0

也许它与“Serial.println(”x“);”在Arduino代码中。 Python应用程序是否打印您在连接时发送的'x'?如果不是,那么Python应用程序正在拾取在'x'之后发送的换行符。或者,如果您仍然在Python串行连接上设置超时,读取可能会超时。 – 2010-02-28 05:55:08

3

我会建议使用PC上的一个单独的串行端口和串行通信软件独立验证这两个部分。

E.g.如果您的PC有两个串行端口,则使用空调制解调器(环回)电缆连接它们。或使用com0com制作一对链接的虚拟串行端口。在一个串口上运行你的Python软件,在另一个串口上运行终端程序(Hyperterminal或RealTerm)。手动验证Python程序的操作。

然后,像往常一样直接将PC连接到Arduino,并使用终端软件手动验证Arduino软件的操作。

该过程将允许您缩小问题的范围。一旦你证实了他们两人,他们应该一起工作。

串行端口监视器

另一个可以使用的方法是软件,挂接到PC的串口驱动程序,并允许您监视串行端口的流量。我以前使用过HHD Software公司的Free Serial Port Monitor软件,它对我们的目的非常有效。它允许您监视任何PC的串行端口,并向您显示在两个方向上通过端口的串行数据的日志(十六进制和文本)。

0

您是否需要将发送的字符从任何保持的串行缓冲区中清空?

这可能是你的角色实际上并没有离开COM端口并到达Arduino。当你用Arduino终端(我假设你是指开发环境中的UI终端)进行测试时,你实际上正在发送你的字符串+我想的回车符,而不仅仅是字符。 (即,在测试中键入'z'后,您是否打回来?)

尝试ser.flush()或者也可以发送\ r字符。从你的测试Arduino工作得很好,它是似乎没有发送任何东西的Python程序。

0

您可能需要发送两次的原因是,如果您通过USB连接,第一个串行连接将重置Arduino。