Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 向设备发送串行消息,直到设备联机_Linux_Python 3.x_Serial Port_Pyserial - Fatal编程技术网

Linux 向设备发送串行消息,直到设备联机

Linux 向设备发送串行消息,直到设备联机,linux,python-3.x,serial-port,pyserial,Linux,Python 3.x,Serial Port,Pyserial,我试图通过串行接口更新控制器固件。为此,我必须向控制器发送一条重新启动消息(没有问题),然后在控制器启动时发送另一条消息(字符“w”),以便它可以在写入模式下启动。通过minicom实用程序,可以在设备重新启动时连续按w键轻松完成此操作 我想改用python代码实现这一功能,但我不知道如何在设备启动之前发送消息而不引发异常(因为设备未连接) 这是我尝试过的,但它不起作用(使用pyserial): 这会产生以下错误: serial.serialutil.SerialException: devic

我试图通过串行接口更新控制器固件。为此,我必须向控制器发送一条重新启动消息(没有问题),然后在控制器启动时发送另一条消息(字符“w”),以便它可以在写入模式下启动。通过minicom实用程序,可以在设备重新启动时连续按w键轻松完成此操作

我想改用python代码实现这一功能,但我不知道如何在设备启动之前发送消息而不引发异常(因为设备未连接)

这是我尝试过的,但它不起作用(使用pyserial):

这会产生以下错误:

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