我用python2.7在windows10上运行pyserial(3.1.1)
更新-在Xubuntu16和Windows上运行相同的问题。在
我正在通过usb/串行接口,通过串行接口向arduino nano写入数据。在
我正在编写一个简单的字符串(例如“2+”)并读取arduino中的输出。如果我保留第一个时间。睡觉在打开com端口2秒后,它开始工作。如果我将其更改为1或将其删除,则arduino似乎收到了不同的字符/编码,并且它不起作用。在
理想情况下,我不想睡觉,这样可以更快地工作。我是不是做错了什么事,或者有更好的方法来消除睡眠或者至少减少睡眠?在
Python代码:
import sys, getopt
import time
import serial
ser = serial.Serial(
port='COM3',
baudrate=9600,
parity=serial.PARITY_ODD,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.SEVENBITS
)
time.sleep(1) #change this to 2 and it works
ser.write('2+')
out = ''
time.sleep(1)
while ser.inWaiting() > 0:
out += ser.read(1)
if out != '':
print ">>" + out
else:
print ">> nothing!"
time.sleep(1)
ser.close()
Arduino代码(我对ASCII字符号也有一些小问题-我认为是字节的签名,但这是目前我遇到的最小问题)
^{pr2}$}
打开串行连接时,是否可能自动重置Arduino?在
在Arduino Nano中,复位引脚通过C4连接到FTDI USB到串行转换器的DTR。见Arduino Nano Schematic。在
也许如果你移除C4或禁用DTR,你的问题就会消失。在
您可以通过在setup函数中输入一个短的LED脉冲来检查这一点,看看它是否在从Python程序打开串行端口之后发生。在
你假设如果有数据,那就是完整的数据。如果在传输部分对串行端口的处理方式有缓冲,则只能获得部分数据。在
您可以尝试在python代码中添加一个
ser.flush()
,但也应该检查所接收到的数据是否完整。您可以通过确保您的数据以已知字符结束并进行检查来做到这一点。在请记住,您还应该有某种类型的超时,这样您就不会陷入某个读取循环中。在
另一个问题是,您正在读取}的大小为2个字节,所以这可能就是为什么您会得到奇怪的东西(有一个引用here)。在
char
类型,但是Serial.read()
实际上返回了一个int
,根据{a1}。char
数据类型的大小为1个字节,而{它还说
read
将只返回数据的第一个字节。所以,如果你想要第二个字节,你需要读两次。在我找不到任何解决睡眠问题的方法。只有在至少允许1.5秒的情况下,arduino才会正确地接收到字节-大概是为了串行连接初始化。在
作为一种解决方法,我必须在启动时打开串行端口,然后通过套接字服务器接受和写入数据。这一招如期而至。问题似乎出在串行端口的打开上。在
相关问题 更多 >
编程相关推荐