0 / 0 / 2
Регистрация: 20.11.2011
Сообщений: 73
1

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

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

Author24 — интернет-сервис помощи студентам
создал один виртуальный порт.Написал программу для чтения и записи по этому порту, но при приёме текста, всё зависает. думаю ошибка возникает при записи.(Проверял на рабочих программах, чтение работает)
код для записи в 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...

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

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

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

10
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
02.11.2013, 03:25 2
Почитай эту тему, думаю поможет
Работа с КОМ портом. Исходник
0
0 / 0 / 2
Регистрация: 20.11.2011
Сообщений: 73
02.11.2013, 19:01  [ТС] 3
разобраться не удалось, может кто ещё посмотрит
0
Практикантроп
4840 / 2725 / 533
Регистрация: 23.09.2011
Сообщений: 5,795
02.11.2013, 19:24 4
А чего смотреть? Вы саму суть понимаете? Так объясните, чтоб и другие поняли. СОМ2 - это не виртуальный порт; его может не быть на компе, но если он есть, то это уже физически - разъем для коммутации с устройствами. И если вы что-то с него хотите прочесть, то туда нужно что-то и подать в виде информации. А иначе он может ожидать стартовый бит до второго пришествия, или пока тайм-аут не прервет.
1
0 / 0 / 2
Регистрация: 20.11.2011
Сообщений: 73
03.11.2013, 01:22  [ТС] 5
порт как раз таки виртуальный, создан с помощью спец. программы. Его наверно нужно настроить
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
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
05.11.2013, 12:33 6
Цитата Сообщение от prostreet Посмотреть сообщение
создал один виртуальный порт
Цитата Сообщение от prostreet Посмотреть сообщение
но при приёме текста, всё зависает
Так отправляет его туда кто?
Когда вы записываете в свой одинокий порт, то данные скорее всего не идут никуда дальше буфера, который ждет, что сейчас к нему подключится запаздывающее устройство и он ему все успешно начнет передавать. А когда же вы хотите считать с порта, то порт говорит: "я жду, я готов. Давай, записывай в меня!". Но никто не пишет. А вам это видится как будто порт повис. (такие вещи кстати делаются обычно из другого потока (и виснет только отдельный поток))
nick42, же вам правильно подсказывает. В таких случаях обычно создаются два виртуальных порта, и каким-нибудь сплиттером ком портов все это дело сочленяется. То есть придется писать две программы (ну или две копии запустить) - на чтение и на запись с каждого виртуально соединенного порта. То есть одна программа пишет в свой порт, другая в это время читает из своего, отличного от предыдущего, порта. Все счастливы и радость общения. Если бы порт был физический, то паяется из скрепок заглушка и запихивается в разъем порта, зеркалирующая отправленные данные обратно на прием.
Цитата Сообщение от nick42 Посмотреть сообщение
СОМ2 - это не виртуальный порт
Почему? У меня вот прям сейчас COM4 виртуальный порт.
1
Практикантроп
4840 / 2725 / 533
Регистрация: 23.09.2011
Сообщений: 5,795
05.11.2013, 13:40 7
SatanaXIII, и у меня на домашнем 3 порта: 1-2 - виртуальная пара, СОМ3 - физический (без шаманских действий BIOS его установил как СОМ1). Но в разрезе данной темы думаю, что СОМ1 у ТС в системе существует, и вышеприведенные фрагменты программы инициализируют именно его, а не созданные виртуально порты. Кстати, виртуальные потому и создаются парами, что одиночный порт не имеет смысла, - все равно что однополюсный магнит.
0
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
05.11.2013, 14:02 8
Цитата Сообщение от 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 9
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Я бы поглядел. )

Не по теме:

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

Новые блоги и статьи
Интеграция Arduino и ChatGPT: Практическое руководство
InfoMaster 16.01.2025
В современную эпоху технологических инноваций интеграция искусственного интеллекта с микроконтроллерами открывает принципиально новые возможности для создания умных устройств и автоматизированных. . .
Как создать робота, управляемого ChatGPT
InfoMaster 16.01.2025
Концепция проекта В современную эпоху искусственный интеллект и робототехника становятся все более доступными для энтузиастов и разработчиков. Создание роботизированной руки, управляемой ChatGPT,. . .
Как создать ChatGPT бота в Telegram на Python
InfoMaster 16.01.2025
В современном мире технологии искусственного интеллекта становятся все более доступными для разработчиков, открывая новые возможности для создания умных и интерактивных приложений. Одним из самых. . .
Машинное обучение с помощью Python
InfoMaster 16.01.2025
Машинное обучение стало неотъемлемой частью современных технологий, позволяя компьютерам учиться на основе данных и принимать решения без явного программирования. В сочетании с языком. . .
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru