Как проверить одновременно последовательный ввод и ввод с клавиатуры (одновременное использование readchar и последовательной библиотеки) - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь кодировать следующее, используя python3 в raspberry pi:

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 и Reherher не могут быть в одном цикле while.

Проводя некоторые исследования, я думаю, что мне нужно использовать асинхронный ввод-вывод, или потоки, или что-то в этом роде, но я понятия не имею. Также я не знаю, смогу ли я продолжать использовать одни и те же библиотеки (serial и readchar). Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Я не могу быть уверен (у меня нет вашего считывателя штрих-кода и устройства с последовательным портом), но, исходя из того, что вы говорите, я не думаю, что вам нужны потоки, вы просто должны полагаться на буферы, чтобы хранить ваши данные доу вас есть время, чтобы прочитать их.

Просто измените условие для вашего второго 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 - лучший подход. В конце концов, ваш считыватель штрих-кода, вероятно, является последовательным портом. Возможно, вы захотите в этом разобраться и / или найти более эффективный способ считывания нескольких нажатий клавиш за один раз.

0 голосов
/ 01 ноября 2019

Я нашел этот ответ в другом вопросе:

Как читать ввод с клавиатуры?

Я пробовал, и это работает! Я также попробую метод, предложенный Маркосом Г.

...