Python. Урок 2. Чтение ответа от устройства
В уроке 1 мы научились привязывать устройство nooLite-F к адаптеру MTRF-64-USB и отправлять ему некоторые команды. В случае успешного приема команд (успешной привязки) адаптер выдает ответную посылку из 17 байт, которая содержит информацию об устройстве (тип, версия прошивки, состояние, идентификатор). Давайте считаем ответ от устройства на примере команды Switch (Переключить, CMD = 4).
В проекте изменим код следующим образом.
1. Осуществим поиск порта, к которому подключен MTRF-64-USB.
2. Отправим пакет команды Switch на нулевой канал, к которому ранее привязали устройство SUF-1-300.
(ST= 171; MODE = 2; CTR = 0; RES = 0; CH = 0; CMD = 4; FMT = 0; D0= 0; D1 = 1; D2 = 0; D3 = 0; ID0 = 0; ID1 = 0; ID2 = 0; ID3 = 0; CRC = 177; SP = 172)
Байт: | ST | MODE | CTR | RES | CH | CMD | FMT | D0 | D1 | D2 | D3 | ID0 | ID1 | ID2 | ID3 | CRC | SP |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Передача (17 байт): | 171 | 2 | 0 | 0 | 0 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 177 | 172 |
3. Считаем 17 байт из SerialPort и запишем их в переменную answer с помощью метода Read. В дальнейшем переменную answer необходимо будет преобразовать в список, чтобы вывод был в десятичном виде.
4. Выведем в консоль имя порта, к которому подключен MTRF-64-USB, заголовки отдельных байтов (как в таблице выше) и их значения.
Пример кода Python в подсказке.
# Подключение модуля получения списка портов
import serial.tools.list_ports
# (1.) Поиск порта, к которому подключен адаптер MTRF-64-USB (попытка отправки команды всем портам)
ports = list(serial.tools.list_ports.comports())
for port in ports:
port = serial.Serial(port.device, baudrate=9600, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS)
# (2.) Команда Switch (Переключить) для устройства nooLite-F, привязанного на 0-ой канал
# Подробнее по ссылке http://lnnk.in/@noo
package = bytearray([171, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 172])
c = port.write(package)
answer = port.read(size=17)
# (3.) Если ответ c COM порта есть, то выводим номер порта, с которого он был получен
if answer != None:
print("Ответ от:", port.name, 'n')
# (4.) Выводим шапку таблицы columnNames, форматируя вывод
columnNames = ['ST', 'MODE', 'CTR', 'TOGL', 'CH', 'CMD', 'FMT', 'D0', 'D1', 'D2', 'D3', 'ID0', 'ID1', 'ID2',
'ID3', 'CRC', 'SP']
for i in columnNames:
print(i.ljust(4, ' '), end=' ')
# Выводим ответ в виде элементов из списка answer, форматируя вывод.
answerList = list(answer)
print(' ')
for j in answerList:
print('%-4d' % j, end=' ')
break
Получим следующий ответ:
ST = 173 — стартовый байт (значение оп умолчанию)
Python. Урок 3. Отправка команды на установку яркости по ID устройства