Чтение ввода со сканера с использованием последовательного порта в Python - PullRequest
0 голосов
/ 06 июля 2011

Я работаю над чтением ввода со сканера, но сначала хочу задать вопрос, а затем прочитать входящие данные.

Это то, что у меня сейчас есть.

ser = serial.Serial()
ser.baudrate = 9600
PORT = 1
#for windows
ser = serial.Serial(PORT, 19200, timeout=1)
x = ser.read()
s = ser.read(11)
line = ser.readline()
#Read input
station = int(raw_input('What is the barcode? '))

Может кто-нибудь направить меня в правильном направлении.

ОБНОВЛЕНИЕ: устройство ввода представляет собой сканер штрих-кода. Выходное устройство - это консольное окно.

Я бы хотел, чтобы результат был таким:

What is the barcode?
(would wait for scan....)
(Once scanned it would show up on the screen and stored in a variable)
This is the barcode scanned: AAA00000011

Я также использую пример на этой странице

Ответы [ 2 ]

0 голосов
/ 06 июля 2011

Вопрос, похоже, плохо сформулирован.Вы можете использовать функцию Python raw_input для чтения из стандартного ввода, чтобы задать вопрос, и вы можете читать байты из последовательного порта, если вы знаете скорость передачи данных через устройство BAUD (в противном случае вы получите мусор).Из этого примера я не совсем уверен, что именно вы пытаетесь сделать (хотя, кажется, код показывает, что вы задаете вопрос после прочтения значения, вопреки описанию).

Если вы знаете серийный номерустройство будет передавать \n после завершения, тогда вы можете использовать readline (), в противном случае вам нужно знать, сколько байтов будет в его ответе.Похоже, что это сканер штрих-кода, поэтому убедитесь, что количество запрошенных вами байтов будет покрывать любые коды ошибок, которые он может распечатать.Если вы прочитаете слишком много байтов, вы отрежете данные из буфера для следующего чтения, а если прочитаете слишком мало, вы оставите некоторые из них там.В соответствии с это это будет либо 6 или 10 байт для данных, а в спецификации устройства будет указано на наличие ошибок.

Вы захотите что-то вроде этого (COM1 предполагает Windows, используйте / dev/ ttyS * для Unix:

ser = serial.Serial('COM1', 19200, timeout=1)
station = raw_input('What is the station?')
barcode = ser.read(10)

Редактировать: Как сказал Пол, вызов read () является блокирующим и будет ждать, пока в буфере не появятся последовательные данные, до истечения времени ожидания, указанного вдостигнут конструктор. Это означает, что вам нужно будет что-то сканировать до того, как истечет время ожидания, или код сломается. Вы получите часть отсканированных результатов или пустую строку.

print 'What is the barcode?'
ser = serial.Serial('COM1', 19200, timeout=1)
barcode = ser.read(11)
print 'This is the barcode scanned: ' + barcode

Обратите внимание, чтоЯ использовал здесь 11 байтов, поскольку это было то, что вы использовали изначально, я предполагаю, что в спецификации вашего сканера штрих-кода написано, что он печатает 10 символов, а затем конечный байт, такой как \ n.

Информация выше о любых кодах ошибокчто сканер может отправить все еще стоит, и вам нужно будет обработать его самостоятельно, прежде чем распечатывать штрих-код.

0 голосов
/ 06 июля 2011

Ссылка в вашем посте не работает, и вы не упоминаете, какое серийное устройство вы используете, трудно понять, что вы хотите сделать.

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

Если это действительно то, что вы хотите сделать, то вы захотите написать туда, где вы хотите отобразить свой вопрос, возможно, ser.write, а затем выполнить код чтения.

Редактировать: исходная кузница восстановлена. метод read () блокирует, в соответствии с документами , поэтому вы просто распечатаете свой вопрос в стандартный вывод (возможно, на экран), а затем вызовете «read ()». Ваша программа должна подождать (заблокировать), пока не получит правильное количество байтов, в вашем случае 11. Я предполагаю, что код, который вы выложили для чтения байтов, действительно дает вам то, что вы хотите.

print "What is the barcode?"
code = ser.read(11)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...