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)

Байт:STMODECTRRESCHCMDFMTD0D1D2D3ID0ID1ID2ID3CRCSP
Передача (17 байт):17120004000000000177172

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.devicebaudrate=9600stopbits=serial.STOPBITS_ONEbytesize=serial.EIGHTBITS)

   
# (2.) Команда Switch (Переключить) для устройства nooLite-F, привязанного на 0-ой канал
   # Подробнее по ссылке 
http://lnnk.in/@noo

   
package = bytearray([17120004000000000177172])
   
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 in answerList:
         
print('%-4d' % j, end=' ')
   
break

Получим следующий ответ:

 

ST = 173 стартовый байт (значение оп умолчанию)

MODE = 2 режим работы адаптера: nooLite-F TX
CTR = 0 код ответа: команда выполнена
TOGL = 1 количество оставшихся ответов от адаптера: для завершения опроса канала осталось передать один пакет
CH = 0 адрес канала: нулевой
CMD = 130  ответная команда
 
D0 = 5 — тип устройства: SUF-1-300
D1 = 1 —  версия прошивки устройства
D2 = 1 — состояние устройства: включено
D3 = 84 — текущая яркость от 0 до 255
ID0...ID3 = 0 1 56 170 — идентификатор устройства в DEC
CRC = 112 — контрольная сумма (младший байт от суммы первых 15 байт)
SP = 174 — стоповый байт (значение по умолчанию)
 

Python. Урок 3. Отправка команды на установку яркости по ID устройства