Linux 向设备发送串行消息,直到设备联机
我试图通过串行接口更新控制器固件。为此,我必须向控制器发送一条重新启动消息(没有问题),然后在控制器启动时发送另一条消息(字符“w”),以便它可以在写入模式下启动。通过minicom实用程序,可以在设备重新启动时连续按w键轻松完成此操作 我想改用python代码实现这一功能,但我不知道如何在设备启动之前发送消息而不引发异常(因为设备未连接) 这是我尝试过的,但它不起作用(使用pyserial): 这会产生以下错误:Linux 向设备发送串行消息,直到设备联机,linux,python-3.x,serial-port,pyserial,Linux,Python 3.x,Serial Port,Pyserial,我试图通过串行接口更新控制器固件。为此,我必须向控制器发送一条重新启动消息(没有问题),然后在控制器启动时发送另一条消息(字符“w”),以便它可以在写入模式下启动。通过minicom实用程序,可以在设备重新启动时连续按w键轻松完成此操作 我想改用python代码实现这一功能,但我不知道如何在设备启动之前发送消息而不引发异常(因为设备未连接) 这是我尝试过的,但它不起作用(使用pyserial): 这会产生以下错误: serial.serialutil.SerialException: devic
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
我还尝试在短时间内以循环方式发送消息,但遇到了相同的问题。如果找不到设备,是否有方法连续发送消息并忽略异常
任何帮助都将不胜感激
完全回溯:
Traceback (most recent call last):
File "mc_config.py", line 69, in <module>
set_firmware_version(sp,br)
File "mc_config.py", line 64, in set_firmware_version
send_w(serial_port, baud_rate)
File "mc_config.py", line 46, in send_w
ans = ser.read(24)
File "/home/avidbots/.local/lib/python2.7/site-packages/serial/serialposix.py", line 501, in read
'device reports readiness to read but returned no data '
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
回溯(最近一次呼叫最后一次):
文件“mc_config.py”,第69行,在
设置固件版本(sp、br)
文件“mc_config.py”,第64行,在set_固件版本中
发送(串行端口、波特率)
文件“mc_config.py”,第46行,在send_w中
ans=序列读取(24)
文件“/home/avidbots/.local/lib/python2.7/site packages/serial/serialposix.py”,第501行,已读
'设备报告已准备好读取,但未返回任何数据'
serial.serialutil.SerialException:设备报告已准备好读取,但未返回任何数据(设备已断开连接或端口上的多重访问?)
(我正在使用ubuntu 16.04和python 3)如果您将异常代码放入
try
中,然后使用except serial.serialutil.SerialException{…}
块捕获异常会怎么样
显然,提交w
有一个重要的时间窗口(否则“按w”的方法通常不起作用)。因此,您的要求是只重试发送w
所必需的部分代码,以便您能够足够快地发送它,以“捕获”处于启动状态的系统。由于回溯显示异常发生在send\u w
中,因此您可以添加try
/块和,而则在设置固件版本
末尾的一行中循环
而不仅仅是这样:
send_w(serial_port, baud_rate)
类似这样的事情可能会解决问题:
while True:
try:
send_w(serial_port, baud_rate)
break
except serial.serialutil.SerialException:
pass # retry
您可能需要更改导入以公开该异常,仅供参考。您可能需要考虑是否捕获了太多可能的异常——可能异常也可能表示不应该重试的其他错误。您可能还需要在那里添加一个小的睡眠时间-这实际上是一个繁忙的等待循环() 谢谢,类似的方法也奏效了。在调用函数之前,我删除了睡眠,将send_w的超时缩短为0.1,并在循环上设置结束条件,而不是break语句。例外情况的通过是关键!
while True:
try:
send_w(serial_port, baud_rate)
break
except serial.serialutil.SerialException:
pass # retry