Использование pyserial для чтения Scale show b '' - PullRequest
1 голос
/ 29 февраля 2020

Я довольно плохо знаком с использованием pyserial и в настоящее время у меня возникают трудности с чтением шкалы. Я считаю, что это связано с некоторой инициализацией, которую я делаю неправильно на python. Я управлял весами с LabVIEW, но пытаюсь уйти от этого, поскольку мои знания там сильно ограничены. Когда я выполняю следующий код, я печатаю b ''. Без таймаута код будет go включаться вечно, если я не отключу устройство (я также использовал ser.readline ()). Я приложил код инициализации, который используется из labview, если это помогает (я знаю, что настройки на блок-диаграмме отличаются от кода, но вы можете вручную изменить их на передней панели в соответствии с настройками масштаба). Я ценю любую помощь заранее!

ser = serial.Serial("COM3", 
                     9600, 
                     timeout = 2, 
                     bytesize=serial.EIGHTBITS, 
                     parity=serial.PARITY_ODD)
print('Connected')
ser.read(5)

Labview Diagram

1 Ответ

0 голосов
/ 29 февраля 2020

Настройка

Ваш кабель должен быть в порядке, так как вы можете подключить Scale UART. Затем вы должны правильно настроить соединение. Согласно вашей фигуре и некоторой документации (стр. 55, также см. ) это должно быть:

import serial    
ser = serial.Serial("COM3", 
                     1200, 
                     timeout = 2, 
                     bytesize=serial.SEVENBITS, 
                     parity=serial.PARITY_ODD,
                     stopbits=serial.STOPBITS_ONE)

Если вы получили зашифрованные символы во время общения, это Скорее всего, приведенная выше настройка должна быть исправлена ​​в соответствии с настройкой Scale.

Связь

Истекло время ожидания, поскольку отсутствует символ для чтения из UART. Скорее всего, устройство работает в режиме poll или символе stream s при определенных c условиях, которые не выполняются во время вызова read.

В руководстве сказано ( стр. 65):

Команда печати может быть передана программной командой или нажатием.

Опрос

В первом случае (опрос режим), вы должны отправить команды (определенные протоколом), прежде чем читать какую-либо информацию обратно. Это руководство (стр. 53-63) добавляет некоторые сведения о протоколе, используемом для обмена информацией. Например. если мы хотим опросить модель Scale:

ser.write(b"\x1bx1_\r\n") # Send data, stands for: ESC x 1 _ CR LF (p. 62)
rep = ser.read(64)        # Try to read up to 64 bytes

Чтобы прочитать данные из Scale, используйте:

ser.write(b"\x1bP\r\n")        # Equivalent to press button
                               # (block auto print, see p. 61)
rep = ser.read(ser.in_waiting) # Read pending bytes, should returns 16 bytes
                               # eg.: b"+****72.55*g**\r\n" (p. 57)

Stream

Вы можете проверить this поведение с использованием:

rep = ser.read_until()

Он будет ждать \n (перевод строки) перед возвратом, запустите ваш скрипт и нажмите кнопку. Вы должны получать данные со шкалы.

Если шкала передает данные о конкретном событии c (например, нажатой кнопке), то вам необходимо решить совершенно другую проблему. Вам нужно будет внедрить Listener, так как вам нужно будет постоянно слушать UART. Обычно это делается с помощью очереди, основная идея (для простоты эмулируется с помощью bytearray):

q = bytearray()    
while True:
   # Read until Line Feed:
   d = ser.read_until()
   # Update queue:
   q.extend(d)
   # Logic here to consume queue:
   # ...

Не используйте этот последний фрагмент в работе, это всего лишь фиктивный пример для исправления идей , Если вы go воспользуетесь этим решением, вам лучше внедрить службу прослушивателя для решения проблемы производителя-потребителя .

Выбор между опросом и потоком определяется возможностями устройства и требованиями вашего приложения.

...