Работа с сом портом windows

Работа с сом портом windows

Терминал (для работы с COM портом) под Windows.

Зачем понадобилось создавать еще одну программу терминал .

На просторах интернета полно подобных программ ?!

Что есть, то есть !

Но есть маленькое НО, все дело в нюансах !

— Требуемый функционал был разбросан по нескольким программам и это было очень не удобно.

— Часть требуемых функций не было и вовсе.

— Часть программ банально падали в самый неподходящий момент.

— Часть функций реализованы с ошибками.

Так жить нельзя и работать тоже . 🙂

Значит надо создать свою программу, с необходимым функционалом.

Данный проект задумывался как вспомогательный для тестирования большого проекта связанного

с телеметрией. В проекте требовалось принимать и передавать данные через COM порт компьютера.

Проект готов и сдан. Программа осталась и продолжает использоваться по назначению, для отладки

разного рода устройств !

На текущий момент программа продолжает дорабатывается, исправляются ошибки, добавляются

В данной статье будут публиковаться все изменения и нововведения сделанные в программе.

Краткое описание программы.

Программа создана в среде Microsoft Studio 2008, на языке VB.

Репозитарий программы представлен на GitHub, готовый бинарный файл(exe) в виде Zip архива.

Собранная программа представляет из себя один запускаемый файл.

Программа не требует установки и работает из любого места.

Программа не требует для запуска привилегий администратора.

1. Подключаться к любому com порту в системе.

2. Выставлять параметры работы com порта, включая нестандартные скорости работы порта

(при условии что драйвер windows поддерживает нестандартные скорости).

3. Производить запись принимаемых данных в файл.

4. Передавать в порт строку с разными концовками в виде дополнительных кодов.

5. Циклически передавать в порт строку с заданным интервалом времени.

6. Передавать в порт файл.

Программа пока не может:

1. Разбирать ESC последовательности.

2. Вести историю передаваемых строк.

3. Передавать в порт кода нажатых клавиш в окне приема и передачи.

Текущая версия: v1.3.2

[+] Вывод подробного описания СОМ портов.

[+] Проигрывание сценария из текстового файла.

Пример сценария (Файл TXT), формат:

81 01 04 07 03 FF
> 100
81 01 04 07 02 FF

Где:
81 01 04 07 03 FF — значения байт в TXT-HEX формате отправляемых в СОМ порт.
> 100 — Формирование паузы 100 мс.
81 01 04 07 02 FF — значения байт в HEX формате отправляемых в СОМ порт.

[+] Перевод строки в TXT-HEX виде в байтовый массив и передача в СОМ порт.

Версия: v1.2.2

[+] Добавлена история ввода передаваемых строк.

Версия: v1.2.1

[+] Внесены изменения в интерфейс. Часть функций вынесены в окно приема.

[+] Добавлена функция Вкл/Выкл печати символа с кодом 0x0A.

0x0D + 0x0A -> 0x0D.

[+] Решено: При закрытии порта продолжалась передача в порт.

[+] Добавлена подсказка при наведении курсора на элементы управления.

[+] При запуске программы производится автоматический поиск СОМ портов в системе.

Версия: v1.1.0

[+] Добавлена передача в порт кодов нажатых клавиш в окне приема и передачи.

Работа с сом портом windows

Эта статья показывает, как записывать и читать данные от устройства, подключенного к последовательному порту (COM-порт) из приложения на языке C# в среде .NET. Мы будем читать и записывать данные через TextBox на форме, и будем работать с потоками.

Читайте также:  Базис мебельщик для windows 64 bit

В недалеком прошлом для работы с Serial Port в среде .Net 1.1, мы должны были использовать либо Windows API, либо использовать управление из сторонних библиотек. В среде .Net 2.0 (и в более поздних версиях .NET) компания Microsoft добавила поддержку последовательного порта включением класса SerialPort как части пространства имен System.IO.Ports. Реализация класса SerialPort сделана очень прямо и очевидно. Чтобы создать экземпляр класса SerialPort class, просто передайте опции SerialPort конструктору класса:

Для приема данных нам нужно создать обработчик события EventHandler для «SerialDataReceivedEventHandler»:

Вы можете также установить другие опции, такие как ReadTimeout и WriteTimeout (таймауты чтения и записи):

Как только Вы готовы использовать последовательный порт, Вам нужно открыть его:

Сейчас мы готовы принять данные. Однако чтобы записать эти данные в область ввода TextBox на форме, нам нужно создать так называемого делегата (delegate). Библиотеки .Net не позволяют межпотоковое взаимодействие (cross-thread action), так что нам нужно использовать делегат. Делегат используется для записи в поток пользовательского интерфейса (User Interface, UI) из другого потока (не UI).

Мы создадим теперь метод «sp_DataReceived», который будет выполнен при поступлении данных в последовательный порт:

Теперь создадим наш метод «si_DataReceived»:

Мы можем теперь принять данные из последовательного порта от устройства и отобразить их на форме. Некоторые устройства отправляют данные сами, без запроса. Однако некоторым устройствам нужно отправить определенные команды, чтобы они ответили на них какими-то своими данными. Для этих устройств Вы будете записывать данные в последовательный порт, и будете использовать предыдущий код, чтобы получить данные обратно. В этом примере будет происходить обмен со шкалой. Для отдельной шкалы отправка команды «SI\r\n» приведет к возврату веса, который имеется на шкале. Эта команда является специфической именно для этого устройства, в Вашем же случае нужно читать документацию по протоколу устройства, чтобы найти команды, принимаемые устройством. Для записи в последовательный порт создайте кнопку «Start» на форме, и добавьте код в событие клика на ней Click_Event:

Это все, что нужно Вам сделать. См. ссылку [1] для загрузки готового проекта Microsoft Visual C# 2010.

[Как передавать по одному символу, с задержкой]

В случае, когда нужно реализовать обмен с устройством, рассчитанным на взамодействие с пользователем (управляющая консоль). Так как пользователь вводит символы команды медленно, устройство успевает принять все символы и обработать. Если передавать символы быстро (методом SerialPort.Write), по несколько байт, то есть риск потери данных. Во врезке ниже приведен пример класса COMdevice, где реализован метод Write, который передает символы через задержку.

[Как перекодировать символы ANSI в UTF8]

Очень часть устройства на микроконтроллерах передают русские символы в кодировке ANSI (Windows-1251). Однако среда разработки Visual Studio C# хранит и обрабатывает русскоязычный текст в кодировке UTF8, и при попытке отобразить принятый текст (методом ReadExisting) выводятся кракозябры.

Решить проблему можно, если организовать байтовый буфер, и перекодировать массив байт с помощью класса Encoding (методом GetEncoding(1251).GetString). Пример кода в классе COMdevice приведен во врезке ниже.

[Ссылки]

Комментарии

[quote name=»Владимир»]Не очень шарю в С/С++/С#. При запуске этого приложения выдает ошибку в textbox «Порт ‘COM1’ не существует.» Всё подключено в порт COM4. В Вашем приложении не предлагается выбор портов в ComboBox1, список пуст. Подскажите в чем может быть проблема.

Работа с последовательным портом в windows и linux

Часто бывает необходимо, чтобы работа с устройством поддерживалась как в windows, так и в linux. В моем случае нужно было обеспечить работу com-порта в приложении, написанном на с/с++ с использованием кроссплатформенной библиотеки QT. Штатной поддержки программирования портов в QT нет (да и ни к чему это). Поэтому в win32 для работы с портом будем использовать средства WinAPI. В linux системах же, как известно для работы с устройствами используются специальные файлы.

Читайте также:  Чем отличаются windows 10 pro от windows 10 enterprise

Итак, взяв на вооружение всем знакомый gcc и его windows-аналог mingw, напишем нехитрый код.

Код будет довольно таки искусственным, т.к. ставится цель не более, чем показать принципы работы с com-портами в двух операционках. Для управления компилятором будем использовать директивы определения компилятора и ОС (__MINGW32__ и __linux). Com-портом в нашем случае является устройство dev/ttyS0 и COM1.

Инициализация

#ifdef __MINGW32__
HANDLE hSerial = CreateFile(«COM1»,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if (hSerial == INVALID_HANDLE_VALUE) <
printf(«Error opening port\r\n»);
return -1;
>
#endif

#ifdef __linux
int fd = open(«/dev/ttyS0», O_RDWR | O_NOCTTY );
if (fd

Здесь в win32 используется функция CreateFile, параметры по ссылке в коде. Функция возвращает хендл на на устройство, в которым мы дальше будем работать. Аналогично работает и open в linux.

Запись

Для записи в порт используем ранее возвращенный хендл и пишем соответствующими функциями.
Процедура чтения выглядит аналогично.

Чтение
Закрытие порта

#ifdef __MINGW32__
CloseHandle(hSerial);
#endif
#ifdef __linux
close(fd);
#endif

Кроме того, существуют функции для настройки самих портов. Об их использовании я, возможно, напишу в следующих статьях. В нашем примере все работает по стандартным настройкам системы.
Осталось дело за малым — скомпилировать код под каждую из ОС.

Надеюсь, что эта практика пригодится кому-то, кроме меня самого.
Приятного си-программирования!

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

  • 9 декабря 2020 в 00:18 Linux
  • 25 января 2021 в 00:21 Мой первый опыт с Linux. Настройка Ubuntu Sever 20.04, подключения по SSH и удаленное подключение к базе данных
  • 1 марта 2021 в 18:45 «Красивые» дистрибутивы Linux
  • 18 февраля 2021 в 01:17 Дистрибутивы Linux для новичков в 2021 году
  • 5 марта 2021 в 15:13 Проброс портов без белого IP — моя история

Это «Песочница» — раздел, в который попадают дебютные посты пользователей, желающих стать полноправными участниками сообщества.

Если у вас есть приглашение, отправьте его автору понравившейся публикации — тогда её смогут прочитать и обсудить все остальные пользователи Хабра.

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

Не надо пропускать:

  • рекламные и PR-публикации
  • вопросы и просьбы (для них есть Хабр Q&A);
  • вакансии (используйте Хабр Карьеру)
  • статьи, ранее опубликованные на других сайтах;
  • статьи без правильно расставленных знаков препинания, со смайликами, с обилием восклицательных знаков, неоправданным выделением слов и предложений и другим неуместным форматированием текста;
  • жалобы на компании и предоставляемые услуги;
  • низкокачественные переводы;
  • куски программного кода без пояснений;
  • односложные статьи;
  • статьи, слабо относящиеся к или не относящиеся к ней вовсе.

Работа с COM портом на C++ в Windows

Последовательные порты полюбились разработчикам за их простоту в обслуживании и использовании.

И конечно же писать в консоль терминальной программы это всё хорошо, но хочеться своё приложение, которое по нажатии клавиши на экране выполняет нужные вам действия 😉

Читайте также:  Приоритет правил брандмауэра windows

В этой статье опишу как работать с com портом на языке Си++.

Решение простое, но почемуто рабочий пример найден был не сразу. За сим сохраняю его тут.

Конечно вы можете использовать кроссплатформенные решения вроде QSerial — библиотеки в составе Qt, я наверное так и сделаю, но в будующем. Сейчас же речь о «чистом» виндовском C++. Писать будем в Visual Studio. У меня 2010, хотя роли это никакой не играет.

Создаём новый консольный Win32 проект.

Инклудим header файлы:

Объявляем обработчик com порта:

Я делаю это глобально, чтобы не заморачиваться с указателями при передаче его в функции.

Дальше начинаем формировать функцию main:

Терпеть не могу виндовский стиль программирования. Обозвали всё посвоему и сидят радуются.

Теперь магия объявления строки с именем порта. Дело в том, что char оно преобразовывать само не умеет.

Работа с последоавательными портами в Windows проходит как с файлом. Открываем первый ком порт для записи/чтения:

Теперь нужно настроить параметры соединения:

На msdn советуют сначала получить параметры, а затем менять их. Мы ещё только учимся, поэтому делаем как просят.

Теперь объявим строку, которую будем передавать и переменные необходимые для этого:

Посылаем строку. Напомню, что пример простейший, поэтому никаких особо проверок я не делаю:

Также я решил вывести для контроля размер строки и количество отосланных байт:

В конце программы делаем бесконечный цикл чтения данных:

Теперь функция чтения:

Вот собственно и весь пример.

Я создал виртуальный com порт. И слал из COM1 в COM2:

Работа с COM портом на C++ в Windows

Последовательные порты полюбились разработчикам за их простоту в обслуживании и использовании.

И конечно же писать в консоль терминальной программы это всё хорошо, но хочеться своё приложение, которое по нажатии клавиши на экране выполняет нужные вам действия 😉

В этой статье опишу как работать с com портом на языке Си++.

Решение простое, но почемуто рабочий пример найден был не сразу. За сим сохраняю его тут.

Конечно вы можете использовать кроссплатформенные решения вроде QSerial — библиотеки в составе Qt, я наверное так и сделаю, но в будующем. Сейчас же речь о «чистом» виндовском C++. Писать будем в Visual Studio. У меня 2010, хотя роли это никакой не играет.

Создаём новый консольный Win32 проект.

Инклудим header файлы:

Объявляем обработчик com порта:

Я делаю это глобально, чтобы не заморачиваться с указателями при передаче его в функции.

Дальше начинаем формировать функцию main:

Терпеть не могу виндовский стиль программирования. Обозвали всё посвоему и сидят радуются.

Теперь магия объявления строки с именем порта. Дело в том, что char оно преобразовывать само не умеет.

Работа с последоавательными портами в Windows проходит как с файлом. Открываем первый ком порт для записи/чтения:

Теперь нужно настроить параметры соединения:

На msdn советуют сначала получить параметры, а затем менять их. Мы ещё только учимся, поэтому делаем как просят.

Теперь объявим строку, которую будем передавать и переменные необходимые для этого:

Посылаем строку. Напомню, что пример простейший, поэтому никаких особо проверок я не делаю:

Также я решил вывести для контроля размер строки и количество отосланных байт:

В конце программы делаем бесконечный цикл чтения данных:

Теперь функция чтения:

Вот собственно и весь пример.

Я создал виртуальный com порт. И слал из COM1 в COM2:

Оцените статью