Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/40: Рейтинг темы: голосов - 40, средняя оценка - 4.60
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382

Подключение устройства по COM порту RS232

03.11.2020, 08:52. Показов 8726. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогите пожалуйста подключить устройство по сом порту и считать данные.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.11.2020, 08:52
Ответы с готовыми решениями:

Обращение к COM порту по протоколу RS232
Люди у меня на кафедре SAW RFID и нужно написать прогу которая бы управляла бы им в Visual C++. Всё практически готово кроме самой...

Программа управления проектором Nec моделей VT60, VT70, VT80, VT90, VT700, LT170 по порту Rs232
Помогите написать программку на С++ или ассемблере, которая посылала бы простейшие команды на проектор, уже неделю пытаюсь разобраться,...

Поиск устройства подключенного к COM порту
Здравствуйте. Возник у меня вопрос. Заказали мне сделать одну железяку которая по звонку с сотового телефона открывает шлагбаум если номер...

32
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
22.12.2020, 14:12  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от САлександр Посмотреть сообщение
Все возможно, включая таймауты а также DTR и RTS. Можно предположить, что первым обращением к устройству должна идти правильная команда его "инициализации". Гадать можно долго. Проще было бы ответить на Реальный, именно тот который Вы написали, а он не работает.
Вот что написано
Кликните здесь для просмотра всего текста
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
68
69
70
71
72
73
74
75
76
77
78
79
80
void __fastcall TForm1::out_port_GEN (int a)
{
DCB          *dcb;
COMMTIMEOUTS  ct;
LPVOID lpMsgBuf;
char  buf_out;
String A;
if(!a)
{
 
 dcb=(DCB*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DCB));
 dcb->DCBlength=sizeof(DCB);
 BuildCommDCB(L"baud=9600 parity=N data=8 stop=1",dcb);
 dcb->fDtrControl=DTR_CONTROL_ENABLE;
 dcb->fRtsControl=RTS_CONTROL_DISABLE;
ct.ReadIntervalTimeout=1000;
 ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=20;
 ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=10;
 port=CreateFile(L"\\\\.\\COM25",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
                (LPTSTR) &lpMsgBuf,0,NULL
               );
 A=(LPTSTR)lpMsgBuf; LocalFree(lpMsgBuf);
 if(port==INVALID_HANDLE_VALUE)
  {
   ShowMessage(" Невозможно открыть последовательный порт. "+A);
   CloseHandle(port);  port=0;
  } else{ SetCommState(port,dcb); SetCommTimeouts(port,&ct);
          PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR);}
 HeapFree(GetProcessHeap(),0,dcb);
}
else {
       PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR);
       CloseHandle(port);  port=0;
     }
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String s,Result;
if(!port) out_port_GEN(0);
if(port){
            Label1->Caption="открыт COM порт";//здесь я посылаю на физ ус-во команды
            bufwr[0]= 'M';
            WriteFile(port, bufwr, strlen(bufwr), &temp, NULL);
            Sleep(500);
            bufwr[0]='P';
            WriteFile(port, bufwr, strlen(bufwr), &temp, NULL);
            Sleep(500);
            bufwr[0]='?';
            WriteFile(port, bufwr, strlen(bufwr), &temp, NULL);
            Sleep(2000);
            Result=' ';
            //ShowMessage("Ошибка чтения!");
            if (!ReadFile(port,bufrd,strlen(bufrd),&temp,NULL))
                {
                ShowMessage("Ошибка чтения!");
                 exit;
                } else
                {
                    ReadFile(port,bufrd,strlen(bufrd),&temp,NULL);//сюда у меня приходит программа
//но в итоге temp равен 1, и результата никакого. 
                   ShowMessage(temp);
                    for (int i = 6; temp-1; i++)
                    {
                        s=s +bufrd[i];
                        Result=s[i];
                        Memo1->Lines->Add(Result);
                    }
 
                }
 
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(port) out_port_GEN(1);
if(!port) Label1->Caption="COM порт закрыт";
}
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.12.2020, 15:07
Проще всего взять сторонний компонент TBComPort
Или пересесть на С++Qt и использовать класс QSerialPort или boost/asio или вообще на Python

С WinAPi мутная тема, в интернете нормальных примеров/объяснений нет, только какое-то рупопство, пока разберешься куча времени уйдет.
0
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
23.12.2020, 10:12  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Проще всего взять сторонний компонент TBComPort
Или пересесть на С++Qt и использовать класс QSerialPort или boost/asio или вообще на Python

С WinAPi мутная тема, в интернете нормальных примеров/объяснений нет, только какое-то рупопство, пока разберешься куча времени уйдет.
А как установить TBComPort ? Можно поподробнее?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.12.2020, 13:00
Поищите по форуму где-то уже обсуждалось в этом разделе.
0
483 / 275 / 57
Регистрация: 08.10.2015
Сообщений: 1,190
23.12.2020, 16:08
PierL, что Вы хотите прочитать? У Вас какое-то устройство подключено или просто перемычка RX-TX?
Судя по попытке просто чтения после записи - у Вас перемычка. По программе что-то сказать трудно, вроде бы все должно работать.
Попробуйте после записи посмотреть содержимое bufwr, соответствует посланному в порт?
Попробуйте сделать точку остановки в стр.63 и посмотрите содержимое bufw, bufrd,temp. Кстати что это?
Для чего buf_out (стр.6)?
Вот у Вас: bufwr[0]= 'M'; strlen(bufwr) выдаст 1, а сколько это в байтах? (Вдруг 2?)
// сомнения из-за юникода, ведь уже были проблемы.
0
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
24.12.2020, 11:10  [ТС]
что Вы хотите прочитать?
У меня физическое устройство! Записывает температуры, чтобы их скинуть на комп надо подключить по СОМ порту.
На DELPHI 7 (код в теме выше есть) все работает, подключается отлично.
Попробуйте после записи посмотреть содержимое bufwr, соответствует посланному в порт?
Попробуйте сделать точку остановки в стр.63 и посмотрите содержимое bufw, bufrd,temp. Кстати что это?
Для чего buf_out (стр.6)?
Вот у Вас: bufwr[0]= 'M'; strlen(bufwr) выдаст 1, а сколько это в байтах? (Вдруг 2?)
// сомнения из-за юникода, ведь уже были проблемы.
Попробую, хотя по этому поводу я не компетентен.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
24.12.2020, 13:00
Цитата Сообщение от PierL Посмотреть сообщение
На DELPHI 7 (код в теме выше есть) все работает, подключается отлично.
Ну так и подключайте к проекту паскалевский юнит, - меньше будет проблем.
0
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
24.12.2020, 13:13  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Ну так и подключайте к проекту паскалевский юнит, - меньше будет проблем.
Да ладно, а как это сделать?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.12.2020, 13:28
Добавлялку в проект отростить?
0
483 / 275 / 57
Регистрация: 08.10.2015
Сообщений: 1,190
24.12.2020, 13:50
Цитата Сообщение от PierL Посмотреть сообщение
Попробую
Но ведь посмотреть содержимое bufw, bufrd,temp - это же дело нескольких секунд! Может сразу ясности добавится.
0
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
31.12.2020, 11:00  [ТС]
Цитата Сообщение от САлександр Посмотреть сообщение
Но ведь посмотреть содержимое bufw, bufrd,temp - это же дело нескольких секунд! Может сразу ясности добавится.
Ничего не приходит! по нулям
0
483 / 275 / 57
Регистрация: 08.10.2015
Сообщений: 1,190
01.01.2021, 13:33
Что, и сразу же после
C++
1
44 bufwr[0]= 'M';
в bufwr только нули?
0
 Аватар для PierL
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
11.01.2021, 09:39  [ТС]
Цитата Сообщение от САлександр Посмотреть сообщение
Что, и сразу же после
C++
1
44 bufwr[0]= 'M';
в bufwr только нули?
bufwr[0]='M' при просмотре показывает 77(код буквы М)
temp при записи показывает 1
temp при чтении ReadFile показывает 0
bufrd[0] ноль
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.01.2021, 09:39

Цикличестий опрос устройства на COM порту
Доброго времени суток! Пишу программу для опроса контроллера к которому подключены датчики. Опрос датчиков нужно производить циклично но...

Определить имя устройства на com порту
Доброго времени суток! есть считывающее устройство, поставил на него драйвера для создания виртуального com порта в диспетчере устройств...

Интервал ожидания ответа от устройства по последовательному порту
Скажите пожалуйста, Как мне самому задать время ожидания ответа от СОМ-порта? Можно ли добавить это в ShowSetupDialog? Работаю с...

Как получить имя подключенного к порту устройства?
Ребят, как получить имя подключенного к порту устройства? К примеру "Cino FuzzyScan USB Virtual COM Port", все перерыл и нифига не...

Как подсчитать количество считанных пакетов от устройства по Com порту?
Необходимо подсчитать количество поступающих данных от Com порта.. сейчас устройство предаёт данные друг за другом (02, d3, 8d85, ...) .....


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru