【问题标题】:pySerial buffer won't flushpySerial 缓冲区不会刷新
【发布时间】:2011-09-01 05:57:46
【问题描述】:

我在使用 pySerial 的 Windows 和 Linux 下都遇到了串行 IO 问题。使用此代码,设备永远不会收到命令并且读取超时:

import serial
ser = serial.Serial('/dev/ttyUSB0',9600,timeout=5)
ser.write("get")
ser.flush()
print ser.read()

此代码第一次超时,但后续迭代成功:

import serial
ser = serial.Serial('/dev/ttyUSB0',9600,timeout=5)
while True:
    ser.write("get")
    ser.flush()
    print ser.read()

谁能告诉我发生了什么?我尝试添加对 sync() 的调用,但它不会将串行对象作为它的参数。

谢谢, 罗伯特

【问题讨论】:

    标签: pyserial


    【解决方案1】:

    在写入和读取之间设置一些延迟 例如

    import serial
    ser = serial.Serial('/dev/ttyUSB0',9600,timeout=5)
    ser.flushInput()
    ser.flushOutput()
    ser.write("get") 
    
    # sleep(1) for 100 millisecond delay
    # 100ms dely
    sleep(.1)
    print ser.read()
    

    【讨论】:

    • 通常,添加延迟来解决问题是个坏主意,除非您的设置中的某些特定硬件在物理上或电气上需要延迟。几乎总是有更好的方法来做这样的事情。
    【解决方案2】:

    这是因为 pyserial 在实际准备好之前从打开端口返回。我注意到像 flushInput() 这样的东西实际上并没有清除输入缓冲区,例如,如果在 open() 之后立即调用。以下是演示代码:

    import unittest
    import serial
    import time
    """
    1) create a virtual or real connection between COM12 and COM13
    2) in a terminal connected to COM12 (at 9600, N81), enter some junk text (e.g.'sdgfdsgasdg')
    3) then execute this unit test
    """
    
    class Test_test1(unittest.TestCase):
        def test_A(self):
            with serial.Serial(port='COM13', baudrate=9600) as s:   # open serial port
                print("Read ASAP:  {}".format(s.read(s.in_waiting)))
                time.sleep(0.1)     # wait fro 100 ms for pyserial port to actually be ready
                print("Read after delay:  {}".format(s.read(s.in_waiting)))
    
    if __name__ == '__main__':
        unittest.main()
    
    """
    output will be:
    Read ASAP:  b''
    Read after delay:  b'sdgfdsgasdg'
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.101s
    """
    

    我的解决方法是在打开后延迟 100 毫秒,然后再执行任何操作。

    【讨论】:

      【解决方案3】:

      问题真的很老了,但我觉得这可能是相关的补充。

      某些设备(例如 Agilent E3631)依赖于 DTR。一些超便宜的适配器没有 DTR 线(或do not have it broken out),并且使用这些,此类设备可能永远不会以预期的方式运行(读取和写入之间的延迟变得非常长)。

      如果您发现自己在使用这样的设备,我的建议是使用带 DTR 的适配器。

      【讨论】:

        【解决方案4】:

        抱歉,这对某些人来说已经过时且显而易见,但我没有看到这里提到的这个选项。当flush没有对我的硬件做任何事情时,我最终调用了read_all()

        # Stopped reading for a while on the connection so things build up
        
        # Neither of these were working
        conn.flush()
        conn.flushInput()
        
        # This did the trick, return value is ignored
        conn.read_all()
        
        # Waits for next line
        conn.read_line()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-17
          • 2018-07-11
          • 1970-01-01
          • 2012-04-12
          • 2015-08-10
          • 1970-01-01
          • 2011-11-28
          相关资源
          最近更新 更多