| сохранено
H Работа с COM портом в windows и linux
в черновиках

Когда-то давно я делал приложение, которое должно было работать из под 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. Часто проблема возникает после переинициализации порта, порой помогает только перезагрузка ноутбука.
P.S.
Предполагается, что любой, кому нужно «загуглить» код, может теперь просто скачать что-то уже работающее и дальше использовать в своем небольшом проекте, менять под себя, как вздумается.
комментарии (24)