mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-29 19:57:12 +08:00
px_uploader.py fix flashing issue (#9792)
This fixes a problem where the pyserial write call gets stuck. It happens on a specific Fedora 28 system with internal USB ports as well as USB hubs. It is not clear why the problem is resolved but it is clearly reproducible that with a timeout of 0, the write can get stuck and with a timeout > 0 it works every time. The exception added as part of this commit makes sense but has never been triggered in my testing.
This commit is contained in:
+13
-3
@@ -191,8 +191,11 @@ class uploader(object):
|
|||||||
MAVLINK_REBOOT_ID0 = bytearray(b'\xfe\x21\x45\xff\x00\x4c\x00\x00\x40\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x00\x00\x00\xcc\x37')
|
MAVLINK_REBOOT_ID0 = bytearray(b'\xfe\x21\x45\xff\x00\x4c\x00\x00\x40\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x00\x00\x00\xcc\x37')
|
||||||
|
|
||||||
def __init__(self, portname, baudrate_bootloader, baudrate_flightstack):
|
def __init__(self, portname, baudrate_bootloader, baudrate_flightstack):
|
||||||
# open the port, keep the default timeout short so we can poll quickly
|
# Open the port, keep the default timeout short so we can poll quickly.
|
||||||
self.port = serial.Serial(portname, baudrate_bootloader, timeout=0.5)
|
# On some systems writes can suddenly get stuck without having a
|
||||||
|
# write_timeout > 0 set.
|
||||||
|
self.port = serial.Serial(portname, baudrate_bootloader, timeout=0.5, write_timeout=0.5)
|
||||||
|
# self.port.write_timeout = 0.5
|
||||||
self.otp = b''
|
self.otp = b''
|
||||||
self.sn = b''
|
self.sn = b''
|
||||||
self.baudrate_bootloader = baudrate_bootloader
|
self.baudrate_bootloader = baudrate_bootloader
|
||||||
@@ -230,7 +233,14 @@ class uploader(object):
|
|||||||
|
|
||||||
def __send(self, c):
|
def __send(self, c):
|
||||||
# print("send " + binascii.hexlify(c))
|
# print("send " + binascii.hexlify(c))
|
||||||
self.port.write(c)
|
while True:
|
||||||
|
try:
|
||||||
|
self.port.write(c)
|
||||||
|
break
|
||||||
|
except serial.SerialTimeoutException as e:
|
||||||
|
print("Write timeout (%s), trying again" % e)
|
||||||
|
time.sleep(0.04)
|
||||||
|
continue
|
||||||
|
|
||||||
def __recv(self, count=1):
|
def __recv(self, count=1):
|
||||||
c = self.port.read(count)
|
c = self.port.read(count)
|
||||||
|
|||||||
Reference in New Issue
Block a user