C# Урок 2. Чтение ответа от устройства

 

В уроке 1 мы научились привязывать устройство nooLite-F к адаптеру MTRF-64-USB и отправлять ему некоторые команды. В случае успешного приема команд (успешной привязки) адаптер выдает ответную посылку из 17 байт, которая содержит информацию об устройстве (тип, версия прошивки, состояние, идентификатор). Давайте считаем ответ от устройства на примере команды Switch (Переключить, CMD = 4).

 

В консольном приложении VISUAL STUDIO изменим код следующим образом. 

 

1. Осуществим поиск порта, к которому подключен MTRF-64-USB.

 

2. Отправим пакет команды  Switch на нулевой канал, к которому ранее привязали устройство SUF-1-300. Приостановим текущий поток на 100 мс, чтобы устройство успело выполнить команду.

(ST= 171; MODE = 2; CTR = 0; RES = 0; CH = 0; CMD = 4; FMT = 0; D0= 0; D1 = 0; D2 = 0; D3 = 0; ID0 = 0; ID1 = 0; ID2 = 0; ID3 = 0; CRC = 177; SP = 172)

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

3. Считаем 17 байт из входного буфера SerialPort и запишем их в байтовый массив с помощью метода Read. 

 

4. Выведем в консоль имя порта, к которому подключен MTRF-64-USB, заголовки отдельных байтов (как в таблице выше) и их значения.

Пример кода С# в подсказке.

using System;

using System.IO.Ports;

using System.Threading;

 

namespace Example

{

    class Read

    {

        static void Main(string[] args)

        {

            int baudRate = 9600;

            // (1.) Поиск порта, к которому подключен адаптер MTRF-64-USB

            string[] ports = SerialPort.GetPortNames();

          

                foreach (var portName in ports)

                {

                    using (SerialPort port = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One))

                    {

                     port.ReadTimeout = 100;

                     port.WriteTimeout = 100;

                        // (2.) Команда Switch (Переключить) для устройства nooLite-F, привязанного на 0-ой канал

                        // Подробнее по ссылке http://lnnk.in/@noo

                     byte[] package = new byte[17] { 171, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 172 };

                    

                     port.Open();

                     port.Write(package, 0, package.Length);                                                         

 

                     Thread.Sleep(100);

                                   // (3.) Создадим массив байтов ответа и попытаемся прочитать ответ c COM порта. При неудачной попытке чтения закрываем порт и читаем из следующего порта из массива ports

                     byte[] answer = new byte[17];

                    try

                        {

                        port.Read(answer, 0, 17);

                        }

                    catch

                        {

                        port.Close();

                        continue;

                        }

                   

                     string des = BitConverter.ToString(answer);

                     // (4.) Названия байтов для вывода в таблицу (шапка таблицы)    

                     string[] columnNames = {"ST" , "MODE""CTR""TOGL",  "CH""CMD",  "FMT""D0",  "D1""D2",  "D3""ID0",  "ID1""ID2",  "ID3""CRC",  "SP"};

 

                    // Вывод имени порта, в котором находится адаптер MTRF-64-USB, шапки таблицы и ответа от устройства

                    Console.WriteLine("Ответ от: " + portName);

 

                    for (int i = 0; i < columnNames.Length; i++)

                        {

                        Console.Write(" {0, 4}", columnNames[i]);                       

                        }

 

                    Console.WriteLine();

 

                    for (int j = 0; j < answer.Length; j++)

                        {

                        Console.Write(" {0, 4}", answer[j]);

                        }               

                    Console.ReadLine();

                    }

                   

                }

          

        }

    }

}

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

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 — стоповый байт (значение по умолчанию)
 

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