Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 2
Регистрация: 20.11.2011
Сообщений: 73

Программа зависает при приеме сообщения через com порт

01.11.2013, 21:23. Показов 3684. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
создал один виртуальный порт.Написал программу для чтения и записи по этому порту, но при приёме текста, всё зависает. думаю ошибка возникает при записи.(Проверял на рабочих программах, чтение работает)
код для записи в edit.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HANDLE hFile; 
 char lpBuffer[256]; 
 DWORD lpNumberOfBytesWrite; 
 memset(lpBuffer,sizeof(lpBuffer),0); 
 hFile=CreateFile("COM2",GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL); 
 if (hFile==INVALID_HANDLE_VALUE) 
  { 
  char message[]="Ошибка открытия устройства \"COM2\" !!!\n                     "; 
    LPVOID lpMsgBuf; 
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, 
    NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), 
    (LPTSTR)&lpMsgBuf,0,NULL); 
    strcat(message,(LPTSTR)lpMsgBuf); 
    MessageBox(NULL,message,"Сообщение",MB_OK); 
    LocalFree(lpMsgBuf ); 
  } 
 else 
  { 
   strcpy(lpBuffer,Edit1->Text.c_str()); 
   WriteFile(hFile,lpBuffer,sizeof(lpBuffer),&lpNumberOfBytesWrite,NULL); 
  } 
 CloseHandle(hFile);
код для чтения
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
HANDLE hFile; 
 char lpBuffer[256]; 
 DWORD lpNumberOfBytesRead;
 
 memset(lpBuffer,sizeof(lpBuffer),0);
 hFile=CreateFile("COM2",GENERIC_READ,0,NULL,OPEN_EXISTING,NULL,NULL);
 // SetCommMask(hFile,EV_RXCHAR);
 
 if (hFile==INVALID_HANDLE_VALUE) 
  { 
  char message[]="Ошибка открытия устройства \"COM2\" !!!\n                     "; 
    LPVOID lpMsgBuf; 
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, 
    NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), 
    (LPTSTR)&lpMsgBuf,0,NULL); 
    strcat(message,(LPTSTR)lpMsgBuf); 
    MessageBox(NULL,message,"Сообщение",MB_OK); 
    LocalFree(lpMsgBuf ); 
  } 
 else 
  {   DWORD lpEvtMask ;
 //  WaitCommEvent(hFile,&lpEvtMask,NULL);
   ReadFile(hFile,lpBuffer,sizeof(lpBuffer),&lpNumberOfBytesRead,NULL); 
   Edit1->Text=lpBuffer; 
  } 
 CloseHandle(hFile);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.11.2013, 21:23
Ответы с готовыми решениями:

