如何确定导致PySerial写入超时的原因?我遇到一个问题,PySerial在运行一段可变的时间后开始抛出Write timeout
个异常。它可以正常运行几分钟(大约200字节/秒),然后失败。
所有握手都被禁用。
在写入超时之前,我观察到TX数据引脚上没有更多数据。几秒钟后,超时开始。如果我禁用writeTimeout,则代码会持续运行,而TX引脚上没有新数据发送出去。
我在pySerial代码中看到它只是将写入的数据传递给os.write()
调用。什么会导致这种情况可靠地超时?什么会导致不超时,但输出引脚上没有任何数据?
以下有关我的申请的具体信息:
我通过FTDI适配器将数据发送到Arduino板(模拟一些动态像素伺服器)。我正在使用逻辑分析仪监视rx / tx线路,因此我可以看到实际通过FTDI适配器实现的是什么。
我在VM中运行Ubuntu 14.04。
代码来自Dynamixel Controller node for ROS。我一直在进行小的改动以调试问题。
写入方法,添加了用于调试的打印语句:
def __write_serial(self, data):
print "TX"
if self.ser is None:
print "not open"
self.ser.flushInput()
self.ser.flushOutput()
try:
n = self.ser.write(data)
print n
except Exception as e:
print e
阅读方法:
def __read_response(self, servo_id):
data = []
print "RX"
try:
data.extend(self.ser.read(4))
print data
if not data[0:2] == ['\xff', '\xff']:
print "RX ERR1"
raise Exception('Wrong packet prefix %s' % data[0:2])
data.extend(self.ser.read(ord(data[3])))
data = array('B', ''.join(data)).tolist() # [int(b2a_hex(byte), 16) for byte in data]
except Exception, e:
print "RX ERR2"
raise DroppedPacketError('Invalid response received from motor %d. %s' % (servo_id, e))
# verify checksum
checksum = 255 - sum(data[2:-1]) % 256
if not checksum == data[-1]: raise ChecksumError(servo_id, data, checksum)
return data
和串口声明。所有的握手都没了。
def __init__(self, port, baudrate, readback_echo=False):
""" Constructor takes serial port and baudrate as arguments. """
try:
self.serial_mutex = Lock()
self.ser = None
self.ser = serial.Serial(port)
#self.ser.setTimeout(0.015)
self.ser.setTimeout(0.05)
self.ser.baudrate = baudrate
self.ser.xonxoff = False
self.ser.rtscts = False
self.ser.dsrdtr = False
self.ser.writeTimeout = 1
self.port_name = port
self.readback_echo = readback_echo
except SerialOpenError:
raise SerialOpenError(port, baudrate)
程序按预期开始运行。在某些时候(以更高的数据包速率更快地发生),FTDI适配器的TX输出上不再出现数据。这是最后一个好包和第一个坏包的输出:
TX
8
RX
['\xff', '\xff', '\x15', '\x13']
TX
8
RX
[]
RX ERR1
RX ERR2
self.ser.write(data)
调用两次都返回8(对于8字节数据包),但数据仅出现在第一次调用的FTDI适配器输出上。
尝试发送数据约3秒后(大约200字节/秒),抛出Write timeout
个异常。
TX
Write timeout
RX
[]
RX ERR1
RX ERR2
总结:
Write Timeout
例外如何调试此问题?