Arduino和Python之间的回声程序

时间:2010-02-24 23:40:40

标签: python embedded arduino pyserial

我想通过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 个答案:

答案 0 :(得分: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来阻止它。

答案 1 :(得分:3)

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

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

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

该过程将允许您缩小问题范围。一旦你验证了它们,它们应该很好地协同工作。

串口监视器

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

答案 2 :(得分:0)

您是否需要从任何保留的串行缓冲区中清除已发送的字符?

可能是你的角色实际上没有离开COM端口并到达Arduino。当您使用Arduino终端进行测试时(我假设您的意思是开发环境中的UI终端),您实际上是在发送字符串+回车符,而不仅仅是字符。 (即你在测试中输入“z”后是否点击了返回?)

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

答案 3 :(得分:0)

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