
Когда-то давно я делал приложение, которое должно было работать из под 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/
Добавить комментарий