Я новичок в последовательной связи, но хотел бы посоветовать, как лучше всего создать надежное приложение, которое общается с последовательным устройством и слушает его.
Мне удалось использовать System.IO.SerialPort
и успешно подключиться, отправить данные и получить их с моего устройства. Вот как все работает.
Мое приложение подключается к COM-порту и открывает порт... Затем я подключаю свое устройство к COM-порту, и оно обнаруживает соединение с ПК, поэтому отправляет немного текста. это действительно просто информация об авторских правах, а также версия прошивки. Я ничего не делаю с этим, кроме как отображаю его в окне «активность».
Затем устройство ждет.
Затем я могу запросить информацию, но отправив команду, такую как «ЗАПРОС ПАРАМЕТРА1». Затем он отвечает примерно так:
'ПАРАМЕТР ЗАПРОСА1\r\n\r\n76767\r\n\r\n'
Затем я обрабатываю это. Затем я могу обновить его, отправив «SET PARAMETER1 12345», и он ответит «QUERY PARAMETER1\r\n\r\n12345\r\n\r\n».
Все довольно просто.
Итак, что я сделал, так это создал коммуникационный класс. этот вызов вызывается в своем собственном потоке и отправляет данные обратно в основную форму... а также позволяет мне отправлять ему сообщения.
Отправка данных проста. Получение немного сложнее. Я использовал событие datareceived, и когда когда-либо поступают данные, я отображаю их на своем экране. Моя проблема заключается в следующем:
Когда я отправляю команду, я чувствую, что веду себя очень изворотливо. Что я делаю, так это, допустим, я отправляю «ПАРАМЕТР ЗАПРОСА1». Я отправляю команду на устройство, затем помещаю «PARAMETER1» в глобальную переменную и выполняю Thread.Sleep(100).
На полученных данных у меня есть немного логики, которая проверяет входящие данные и видит, СОДЕРЖИТ ли строка значение в глобальной переменной. Поскольку ответ может быть «ПАРАМЕТР ЗАПРОСА1\r\n\r\n76767\r\n\r\n», он видит, что он содержит мой параметр, анализирует строку и возвращает значение, которое я ищу, но помещая его в другую глобальную переменную.
Мой метод отправки спал в течение 100 мс. Затем он просыпается и проверяет возвращенную глобальную переменную. Если у него есть данные... тогда я счастлив и обрабатываю данные. Проблема в том, что если сон слишком короткий, он потерпит неудачу. И я чувствую, что это ненадежно... помещать вещи в переменные... затем ждать...
Другой вариант — использовать вместо этого ReadLine
, но это очень блокирует. Поэтому я удаляю метод получения данных и вместо этого... просто отправляю данные... затем вызываю ReadLine()
. Это может дать мне лучшие результаты. Нет времени, за исключением того, что когда мы подключаемся изначально, эти данные поступают с устройства без моего запроса. Так может ReadLine
будет проще и безопаснее? Это известно как «Блокировка» чтения? Кроме того, могу ли я установить тайм-аут?
Надеюсь, кто-то может направить меня.