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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top