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)

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

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 = 46; SP = 172)

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

В предложенном коде программы необходимо ввести идентификатор устройства (разделяя байты пробелами) и значение яркости, при условии, что режим диммирования уже включен. 

 

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

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);

                      

        }

    }

}

Вывод консоли ниже.