我正在努力在我的 Linux(fedora 20/64bit)上通过 USB 串行与外围设备建立通信,并且我可能缺少一些步骤:
我连接了设备,/dev/ttyUSBx 端口正确显示。我使用 python/pySerial 来驱动它,但每次重置连接时,我从串行端口读取的只是一个零字节(“\x00”),而不是设备应该给我的答案。
我尝试过不同的串行转 USB 适配器、不同的串行电缆,甚至在另一端使用不同的外围设备(和型号)。使用基于 Windows 的闭源程序与外围设备通信,一切似乎都运行良好。
以下是我正在尝试的一个典型会话:
>>> import serial
>>> s = serial.Serial("/dev/ttyUSB0", timeout=.1)
>>>
>>> s.flush()
>>> s.write("(&S)")
4
>>> s.read()
'\x00'
>>>
(这里我应该得到一个几个字符长度的字符串作为响应,而不是“\x00”。 (该设备通过 TCP/IP 正确回答了相同的协议)。
我是否遗漏了串行端口上的某些配置步骤?这是我的 setserial 输出:
/dev/ttyUSB0, UART: unknown, Port: 0x0000, IRQ: 0, Flags: low_latency
Pyserial 配置如下:
Serial<id=0x7f525c5daf10, open=True>(port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=0.1, xonxoff=False, rtscts=False, dsrdtr=False)
(这些参数与设备工作的 Windows 上配置的串行端口上显示的参数相同 - 但超时除外)
答案1
已修复它 - 我必须与设备供应商核实 - 这是协议上设备设置的问题 - 必须使用 DTR 处于活动状态且 RTS 处于非活动状态的串行端口 - 对于与硬件端一起使用的人来说,这些可能是显而易见的尝试,但对于习惯于更高级编码的开发人员来说并非如此。
事实是,欺骗了我,由于没有关于什么是什么的文档,我误将Python 的 PySerial Serial 对象上的rtsdtr
和rtscts
参数与实际的 DTR 和 RTS 引脚设置混淆 - 并且更改这两个参数没有任何效果。
调用方法
serial_.setDTR(True)
serial_.setRTS(False)
实际上是设置端口上的引脚,并使与该设备的通信成为可能。