C#. Урок 3. Отправка команды на установку яркости по ID устройства
В уроке 2 мы научились считывать ответ от устройства. В этом уроке мы отправим команду на установку яркости по адресу устройства, не учитывая канал CH. Для этого необходимо:
1. Узнать идентификатор устройства SUF-1-300.
2. Включить режим диммирования устройству SUF-1-300.
3. Подсчитать контрольную сумму (CRC) для отправляемого пакета.
4. Отправить устройству пакет с командой с заданным значением яркости по указанному адресу устройства.
1. Из полученного ответа можно узнать идентификатор устройства (ID), который состоит из байтов ID0, ID1, ID2, ID3. В нашем случае идентификатор (в десятичном виде) - 0 1 56 170.

Отправим команду на установку яркости непосредственно по адресу устройства, не учитывая канал CH, к которому оно было привязано. Для этого в пакете из 17 байтов следует изменить значение CTR с 0 на 9, что означает передачу команды по указанному адресу.
2. Так как нам необходимо отправить команду на установку яркости с определенным ее значением, то у устройства SUF-1-300 должен быть включен режим диммирования. Чтобы включить режим диммирования, следует отправить устройству пакет с настройкой (аналогично отправке команды из первого урока), который представлен ниже. Обратите внимание, что данный пакет настройки уже предназначен определенному адресу устройства.
(ST= 171; MODE = 2; CTR = 9; RES = 0; CH = 0; CMD = 129; FMT = 16; D0= 2; D1 = 0; D2 = 2; D3 = 0; ID0 = 0; ID1 = 1; ID2 = 56; ID3 = 170; CRC = 46; SP = 172)
| Байт: | ST | MODE | CTR | RES | CH | CMD | FMT | D0 | D1 | D2 | D3 | ID0 | ID1 | ID2 | ID3 | CRC | SP |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Передача (17 байт): | 171 | 2 | 9 | 0 | 0 | 129 | 16 | 2 | 0 | 2 | 0 | 0 | 1 | 56 | 170 | 46 | 172 |
CMD = 129 — это команда Write_State, с помощью которой задаются настройки устройства
FMT = 16, D0 = 2, D2 = 2 — формат и данные для включения режима диммирования
Нагрузка плавно загорится и погаснет, если настройка была успешно принята устройством SUF-1-300.
3. Подсчет контрольной суммы (CRC) был рассмотрен в уроке 1. Чтобы автоматизировать этот процесс, необходимо сложить значения байтов с 0-го по 14-ый включительно, затем вычислить остаток от деления суммы на 256.
4. Рассмотрим команду на установку яркости, см. таблицу ниже. CMD = 6, в D0 указываем конкретное значение яркости, которое может быть от 0 до 255.
(ST= 171; MODE = 2; CTR = 9; RES = 0; CH = 0; CMD = 6; FMT = 0; D0= 255; D1 = 0; D2 = 0; D3 = 0; ID0 = 0; ID1 = 1; ID2 = 56; ID3 = 170; CRC = 158; SP = 172)
| Байт: | ST | MODE | CTR | RES | CH | CMD | FMT | D0 | D1 | D2 | D3 | ID0 | ID1 | ID2 | ID3 | CRC | SP |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Передача (17 байт): | 171 | 2 | 9 | 0 | 0 | 6 | 0 | 255 | 0 | 0 | 0 | 0 | 1 | 56 | 170 | 158 | 172 |
В предложенном коде программы необходимо ввести идентификатор устройства (разделяя байты пробелами) и значение яркости, при условии, что режим диммирования уже включен.
Пример кода С# в подсказке.
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO.Ports;
namespace Example
{
class Dimmer
{
static void Main(string[] args)
{
int baudRate = 9600;
// Имя порта, к которому подключен адаптер MTRF. Имя можно узнать в Диспетчере устройств
string portName = "COM8";
SerialPort port = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);
port.WriteTimeout = 1000;
// (2.) Пакет байтов для отправки.
// Значение 8 - для отправки команды по указанному идентификатору.
// Значение 6 - команда яркости Set_Brightness.
// Остальные байты, кроме стопового, заполним нулями.
byte[] package = new byte[17] { 171, 2, 9, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172 };
// (1.) Подстановка байтов ID, введённых пользователем
Console.WriteLine("Введите ID, разделяя байты пробелами: ");
List<int> id = Console.ReadLine().Split().Select(Int32.Parse).ToList();
package[11] = (byte)id[0];
package[12] = (byte)id[1];
package[13] = (byte)id[2];
package[14] = (byte)id[3];
//(4.) Ввод и подстановка значения яркости для отправляемой команды
Console.WriteLine("Введите яркость от 0 до 255: ");
package[7] = byte.Parse(Console.ReadLine());
//(3.) Подсчёт контрольной суммы для 15-го байта в массиве (младший байт от суммы байтов с 0-го по 14-ый включительно)
int byteSumm = 0;
for (int i = 0; i < 15; i++)
{
byteSumm += package[i];
}
int crc = byteSumm % 256;
package[15] = (byte)crc;
port.Open();
port.Write(package, 0, package.Length);
}
}
}
Вывод консоли ниже.


