С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 22.04.2016
Сообщений: 40

Зависание программы из-за COM порта

11.07.2016, 12:21. Показов 2120. Ответов 2

Студворк — интернет-сервис помощи студентам
Всем добрый день!
Подскажите, пожалуйста, почему же зависает программа, считывающая данные по COM порту?
Программу написал в Builder-е, скорость по порту установил 115200*20. Зависает через некоторое время или сразу при переключении окна.
Инициализация:
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
int COMOpen(String portname)
{
 
 DCB dcb;
 COMMTIMEOUTS timeouts;
 String COMportNAME = " " + portname;
 
 COMport = CreateFile(AnsiString(COMportNAME.c_str()).c_str(),GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
 
 if(COMport == INVALID_HANDLE_VALUE)
  {
 
   Form1->Memo1->Lines->Add("Com port can't open");
   return 1;
  }
 
if(!SetupComm(COMport, 2048, 2048)) {Form1->Memo1->Lines->Add("error (((");return 1; }
 
 dcb.DCBlength = sizeof(DCB);
 
 if(!GetCommState(COMport, &dcb))
  {
 
   COMClose();
 
String qq = "error DCB, "; qq +=String(GetLastError());
   Form1->Memo1->Lines->Add(qq);
   return 1;
  }
 
 dcb.BaudRate = 115200*20;//115200*28;  //115200*16; = 1843200 = 184'320 byte/s = 1'474'560 bit/s;
 dcb.fBinary = TRUE;
 dcb.fOutxCtsFlow = FALSE;
 dcb.fOutxDsrFlow = FALSE;
 dcb.fDtrControl = DTR_CONTROL_DISABLE;
 dcb.fDsrSensitivity = FALSE;
 dcb.fNull = FALSE;
 dcb.fRtsControl = RTS_CONTROL_DISABLE;
 dcb.fAbortOnError = FALSE;
 dcb.ByteSize = 8;
 dcb.Parity = 0;
 dcb.StopBits = 0;
 
 if(!SetCommState(COMport, &dcb))
  {
   COMClose();
   Form1->Memo1->Lines->Add("error DCB");
   return 1;
  }
 
 timeouts.ReadIntervalTimeout = 5000; //100; 
 timeouts.ReadTotalTimeoutMultiplier = 1000;//15;
 timeouts.ReadTotalTimeoutConstant = 5000;//100;
 timeouts.WriteTotalTimeoutMultiplier = 1000;//15; 
 timeouts.WriteTotalTimeoutConstant = 5000;//100; 
 
 if(!SetCommTimeouts(COMport, &timeouts))
  {
   COMClose();
   Form1->Memo1->Lines->Add("error");
   return 1;
  }
 
 SetupComm(COMport,2000,2000);
 PurgeComm(COMport, PURGE_RXCLEAR);
 
 reader = CreateThread(NULL, 0, ThreadRead, NULL, 0, NULL);
 return 0;
}
Прием:
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
DWORD WINAPI ThreadRead(LPVOID lpParam)                                         //ThreadRead
{
 
 COMSTAT comstat;
 DWORD btr, temp, mask, signal;
 unsigned char bufrd_rez[1024];
 
 overlapped.hEvent = CreateEvent(NULL, true, true, NULL);
 SetCommMask(COMport, EV_RXCHAR);
 while(1)
  {
   WaitCommEvent(COMport, &mask, &overlapped);
   signal = WaitForSingleObject(overlapped.hEvent, INFINITE);
   if(signal == WAIT_OBJECT_0)
    {
     if(GetOverlappedResult(COMport, &overlapped, &temp, true))
      if((mask & EV_RXCHAR)!=0)
       {
        ClearCommError(COMport, &temp, &comstat);
        btr = comstat.cbInQue;
        if(btr)
        {
         ReadFile(COMport, bufrd_rez, btr, &temp, &overlapped);
 
          if (btr != 0) {
            DWORD cnt=0;
            for (cnt = 0; cnt < btr; cnt++) {
                        unsigned char RxDtat = (bufrd_rez[cnt]&0xFF);
 
            }
            }
        }
       }
    }
  }
 
}
Повышал приоритет (SetThreadPriority(reader,THREAD_PRIORIT Y_HIGHEST); ), значения все менял, (INFINITE, timeout, буфер), но ничего не помогает!(
В чем может быть проблема? Почему виснет программа!? Подскажите, пожалуйста!!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.07.2016, 12:21
Ответы с готовыми решениями:

Зависание порта
Может ли подвиснуть сокет? а точнее весь порт. То есть чтение из любого нового сокета подключенного к порту перестанет работать. ...

QSerial и зависание COM порта
Доброго времени суток форумчане. Понадобилось тут для отладки сделать простенькую прогу которая по СОМ-порту принимает поток данных и...

Зависание оконного приложения при прослушке порта
private void button1_Click(object sender, EventArgs e) { TcpListener listner = new TcpListener(new...

2
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
12.07.2016, 09:26
При открытии порта у Вас не правильно указан параметр dwFlagsAndAttributes. Здесь видим описание параметра:
dwFlagsAndAttributes
[in] Атрибуты и флажки файла.
Ниже следуют атрибуты и флажки файла, которые используются только для объектов файла, а не для других объектов, создаваемых функцией CreateFile.
Таким образом, порт необходимо открывать с параметром dwFlagsAndAttributes равным 0.

Далее, максимальная скорость порта, как говорится тут может быть равна CBR_256000, то есть 256000 бод, а не 115200*20=2304000 бод.

На счет скорости порта утверждать не буду. А вот на счет параметра dwFlagsAndAttributes уверен точно, так как если открыть порт с параметром FILE_FLAG_OVERLAPPED, то функции WriteFile и ReadFile не читают и не отправляют данные из/в порт. Кроме этого, Вы уверены, что в зависании виновата работа с портом, а не работа потока?
0
1 / 1 / 0
Регистрация: 22.04.2016
Сообщений: 40
12.07.2016, 13:44  [ТС]
Цитата Сообщение от d7d1c Посмотреть сообщение
порт необходимо открывать с параметром dwFlagsAndAttributes равным 0.
В результате моих ковыряний, выяснилось, что флаг FILE_FLAG_OVERLAPPED позволяет считывать данные по событию (signal = WaitForSingleObject(overlapped.hEvent, INFINITE); ). Тем самым поток ждет входные данные "функционально"(если можно так выразится), а не постоянно перепроверяет входной буфер.

Интересно, что на компе программа нормально работает, а на ноутбуке постоянно подвисает(( Может надо не приоритет потока повышать, а программы..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.07.2016, 13:44
Помогаю со студенческими работами здесь

Постепенное выполнение программы/зависание программы при выполнении
Собственно есть вопрос, возможно очень даже глупый, но все же спрошу: почему при выполнении большого кол-ва операций программа повисает, а...

Зависание программы
Доброго времени суток, у меня такая проблема, что я пишу лаунчер с автообнолением файлов. Так вот проблема в том, что при загрузке...

Зависание программы
При каждом выходе из программы у меня появляется такое окошко (иногда и не одно) и приходится каждый раз заходить в диспетчер задач и...

Зависание программы
Добрый день. Первая попытка написания простого сервера. Программа во время запуска зависает на 43 строке: int cfd = accept(i, ...

Зависание программы
Пишу программу на делфи и в ней есть цикл с большим условием, из-за которого программа зависает, кто может подсазать в чем проблема? ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru