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