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)
| Байт: | 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 и запишем их в байтовый массив с помощью метода 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();
}
}
}
}
}
Получим следующий ответ:


