Работа с COM портом в windows и linux

от автора

image
Когда-то давно я делал приложение, которое должно было работать из под Windows и Linux и подключаться к плате с STM32 через UART. Данная статья может быть полезна новичкам, которые программируют на С++ (используют компиляторы GCC и MinGW) и которым нужна поддержка COM порта под двумя ОС сразу.

Как реализована поддержка COM порта в разных ОС

В Windows для работы с портом используются средства WinAPI. В Linux системах для работы с устройствами используются специальные файлы. Для того, чтобы определить, в какой ОС мы работаем и какой компилятор используем, в коде используются директивы определения компилятора и ОС (__MINGW32__ и __linux).

Я написал класс ComPort, который позволяет работать с COM портом в синхронном режиме. Класс не поддерживает асинхронную работу с портом. Репозиторий с классом ComPort можно найти здесь.

Пример использования

#include <iostream> #include "xserial.hpp" using namespace std;  int main() {     /* инициализируем доступный COM порт, без проверки бита четности,         с 8-мью битами данных и одним стоп битом. */     const int baudRate = 115200; // скорость порта     const int dataBits = 8; // длина данных     xserial::ComPort serial(         baudRate,          xserial::ComPort::COM_PORT_NOPARITY,          dataBits,          xserial::ComPort::COM_PORT_ONESTOPBIT);      if (!serial.getStateComPort()) { // Если порт не открылся         cout << "Error: com port is not open!" << endl;         return 0;     }      // выводим список доступных портов     serial.printListSerialPorts();      // получаем текст до символа \n     cout << "Test getLine()..." << endl;     serial << "Test 1\n";     cout << serial.getLine() << endl;      // проверяем функцию проверки количества принятых байт     cout << "Test bytesToRead()..." << endl;     serial.print("Test 2\n");     int k = serial.bytesToRead();     cout << "bytes to read = " << k << endl;     while(k < 6) {         k = serial.bytesToRead();     }     cout << "bytes to read = " << k << endl;      // проверяем функцию чтения     char data[512];     cout << "Test read()..." << endl;     serial.read(data, 7);     cout << data << endl;      // проверяем функцию чтения слова     serial.print("Bla Bla Bla\n");     cout << "Test getWord(), print Bla Bla Bla" << endl;     cout << "word 1: " << serial.getWord() << endl;     cout << "word 2: " << serial.getWord() << endl;     cout << "word 3: " << serial.getWord() << endl;      return 0; } 

В класс так же добавил функцию getListSerialPorts для получения списка доступных COM портов.

Нюансы использования COM порта
Под Windows могут возникнуть проблемы при записи в COM порт, если в качестве переходника USB-UART используется плата Nucleo STM32. Часто проблема возникает после переинициализации порта, порой помогает только перезагрузка ноутбука.


ссылка на оригинал статьи https://habr.com/post/422647/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *