我想通过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发送任何内容时,它失败了。我一整天都在苦苦挣扎。任何帮助将不胜感激。
答案 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。