Программа зависает при приеме файла через NetworkStream
Передаю файл с сервера клиенту. Код клиентской части: FileStream fs = new FileStream(filename, FileMode.Create,...

Зависает клиент при приёме от сервера
С начало сделал посыл данных только от клиента серверу..там всё хорошо далее начал делать обратный, от сервера вроде как всё хорошо...

Зависает при приёме больших данных
не могу разобраться что я делаю с потоком входящих данных не так, при входе большого колличества данных цикл уходит на второй круг и...

10
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
02.11.2013, 03:25
Почитай эту тему, думаю поможет
Работа с КОМ портом. Исходник
0
0 / 0 / 2
Регистрация: 20.11.2011
Сообщений: 73
02.11.2013, 19:01  [ТС]
разобраться не удалось, может кто ещё посмотрит
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
02.11.2013, 19:24
А чего смотреть? Вы саму суть понимаете? Так объясните, чтоб и другие поняли. СОМ2 - это не виртуальный порт; его может не быть на компе, но если он есть, то это уже физически - разъем для коммутации с устройствами. И если вы что-то с него хотите прочесть, то туда нужно что-то и подать в виде информации. А иначе он может ожидать стартовый бит до второго пришествия, или пока тайм-аут не прервет.
1
0 / 0 / 2
Регистрация: 20.11.2011
Сообщений: 73
03.11.2013, 01:22  [ТС]
порт как раз таки виртуальный, создан с помощью спец. программы. Его наверно нужно настроить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
OMMTIMEOUTS lpCommTimeouts;
  dcb.DCBlength = sizeof(DCB);
    dcb.BaudRate = CBR_19200;
  dcb.Parity   = NOPARITY;
  dcb.ByteSize = 8;
  dcb.StopBits = ONESTOPBIT;
 
//  dcb.fBinary = TRUE;                                    //включаем двоичный режим обмена
 dcb.fOutxCtsFlow = TRUE;                              //выключаем режим слежения за сигналом CTS
 dcb.fOutxDsrFlow = TRUE;                              //выключаем режим слежения за сигналом DSR
 dcb.fDtrControl = DTR_CONTROL_ENABLE;                 //отключаем использование линии DTR
 dcb.fDsrSensitivity = FALSE;                           //отключаем восприимчивость драйвера к состоянию линии DSR
// dcb.fNull = FALSE;                                     //разрешить приём нулевых байтов
    dcb.XoffChar = 0 ;
        dcb.XoffLim = 0;
 dcb.fRtsControl = RTS_CONTROL_ENABLE;                 //отключаем использование линии RTS
// dcb.fAbortOnError = TRUE;                             //отключаем остановку всех операций чтения/записи при ошибке
 dcb.ByteSize = 8;
с такими параметрами принимаетсч только жирная палочка, и прога уже не зависает
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
05.11.2013, 12:33
Цитата Сообщение от prostreet Посмотреть сообщение
создал один виртуальный порт
Цитата Сообщение от prostreet Посмотреть сообщение
но при приёме текста, всё зависает
Так отправляет его туда кто?
Когда вы записываете в свой одинокий порт, то данные скорее всего не идут никуда дальше буфера, который ждет, что сейчас к нему подключится запаздывающее устройство и он ему все успешно начнет передавать. А когда же вы хотите считать с порта, то порт говорит: "я жду, я готов. Давай, записывай в меня!". Но никто не пишет. А вам это видится как будто порт повис. (такие вещи кстати делаются обычно из другого потока (и виснет только отдельный поток))
nick42, же вам правильно подсказывает. В таких случаях обычно создаются два виртуальных порта, и каким-нибудь сплиттером ком портов все это дело сочленяется. То есть придется писать две программы (ну или две копии запустить) - на чтение и на запись с каждого виртуально соединенного порта. То есть одна программа пишет в свой порт, другая в это время читает из своего, отличного от предыдущего, порта. Все счастливы и радость общения. Если бы порт был физический, то паяется из скрепок заглушка и запихивается в разъем порта, зеркалирующая отправленные данные обратно на прием.
Цитата Сообщение от nick42 Посмотреть сообщение
СОМ2 - это не виртуальный порт
Почему? У меня вот прям сейчас COM4 виртуальный порт.
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
05.11.2013, 13:40
SatanaXIII, и у меня на домашнем 3 порта: 1-2 - виртуальная пара, СОМ3 - физический (без шаманских действий BIOS его установил как СОМ1). Но в разрезе данной темы думаю, что СОМ1 у ТС в системе существует, и вышеприведенные фрагменты программы инициализируют именно его, а не созданные виртуально порты. Кстати, виртуальные потому и создаются парами, что одиночный порт не имеет смысла, - все равно что однополюсный магнит.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
05.11.2013, 14:02
Цитата Сообщение от nick42 Посмотреть сообщение
Но в разрезе данной темы думаю, что СОМ1 у ТС в системе существует, и вышеприведенные фрагменты программы инициализируют именно его, а не созданные виртуально порты.
А. Ага. Понял.

Цитата Сообщение от nick42 Посмотреть сообщение
Кстати, виртуальные потому и создаются парами, что одиночный порт не имеет смысла
Когда у меня была потребность в создании виртуальных портов, то они создавались пачками. Всмысле больше двух. И перетыкать их надо было. Поэтому я что-то запамятовал, про парное создание. Они прям создаются уже парой? Всмысле нельзя поштучно?

Не по теме:

И у меня кстати такой проблемы с переименовывание портов не было. Они и так все назывались

\\\\.\\com0com#port#CNCA1#{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
где A1 был его номер. :D



Цитата Сообщение от nick42 Посмотреть сообщение
однополюсный магнит
Я бы поглядел. )
0
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
06.11.2013, 04:37
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Я бы поглядел. )

Не по теме:

Достань магнит из гермоблока винчестера, там где управления головками. Там стоят неодимовые магниты, но с одного полюса закрытые металом (незнаю точно каким, надо в вики прочитать) и где есть этот метал, нет магнитного поля. Как-никак, хоть с костылями, но в итоге получается однополюсный магнит.
Подкинте идею, как можно их использовать, а то винтов битых полно ))))

0
0 / 0 / 2
Регистрация: 20.11.2011
Сообщений: 73
07.11.2013, 13:15  [ТС]
всем спасибо за ответы, проблема решена.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
07.11.2013, 13:27
prostreet, было бы очень здорово, если б вы еще и пояснили как была решена проблема. Сейчас вам может это кажется глупой ошибкой, или вообще даже загвоздка была совершенно в другом, но дайте дополнительную надежду человеку, наткнувшемуся на такую же проблему и читающему сейчас эту тему в будущем.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.11.2013, 13:27
Помогаю со студенческими работами здесь

Чат - Обновление страницы браузера при приеме сообщения
Доброе время суток уважаемые форумчане. Пишу небольшой простой чат на CGI. Как сделать обновление страницы в браузаре у пользователя...

Помеха с типом char, при приёме сообщения от клиента к серверу (c++)
Здравствуйте. Программа должна работать следующим образом: сервер на c++ ожидает подключение клиента, после этого отправляет ему сообщение...

Зависает программа (COM порт)
Нужно непрерывно получать данные с ком порта. Пробую без overoapped. Проблема в зависании ReadFile. Пробовал установить COMMTIMEOUTS- не...

Сообщения фиксированной длины через COM порт
Нужно опрашивать прибор по COM порту. Протокол RS232. Я бы мог спросить в других ветках, суть одна - байты. в ветке шарпа народ кажется...

Ошибка при приеме данных через COM (Arduino-Xbee-PC)
Добрый день! Передаю данные с ардуины (Mega2560) через Xbee (EndDevice) на компьютер. К компу подключен второй Xbee (Coordinator). Каждый...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru