Хобрук: Ваш путь к мастерству в программировании

Поиск лучших практик для написания приложения для последовательной связи устройств

Я новичок в последовательной связи, но хотел бы посоветовать, как лучше всего создать надежное приложение, которое общается с последовательным устройством и слушает его.

Мне удалось использовать 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 будет проще и безопаснее? Это известно как «Блокировка» чтения? Кроме того, могу ли я установить тайм-аут?

Надеюсь, кто-то может направить меня.

24.05.2010

Ответы:


1

Что ж, Thread.Sleep() тоже блокируется. На самом деле гораздо хуже, потому что вам придется указать время ожидания, которое всегда безопасно, даже если машина находится под большой нагрузкой. Использование ReadLine() всегда лучше, оно будет быстрее и не даст сбоев.

Обратите внимание, что в вашем примере не требуется, чтобы клиентский код ждал ответа. Он может просто предположить, что команда была эффективной. Все, что вам нужно, это событие Error, чтобы сигнализировать о том, что что-то пошло не так.

Если есть команда, которая требует, чтобы клиентский код получил ответ, вы должны предложить вариант ожидания, а также получить результат асинхронно. Это дает клиентскому коду варианты: ожидание медленное, но легкое, асинхронность сложно программировать. Это очень распространенный шаблон в среде .NET, имя асинхронного метода начинается с «Begin». Прочтите об этом статью библиотеки MSDN.

Вам также следует рассмотреть возможность доставки асинхронных уведомлений в потоке, который предпочитает клиентский код. Свойство SynchronizingObject является хорошим шаблон для этого.

24.05.2010

2

Если вы выполняете все операции чтения в фоновом потоке, то я не вижу никаких проблем с использованием ReadLine. Это самое простое и надежное решение.

Вы можете использовать ReadTimeout, чтобы установить время ожидания для операций чтения.

24.05.2010

3

Вы можете прочитать это Последовательный порт

25.05.2010
Новые материалы

Учебные заметки JavaScript Object Oriented Labs
Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

Разбор строк запроса в vue.js
Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
«Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..