调试pySerial写入超时

时间:2015-04-14 15:53:27

标签: python pyserial

如何确定导致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

总结:

  • 代码可以运行很多秒/分钟
  • 数据不再在FTDI的TX引脚上输出,没有异常提升
  • 几秒钟后,代码开始提出Write Timeout例外

如何调试此问题?

0 个答案:

没有答案