This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
- Local
- Codespaces
HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
ПОДКЛЮЧАЕМ SERIAL COM PORT — C++ WINAPI ЧАСТЬ #8
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Источник: github.com
Как написать программу для com порта
Итак, вот мы и добрались до рассмотрения вопросов приема — передачи данных через COM порт, вопроса, который, наверняка интересует многих. В этой и последующих статьях мы рассомтрим как можно передавать и принимать данные по COM порту. Для этого я написал небольшую динамическую библиотеку на основе класса, которой и сам постоянно пользуюсь, дабы в каждой программе не писать кучу рутинного API кода.
Библиотека эта называется SerialGate.dll. Если Вы хотите использовать примеры этой и последующих статей, скачайте ее (библиотеку) и при желании ее исходники в предыдущей статье этого раздела.
В качестве «тренировочной базы» я решил рассмотреть решение довольно часто всречающейся задачи — передача данных между двумя компьютерами. Передавать данные, конечно же, будем через COM порт.
Как не покажется странным, начнем с «железа». Для того что бы передавать данные между двумя компьютерами, их необходимо соеденить специальным кабелем. Он называется «нуль-модемный» кабель для COM порта. Он продается под названием «Кабель нульмодемный DB9» в любом магазине радио-деталей. На обоих его концах установлен разъем COM порт — мама.
Соедините порты двух компьютеров этим кабелем.
Разумеется, некоторая часть читателей задас вопрос — у меня нет двух компьютеров, как мне попробовать передачу данных по COM порту? В таком случае, для тестирования и проверки отлично подойдет следующий вариант — использовать два COM порта одного и тогоже компьютера. Т.е. посылать данные из программы в один порт, и считывать данные из другого, предварительно соеденив их нуль-модемным кабелем.
💬 Как передавать и принимать данные из Arduino в компьютер и обратно? Очень просто!
Возьмемся за программирование. Сначала напишем консольное приложение которое будет считывать символ с клавиатуры и посылаеть его в COM порт. Создаем, как обычно, в Microsoft Visual Studio консольное приложение и называем его, например, COMServer. К пустой заготовке необходимо подсоединить библиотеку SerialGate.dll.
Последовательность действий при этом полностью аналогична работе с библиотекой inpout32.dll. Из скаченного архива помещаем файлы SerialGate.lib, SerialGate.h в папку проекта и SerialGate.dll в папку к исполняемой программе (Debug или Release). Далее, добавляем файл lib и h в самом проекте. Если все это делать лень, проект можно скачать готовым.
Вот собственно, и сам код программы. Рассмотрим, что в нем происходит. Сначала создается экземпляр класса SerialGate — sg. Далее, пытаемся открыть доспут к COM порту с помощью метода класса OpenPort(). Для этого, в функцию нужно передать номер COM порта (целое число).
Т.е., например, если у Вас на компьютере установлен COM порт под названием COM3, и Вы хотите его открыть, Вам нужно передать первым параеметром в функцию число 3. Второй параметр — это скорость, на которой будет работать порт при передаче данных. Скорость для COM портов измеряется в битах в секунду и может принимать некоторое значение из определенного списка. По умолчанию, в Windows можно использовать следующие скорости:
110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200, 128000 и 256000 бит/сек.
Однако, многие виртуальные COM порты поддерживают гораздо более высокие скорости (до 1 МБ/c). В таком случае нужно использовать те скорости, работу на которых обеспечивает тот или иной сторонний порт. Скорости перечисленные выше однозначно работают для любых портов.
В представленном примере открывается порт «COM1» на скорости 57600 бит/c. Далее в «бесконечном цикле» с клавиатуры вводится символ и с помощью метода класса Send() отправляется в COM порт. Функции передаются два параметра: адрес на буфер, в котором находятся данные для отправки и вторым параметром — размер этих данных в байтах. Для завершения ввода достаточно ввести символ ‘#’ — программа выйдет из цикла и используя метод Close() закроет порт.
#include #include #include «SerialGate.h» int main() < int port = 1; int rate = 57600; SerialGate sg; bool res = sg.Open(port, rate); if(res == false) < printf(«Open Error..n»); getch(); return 0; > else < printf(«Open OK. n»); >printf(«Press key to send it to COM port.n»); printf(«Press ‘#’ to exit.nn»); while(true) < char c = getch(); printf(«%c», c); sg.Send( if(c == ‘#’) break; > sg.Close(); getch(); return 0; >
Вот такое вот простенькое приложение для отправки данных. Теперь напишем вторую программу, которая будет открывать второй COM порт, соединенный с первым кабелем, и будет считывать оттуда данные. Готовый проект приложения COMClient можно скачать в шапке статьи.
Итак, опять создаем экземпляр класса SerialGate и открываем порт «COM2» на скорости 57600 бит/с. Обращаю внимае, что для према/передачи данных оба порта, учавсвующих в обмене информацией, должны быть открыты на одной и той же скорости. Далее, в «бесконечном» цикле с интервалом в одну секунду считываем данные с COM порта с помощью метода Recv().
Ему необходимо передать два параметра: адрес на буфер, в который будут положены прочтенные данные и размер этого буфера во избежание выходов за пределы массива. Функция возвращает чило прочтенных байт. Затем прочтенные данные печатаются побайтно и если будет обнаружен символ ‘#’ — значит COMServer закончил работу и этой программе нужно сделать то же самое.
#include #include #include «SerialGate.h» int main() < int port = 2; int rate = 57600; SerialGate sg; bool res = sg.Open(port, rate); if(res == false) < printf(«Open Error..n»); getch(); return 0; > else < printf(«Open OK. n»); >printf(«Get data from COM port every 1 sec.nn»); char buf[20]; int dwBytesRead = 0; bool terminate = false; while(!terminate) < Sleep(1000); dwBytesRead = sg.Recv(buf, sizeof(buf)); for(int i = 0; i < dwBytesRead; i++) < printf(«%c», buf[i]); if(buf[i] == ‘#’) < terminate = true; break; > > > sg.Close(); return 0; >
Настало время протестировать всю эту систему. Проверьте, соединили ли Вы порты кабелем. Компилируем и запускаем оба приложения. В программе COMServer набираем какой-либо текст с клавиатуры — с некоторой задержкой он должен появиться в окне программы COMClient.
В следующих статьях мы напишем Windows приложение для приема/передачи данных и рассмотрим другие возможности библиотеки.
Источник: kernelchip.ru
Работа с COM портом на C++ в Windows
Последовательные порты полюбились разработчикам за их простоту в обслуживании и использовании.
И конечно же писать в консоль терминальной программы это всё хорошо, но хочеться своё приложение, которое по нажатии клавиши на экране выполняет нужные вам действия
В этой статье опишу как работать с com портом на языке Си++.
Решение простое, но почемуто рабочий пример найден был не сразу. За сим сохраняю его тут.
Конечно вы можете использовать кроссплатформенные решения вроде QSerial — библиотеки в составе Qt, я наверное так и сделаю, но в будующем. Сейчас же речь о «чистом» виндовском C++. Писать будем в Visual Studio. У меня 2010, хотя роли это никакой не играет…
Создаём новый консольный Win32 проект.
Инклудим header файлы:
#include #include using namespace std;
Объявляем обработчик com порта:
HANDLE hSerial;
Я делаю это глобально, чтобы не заморачиваться с указателями при передаче его в функции.
Дальше начинаем формировать функцию main:
int _tmain(int argc, _TCHAR* argv[])
Терпеть не могу виндовский стиль программирования. Обозвали всё посвоему и сидят радуются…
Теперь магия объявления строки с именем порта. Дело в том, что char оно преобразовывать само не умеет.
LPCTSTR sPortName = L»COM1″;
Работа с последоавательными портами в Windows проходит как с файлом. Открываем первый ком порт для записи/чтения:
hSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hSerial==INVALID_HANDLE_VALUE) < if(GetLastError()==ERROR_FILE_NOT_FOUND) < cout cout
Теперь нужно настроить параметры соединения:
DCB dcbSerialParams = ; dcbSerialParams.DCBlength=sizeof(dcbSerialParams); if (!GetCommState(hSerial, cout dcbSerialParams.BaudRate=CBR_9600; dcbSerialParams.ByteSize=8; dcbSerialParams.StopBits=ONESTOPBIT; dcbSerialParams.Parity=NOPARITY; if(!SetCommState(hSerial, Hello from C++»; // строка для передачи DWORD dwSize = sizeof(data); // размер этой строки DWORD dwBytesWritten; // тут будет количество собственно переданных байт
Посылаем строку. Напомню, что пример простейший, поэтому никаких особо проверок я не делаю:
BOOL iRet = WriteFile (hSerial,data,dwSize,
Также я решил вывести для контроля размер строки и количество отосланных байт:
cout
В конце программы делаем бесконечный цикл чтения данных:
while(1) < ReadCOM(); >return 0; >
Теперь функция чтения:
void ReadCOM() < DWORD iSize; char sReceivedChar; while (true) < ReadFile(hSerial, iSize, 0); // получаем 1 байт if (iSize >0) // если что-то принято, выводим cout >
Вот собственно и весь пример.
Я создал виртуальный com порт. И слал из COM1 в COM2:
Из нашей программы было отправлено «Hello from C++», а из терминала «hello how2.org.ua».
Источник: blablacode.ru