Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
35 / 28 / 10
Регистрация: 11.04.2022
Сообщений: 197

Открытие com порта через WinAPI

20.03.2023, 12:55. Показов 1397. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Вопрос следующий: в unix системах имеется termios, там как-то все понятнее, здесь подключение к ком-порту осуществляется через WinAPI. Создаю структуру для примера, ввожу настройки, в бесконечном цикле пытаюсь принимать/передавать. Компилирую через g++. Для теста была использована плата arduino. Если попытаться запустить просто .exe, то прием/передача не пойдет, просто висит программа внутри без каких-либо выводов, однако, если сначала запустить ардуино IDE, открыть там монитор компорта (передача с платы ардуино символа пойдет), потом отключиться и снова запустить программу, уже в консоли, то все начинает работать до отключения физического кабеля. В чем может быть проблема, я не использовал структуру COMMTIMEOUTS, мб там IDE по умолчанию настраивает параметры подключения...
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <Windows.h>
#include <thread>
#include <cstring>
#include <string>
 
int main()
{   
    std::string const str = "COM7";
    DWORD data{ 0x10 };
    DWORD data1{ 0xAA };
    HANDLE hserial = CreateFile(str.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
    //COMMTIMEOUTS htimeSetiings;
    if (hserial == INVALID_HANDLE_VALUE)
    {
        std::cout << "Error opening port\n";
    }
 
    DCB comSetting;
 
    memset(&comSetting, 0, sizeof(comSetting));
    comSetting.DCBlength            = sizeof(DCB);
    comSetting.BaudRate             = CBR_115200;
    comSetting.ByteSize             = 8;
    comSetting.fParity              = NOPARITY;
    comSetting.StopBits             = ONESTOPBIT;
    comSetting.fBinary              = TRUE;
    comSetting.fParity              = FALSE;
    comSetting.fOutxCtsFlow         = FALSE;
    comSetting.fOutxDsrFlow         = FALSE;
    comSetting.fDtrControl          = DTR_CONTROL_DISABLE;
    comSetting.fRtsControl          = RTS_CONTROL_DISABLE;
    comSetting.fDsrSensitivity      = FALSE;
    comSetting.fTXContinueOnXoff    = FALSE;
 
    bool state = GetCommState(hserial, &comSetting);
    if (!state)
    {
        std::cout << "Error set settings DCB structure\n";
    }
 
 
    DWORD numofBytesWrite = 0;
    DWORD numofBytesRead  = 1;
    uint8_t buf{ 'a'};
    while (1)
    {
 
        if (!ReadFile(hserial, &buf, numofBytesRead, &numofBytesWrite, 0))
        {
            std::cout << "error reading";
            break;
        }
        std::cout << buf << '\n';
 
        if (!WriteFile(hserial, &data, numofBytesRead, &numofBytesWrite, 0))
        {
            std::cout << "error transmit " << (int)numofBytesWrite << '\n';
            break;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
 
    }
 
    CloseHandle(hserial);
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.03.2023, 12:55
Ответы с готовыми решениями:

Открытие COM порта (WinAPI)
Открываю ком порт следующим кодом bool OpenPort(String Com,int Baud,Char Parity,int Data,String Stop,Char Control) { DCB *vDCB;...

Открытие COM порта
Доброго времени суток. Я в C++ новичок т.ч. не пинайте если ситуация банальная, но долгое гугление ни к чему не привело. Ситуация такая,...

Открытие порта
Как на роутере D-Link DIR 300NRU открыть порт 25565? Может ли такое быть, что этот порт закрыт у провайдера, как это проверить и как с этим...

7
Злостный нарушитель
 Аватар для Verevkin
10236 / 5665 / 1260
Регистрация: 12.03.2015
Сообщений: 26,257
20.03.2023, 12:59
Цитата Сообщение от Enyt Посмотреть сообщение
однако, если сначала запустить ардуино IDE, открыть там монитор компорта, потом отключиться и снова запустить программу, то все начинает работать
Ну очевидно жэж, что левая прога (в данном случае IDE) настраивает порт правильно, а после выхода эти настройки сохраняются в микросхеме порта (а мож тупо в реестре, я хз). Ты б поковырял интырнеты, на гитхубе и стековерлов полно примеров работы с портами серез WinAPI.
0
Эксперт .NET
 Аватар для Rius
13028 / 7595 / 1662
Регистрация: 25.05.2015
Сообщений: 23,124
Записей в блоге: 14
20.03.2023, 13:00
Ардуинам нужны правильные DTR/RTS. Смотрите сниффером, как работает Arduino IDE.

По самим портам: «Не отвечает» com порт
0
Злостный нарушитель
 Аватар для Verevkin
10236 / 5665 / 1260
Регистрация: 12.03.2015
Сообщений: 26,257
20.03.2023, 13:09
Почему я у тебя не вижу инициализации через функцию SetCommState?
0
35 / 28 / 10
Регистрация: 11.04.2022
Сообщений: 197
20.03.2023, 13:12  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Ну очевидно жэж, что левая прога (в данном случае IDE) настраивает порт правильно
спасибо капитан)
Цитата Сообщение от Rius Посмотреть сообщение
Ардуинам нужны правильные DTR/RTS.
сам не настраивал до этого явно для работы в убунту, но там все передавалось без этих плясок.
Уточнение, что тормозит чтение, если закомменить его, то шлет на плату символ корректно.

Добавлено через 2 минуты
Цитата Сообщение от Verevkin Посмотреть сообщение
Почему я у тебя не вижу инициализации через функцию SetCommState?
а она разве не для асинхронного режима с прерываниями? у меня синхронный режим пока.
0
Злостный нарушитель
 Аватар для Verevkin
10236 / 5665 / 1260
Регистрация: 12.03.2015
Сообщений: 26,257
20.03.2023, 13:14
Цитата Сообщение от Enyt Посмотреть сообщение
а она разве не для асинхронного режима с прерываниями?
Не знаю. Читай сюда.
0
35 / 28 / 10
Регистрация: 11.04.2022
Сообщений: 197
20.03.2023, 13:16  [ТС]
да, уже открыл, похоже ерунду сказал)
0
Злостный нарушитель
 Аватар для Verevkin
10236 / 5665 / 1260
Регистрация: 12.03.2015
Сообщений: 26,257
20.03.2023, 13:23
Цитата Сообщение от Enyt Посмотреть сообщение
да, уже открыл, похоже ерунду сказал)
Да нагугли ты себе примеров, в интырнетах их дикие ТЫЩЩИ! Хватит ерундой заниматься и в угадайку играть.
Сюда читай.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.03.2023, 13:23
Помогаю со студенческими работами здесь

Открытие COM порта
Добрый день. При работе программы на компьютере мне время от времени нужно передавать и принимать данные по СОМ порту. Очевидно, что...

Открытие порта
Здравствуйте. Подскажите, пожалуйста, как открыть 21 порт? Модем P660HT3 EE. Версия прошивки: A01.03(AC.0)b6. Провайдер Ростелеком,...

Открытие порта
Вход в систему http:\\****:8085\ с любой машины без Proxy проходит нормально, там отоборажаются все формы документов с различными...

Открытие 80 порта
Здраствуйте, у меня стоят 2 компа, один для роботы, второй для сервера с windows server 2012, пытался сделать сам, посмотрел видео на...

Открытие порта
Компьютер подключен к интернет через модем D-link 2500u и роутер D-link dir 300 (телефонный кабель в модем, из модема lan кабель в роутер в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru