不能多次写入同一个端口(pyserial)

Posted

技术标签:

【中文标题】不能多次写入同一个端口(pyserial)【英文标题】:Can't write multiple times to same port (pyserial) 【发布时间】:2018-02-28 12:59:27 【问题描述】:

已解决:dsrdtr=True 不应该用于软件,只能用于正在使用的硬件

您好,我正在尝试将电报写入串行端口,并且可以成功发送。如果我发送多个,则不会发生任何事情。脚本必须关闭,此时第一个电报被成功接收。

制造商建议在电报之间间隔 50 毫秒,即使间隔 > 5 秒仍然失败。

s = serial.Serial(
port='COM3',
baudrate=9600,
parity=serial.PARITY_ODD,
stopbits=serial.STOPBITS_ONE,
timeout=0,
bytesize=serial.SEVENBITS,
dsrdtr=True             
)

buttonUP=b'\x54\x30\x34\x0D'

s.write(buttonUP)
time.sleep(0.05)
s.write(buttonUP)
time.sleep(0.05)
s.write(buttonUP)

如果我写了

s.write(buttonUP)
s.close()
s.open()
s.write(buttonUP)

这可行,但关闭/打开造成的延迟对于我们的要求来说太长了。

是否有人对可能导致此问题的原因有任何想法?非常感谢您的帮助

【问题讨论】:

有没有尝试扫描串口数据看数据是否发送?您的数据可能已发送,但连接设备上的目标代码无法缓冲它或其他什么。 (?) 您的 DSR/DTR 状态是否正确? 我现在也在用 pyserial 做一个项目......我遇到了很多问题......但主要归结为提供的其他服务(在我的情况下为 rs485 连接)的问题你的界面设置没问题...我很想知道失败时的错误是什么?? 数据发送一次肯定发送。这可以通过读取端口并看到它控制的部件移动来确认。 @Procyclinsur 没问题,再次感谢您! dsrdtr=True 是问题所在,在提供的硬件上默认使用,但在使用软件时不应该使用 【参考方案1】:

如果您尝试使用readline() 函数从端口读取数据,则可能会出现问题,即您没有用换行符终止每条消息。尝试将其更改为

buttonUP=b'\x54\x30\x34\x0D\n' 

您可以阅读更多here

【讨论】:

如果终端设备需要一个可能相关的新行。但重新启动脚本会修复它。所以我认为这不是终端设备问题。我认为他正在处理写入问题。 不幸的是,更改并没有奏效 - 在未尝试从端口读取的情况下发生此问题。不过,感谢您的帮助,我会记住以后如何终止消息 我在想关闭连接可能会发送一个换行符。 不读怎么知道它不起作用? 因为它控制了发送buttonUP成功时移动的机械部件。运行脚本后,我会检查 s.read(9) 以查看它移动了多远

以上是关于不能多次写入同一个端口(pyserial)的主要内容,如果未能解决你的问题,请参考以下文章

pySerial:端口只工作第一个命令

如何使用 pyserial 将文件逐行写入 com0com?

Pyserial 不能很好地使用虚拟端口

使用pyserial测试usb到串口到usb没有输出

PySerial 丢失数据

重启后Pyserial的串行连接问题