Полученные данные не запускаются
DataReceived не запускается, потому что вы вызываете port.Close()
сразу после присоединения обработчика и до того, как поток приема SerialPort сможет запустить.
Вернуть массив байтов назад - Простой ответ
В представленном вами простом примере кода вы можете создать закрытый элемент Byte[]
и назначить ему объект readingbyte
из обработчика событий port_DataReceived
.
Возвращает массив байтов назад - Ответ подсказки OO
Однако в более жестком приложении вам следует рассмотреть возможность создания класса Transaction, который инкапсулирует части протокола Modbus ADU, обрабатывая как передачу клиентского запроса, так и (уровень 2) обработку ответа сервера.
В дополнение к уровню ADU вы должны разделить уровень PDU на абстрактный базовый класс ModbusFunction, который предоставляет интерфейс для класса ADU для получения байтов запроса и возврата байтов ответа. Тогда каждая функция Modbus, которую вы хотите, чтобы ваш клиент использовал, будет реализована в своем собственном классе, производном от базового класса PDU.
Таким образом, когда вам нужно взаимодействовать с сервером, вы создаете экземпляр класса функций PDU с соответствующими параметрами для формирования правильного пакета данных PDU и передаете его объекту Transaction, который обрабатывает запрос / retry / логика ответа и передает возвращенные данные обратно в объект PDU для надлежащего анализа.
Добавление события в базовый класс PDU позволит другим частям вашего кода присоединяться к событию класса PDU и получать уведомление после успешного завершения функции.
С сервером, имеющим несколько адресуемых свойств, реализованных посредством функций Modbus, вы должны создать экземпляр соответствующего класса функций Modbus для каждого свойства (или его набора, например, для смежных регистров) и присоединиться к событию, обновлять модель и / или пользовательский интерфейс всякий раз, когда объект вызывает событие обновления. Подключите команды пользовательского интерфейса для передачи объектов «Свойства функции Modbus» в объект «Транзакция», если вы хотите запросить сервер вручную, или реализуйте поток таймера, который делает это по расписанию, если вы хотите, чтобы свойства опрашивались на регулярной основе. *