PySerial 客户端无法写入数据
Posted
技术标签:
【中文标题】PySerial 客户端无法写入数据【英文标题】:PySerial client unable to write data 【发布时间】:2015-06-23 09:52:16 【问题描述】:我正在尝试编写一个 python 程序,它可以使用 PySerial 模块通过串行接口进行通信,如下所示:
import serial
if __name__ == '__main__':
port = "/dev/tnt0"
ser = serial.Serial(port, 38400)
print ser.name
print ser.isOpen()
x = ser.write('hello')
ser.close()
print "Done!"
但如果我执行上述操作,我会收到以下错误:
/dev/tnt0
True
Traceback (most recent call last):
File "/home/root/nested/test.py", line 15, in <module>
x = ser.write('hello')
File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 518, in write
raise SerialException('write failed: %s' % (v,))
serial.serialutil.SerialException: write failed: [Errno 22] Invalid argument
我参考了 pyserial 文档,根据该文档,这应该可以正常工作。请让我知道我在这方面做错了什么。 蒂亚!
【问题讨论】:
如果你在终端中执行这个会发生什么:echo "test" > /dev/tnt0
?
它给了我同样的错误! bash: echo: write error: Invalid argument
我正在使用tty0tty
串口来模拟串口,因为我的机器没有串口...
显然,/dev/tnt0
不是串口设备。仅供参考,串行设备通常具有名称 /dev/ttyX
或 /dev/ttySX
,但不是必需的。
有没有办法像设备一样模拟机器上的串行端口?即使它只是充当回显服务器并在屏幕上打印客户端发送给它的任何内容......这应该足以测试我的程序......
不确定为什么 tty0tty 不起作用,但您可以尝试 socat:help.ubuntu.com/community/VirtualSerialPort 另外,请接受我的回答,因为它回答了您的问题.
【参考方案1】:
出于某种原因,为了使用模块tty0tty
,您需要同时打开/dev/tnt0
和/dev/tnt1
,或任何其他对(例如/dev/tnt2
和/dev/tnt3
)。
以下代码有效:
import time
import serial
def main():
vserial0 = serial.Serial(port='/dev/tnt0', baudrate=9600, bytesize=8, parity=serial.PARITY_EVEN, stopbits=1)
vserial1 = serial.Serial(port='/dev/tnt1', baudrate=9600, bytesize=8, parity=serial.PARITY_EVEN, stopbits=1)
n_bytes = 0
while n_bytes == 0:
vserial0.write('test')
n_bytes = vserial1.inWaiting()
time.sleep(0.05)
print vserial1.read(n_bytes)
if __name__ == '__main__':
main()
【讨论】:
感谢您为我节省了几个小时的故障排除时间。用 minicom 打开接收端立即解决问题。请注意,在您尝试编写之前,tty0tty 一直有效。即端口是可识别可打开的,但是除非接收端口打开,否则写入总是会失败。再次感谢。【参考方案2】:/dev/tntX
是模拟端口对,要成功执行读取或写入,您需要打开一对端口中的两个端口。
把它想象成一根管道——如果一端是封闭的,你将无法将数据推送过去。
【讨论】:
tnt0 到 tnt7 是 tty0tty 模拟端口 .. 并且它们在每个连续端口对都充当连接的空调制解调器时正常工作。以上是关于PySerial 客户端无法写入数据的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 上使用 pyserial 将串行数据写入 Arduino