Arduino与Python之间的回声程序

4 投票
4 回答
4682 浏览
提问于 2025-04-15 19:42

我想通过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

你需要把发送的字符从任何保留的串口缓冲区中清除吗?

可能你的字符实际上并没有离开COM端口,也没有到达Arduino。当你用Arduino终端测试时(我想你指的是开发环境中的用户界面终端),你实际上是在发送你的字符串加上一个回车符,我觉得,而不仅仅是那个字符。(也就是说,你在测试时输入'z'后,是不是按了回车?)

试试ser.flush(),或者也可以发送一个\r字符。从你的测试来看,Arduino工作得很好,问题出在Python程序上,它似乎没有发送任何东西。

3

我建议你分别检查这两个部分,可以使用电脑上的一个独立串口和串口通信软件。

比如,如果你的电脑有两个串口,可以用一个空调制(回环)电缆把它们连接起来。或者使用com0com来创建一对链接的虚拟串口。在一个串口上运行你的Python软件,在另一个串口上运行一个终端程序(比如Hyperterminal或RealTerm)。这样你就可以手动检查Python程序的运行情况。

然后,像往常一样把电脑直接连接到Arduino上,使用终端软件手动检查Arduino软件的运行情况。

这个过程可以帮助你缩小问题的范围。一旦你确认它们都正常工作,它们应该可以很好地配合。

串口监控器

你还可以使用一种软件,它可以接入电脑的串口驱动,帮助你监控串口上的数据传输。我以前使用过HHD Software的免费串口监控器,效果很好。它可以监控电脑上的任何串口,并显示一个日志(十六进制和文本格式),记录串口上双向传输的数据。

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就可以停止它了。

撰写回答