开发者社区> 问答> 正文

如何同时检查串行输入和键盘输入(同时使用readchar和串行库)

我试图在树莓派中使用python3编写以下代码:

1)等待14位数的条形码(条形码扫描器通过usb端口连接并接收输入作为键盘数据)

2)读取条形码后,等待串行通信(设备连接到USB端口并发送串行命令。可能是一个或多个。。。)的想法是,接收到的所有命令都将与扫描的条形码相关联

3)当读取新条形码时,必须停止等待串行命令的过程。这是我尚未弄清楚如何做的部分

经过研究,我决定将“ readchar”库用于条形码扫描仪,将“ serial”库用于所接收的串行通信。他们两个人都自己工作,但问题是当我尝试同时检测到这两种情况时。

在以下代码中,我设法读取了条形码,然后等待5行串行通信以最终重复该过程并再次读取条形码。该程序现在可以正常工作,但是问题是我不知道我将收到多少行串行通信,因此我需要以某种方式检测新条形码,同时还要等待接收串行通信。

import readchar
import time
import serial

ser = serial.Serial(
 port='/dev/ttyUSB0',
 baudrate = 115200,
 parity=serial.PARITY_NONE,
 stopbits=serial.STOPBITS_ONE,
 bytesize=serial.EIGHTBITS,
 timeout=1
)

print("Waiting for barcode...")
while 1:
    inputStr = ""
    while len(inputStr) != 14:  #detect only 14 digit barcodes
        inputStr += str(readchar.readchar())
        inputStr = ''.join(e for e in inputStr if e.isalnum())  #had to add this to strip non alphanumeric characters           
    currentCode = inputStr
    inputStr = ""
    print(currentCode)
    ser.flushInput()
    time.sleep(.1)

    # Wait for 5 lines of serial communication
    # BUT it should break the while loop when a new barcode is read!
    count = 0  
    while count < 5:
        dataRead=ser.readline()
        if len(dataRead) > 0:
            print(dataRead)
            count+=1

    print("Waiting for barcode...")

如果我在while循环中添加一个条件,即使用(ser.readline())读取串行通信,以便从扫描仪(readchar.readchar())读取字符,则会使事情搞砸。就像readline和到达器不能在while循环中一样。

做一些研究,我认为我需要使用异步IO或线程或类似的东西,但是我没有任何线索。我也不知道是否可以继续使用相同的库(串行和readchar)。请帮忙

展开
收起
祖安文状元 2020-01-08 15:41:23 531 0
1 条回答
写回答
取消 提交回答
  • 我不确定(我没有条形码阅读器和串行端口设备),但是根据您所说的,我认为您不需要线程,您只需要依靠缓冲区来保存数据,直到有空为止阅读它们。

    只需将第二个while循环的条件更改为:

    while serial.inWaiting() != 0: 这样,您将确保串行端口上的RX缓冲区将为空。根据设备的速度和时间,此方法可能有效也可能无效。

    您还可以尝试在清空缓冲区后添加一小段延迟:

    import serial
    import time
    ser=serial.Serial(port="/dev/ttyUSB0",baudrate=115200, timeout=1.0)          
    time.sleep(1)
    data=b""
    timeout = time.time() + 1.0
    while ser.inWaiting() or time.time()-timeout < 0.0:   #keep reading until the RX buffer is empty and wait for 1 seconds to make sure no more data is coming
        if ser.inWaiting() > 0:
            data+=ser.read(ser.inWaiting())
            timeout = time.time() + 1.0
        else:
            print("waiting...")
    
    

    在接收到最后一个字节后,这将继续尝试从端口读取1秒钟,以确保没有其他消息。您可能还想玩延迟的时间,这又取决于设备的速度和时序。

    同样,我没有您的设备,因此我无法判断,但是您从条形码/键盘读取字符的方式看起来并非最佳。我怀疑readchar是最好的方法。归根结底,您的条形码读取器可能是一个串行端口。您可能想深入研究和/或找到一种更有效的方法,以便一次性读取多个键盘笔触。

    2020-01-08 15:41:37
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载