4

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

4 回答 4

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 停止它。

于 2010-02-25T01:00:50.687 回答
3

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

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

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

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

串口监视器

您可以使用的另一种方法是连接到 PC 的串行端口驱动程序的软件,并允许您监视串行端口上的流量。我过去曾使用过 HHD Software 的Free Serial Port Monitor软件,它非常适合我们的目的。它允许您监控 PC 的任何串行端口,并向您显示通过端口双向传输的串行数据的日志(十六进制和文本)。

于 2010-02-25T04:33:40.817 回答
0

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

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

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

于 2010-02-25T19:05:52.447 回答
0

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

于 2012-05-11T10:52:43.580 回答