【问题标题】:why does a print() affect how com1 is read?为什么 print() 会影响 com1 的读取方式?
【发布时间】:2015-01-07 05:37:25
【问题描述】:

我正在为使用 RS232 串行的旧电子设备编写接口。我遇到了一个我似乎无法解决的问题。这是原始代码

def readMyPort():
    global readPort
    while True:   #always loop
        if readPort: # only do something of the port is active
            dataString = b''
            while (mySerialPort.inWaiting()>0):
                data = mySerialPort.read(1)
                if (data == b'') or (data == b'\r') or (data == b'\n'):
                    if (dataString != b''):
                        myOutput.insert('1.0', (dataString + b'\n').decode())
                        dataString = b''
                else:
                    dataString += data

我面临的问题是仪器响应命令发送一个12个字符的字符串,我似乎只捕捉到最后4个,不,没有'','\r'或'\ n' 在字符串中。为了排除故障,我添加了一个 print(),如下所示。神奇的是,我开始获取所有数据。

def readMyPort():
    global readPort
    while True:   #always loop
        if readPort: # only do something of the port is active
            dataString = b''
            while (mySerialPort.inWaiting()>0):
                data = mySerialPort.read(1)
                print(data)   #<-------- the added line
                if (data == b'') or (data == b'\r') or (data == b'\n'):
                    if (dataString != b''):
                        myOutput.insert('1.0', (dataString + b'\n').decode())
                        dataString = b''
                else:
                    dataString += data

现在我不想让所有的打印都正常进行。我尝试只添加一个print('') 并且效果也很好,但我仍然有所有这些 \n 被打印出来。我试过print('', end = '\r'),但没用。有谁知道为什么?我不认为这是一个速度问题。我只运行 9600 波特。仅供参考:Win32 机器上的 python 3.2。该例程在它自己的线程中启动。

【问题讨论】:

    标签: python serial-port pyserial


    【解决方案1】:

    print(data) 操作需要一些时间(相对较大)才能将某些内容打印到控制台。因此,通过添加print(data) 行,您只需在循环中添加一些延迟。您可以通过将print(data) 替换为time.sleep(0.1 or whatever small value) 来验证这个理论,并检查问题是否有望消失。

    我认为延迟会有所帮助,因为没有它mySerialPort.inWaiting() 有时可能会变成0(接收缓冲区为空)事务实际完成之前。您的仪器不能简单地快速输出数据。在代码的最终版本中,您可以添加 time.sleep() 而不是 print(data)

    【讨论】:

    • 感谢您的建议。我之前确实尝试过添加延迟,但也许我没有给它足够的时间。
    【解决方案2】:

    按照 Konstantin 的回答,看来串口需要一些时间来调整缓冲区和计数器,所以在循环中添加一个小的延迟解决了我的问题。 1 毫秒是不够的,但 10 毫秒是足够的。最终代码为:

    def readMyPort():
        global readPort
        while True:   #always loop
            if readPort: # only do something if the port is active
                dataString = b''
                while (mySerialPort.inWaiting()>0):  #if something is in the buffer
                    data = mySerialPort.read(1)
                    if (data == b'') or (data == b'\r') or (data == b'\n'):
                        if (dataString != b''):  #don't output empty strings
                            myOutput.insert('1.0', (dataString + b'\n').decode())
                            dataString = b''
                    else:
                        dataString += data
                        time.sleep(0.01)   #slow the loop down a bit 
    

    我一直在想是否有更优雅的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-23
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 2017-06-26
      • 1970-01-01
      相关资源
      最近更新 更多