向设备发送串行消息,直到它在线
Send serial message to device until it is online
我正在尝试通过串行接口更新控制器的固件。为此,我必须向控制器发送一条重启消息(没问题),然后发送另一条消息(字符 'w')它启动的那一刻,以便它可以在写入模式下启动。通过在设备重新启动时连续按 w,可以使用 minicom 实用程序轻松完成此操作。
我想改为使用 python 代码来实现此功能,但我不知道如何在设备启动之前发送消息而不抛出异常(因为设备未连接)。
这是我试过的方法,但它不起作用(使用 pyserial):
def send_w(serial_port, baud_rate):
msgw = "w_"
ans = ""
ser = serial.Serial(port=serial_port, baudrate=baud_rate,timeout = 10)
ser.write(msgw)
ans = ser.read(24)
ser.close()
print(ans)
return ans
def set_firmware_version(serial_port, baud_rate):
s = ""
try:
with serial.Serial(serial_port,baud_rate,timeout=1) as ser:
msgr = "%reset "+sk+"_"
ser.write(msgr)
ser.close()
print("reset")
except (IOError) as e:
print("Error in: set_firmware_version")
print(e)
return s
time.sleep(1)
send_w(serial_port, baud_rate)
set_firmware_version(sp,br)
这会产生以下错误:
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?)
(我正在使用 ubuntu 16.04 和 python 3)
如果将异常代码放入 try
然后用 except serial.serialutil.SerialException {...}
块捕获异常会怎样?
很明显,提交 w
需要大量 window 的时间(否则 "press w" 方法通常不会起作用。)那么,您的要求是仅重试发送 w
绝对必要的代码部分,以便您可以足够快地将它发送到 "catch" 处于启动状态的系统。由于回溯显示异常发生在 send_w
中,因此您可以添加 try
/except
块和一个 while
循环围绕现在 send_w
末尾的一行=20=].
不仅如此:
send_w(serial_port, baud_rate)
这样的事情可能会解决问题:
while True:
try:
send_w(serial_port, baud_rate)
break
except serial.serialutil.SerialException:
pass # retry
您可能需要更改导入以公开该异常,仅供参考。并且您可能需要考虑您是否捕获了太多可能的异常 - 异常可能还代表其他不应重试的错误。您可能还需要在那里添加一个小的睡眠时间——这实际上是一个繁忙的等待循环 (https://en.wikipedia.org/wiki/Busy_waiting)。
我正在尝试通过串行接口更新控制器的固件。为此,我必须向控制器发送一条重启消息(没问题),然后发送另一条消息(字符 'w')它启动的那一刻,以便它可以在写入模式下启动。通过在设备重新启动时连续按 w,可以使用 minicom 实用程序轻松完成此操作。
我想改为使用 python 代码来实现此功能,但我不知道如何在设备启动之前发送消息而不抛出异常(因为设备未连接)。
这是我试过的方法,但它不起作用(使用 pyserial):
def send_w(serial_port, baud_rate):
msgw = "w_"
ans = ""
ser = serial.Serial(port=serial_port, baudrate=baud_rate,timeout = 10)
ser.write(msgw)
ans = ser.read(24)
ser.close()
print(ans)
return ans
def set_firmware_version(serial_port, baud_rate):
s = ""
try:
with serial.Serial(serial_port,baud_rate,timeout=1) as ser:
msgr = "%reset "+sk+"_"
ser.write(msgr)
ser.close()
print("reset")
except (IOError) as e:
print("Error in: set_firmware_version")
print(e)
return s
time.sleep(1)
send_w(serial_port, baud_rate)
set_firmware_version(sp,br)
这会产生以下错误:
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?)
(我正在使用 ubuntu 16.04 和 python 3)
如果将异常代码放入 try
然后用 except serial.serialutil.SerialException {...}
块捕获异常会怎样?
很明显,提交 w
需要大量 window 的时间(否则 "press w" 方法通常不会起作用。)那么,您的要求是仅重试发送 w
绝对必要的代码部分,以便您可以足够快地将它发送到 "catch" 处于启动状态的系统。由于回溯显示异常发生在 send_w
中,因此您可以添加 try
/except
块和一个 while
循环围绕现在 send_w
末尾的一行=20=].
不仅如此:
send_w(serial_port, baud_rate)
这样的事情可能会解决问题:
while True:
try:
send_w(serial_port, baud_rate)
break
except serial.serialutil.SerialException:
pass # retry
您可能需要更改导入以公开该异常,仅供参考。并且您可能需要考虑您是否捕获了太多可能的异常 - 异常可能还代表其他不应重试的错误。您可能还需要在那里添加一个小的睡眠时间——这实际上是一个繁忙的等待循环 (https://en.wikipedia.org/wiki/Busy_waiting)。