Форум программистов, компьютерный форум CyberForum.ru

Проблемка winapi - C++

Войти
Регистрация
Восстановить пароль
 
Korbofos
3 / 3 / 0
Регистрация: 15.08.2011
Сообщений: 139
12.02.2012, 16:23     Проблемка winapi #1
Нужно считать байты пришедшие по ком порту.
Проблема в том что точное количество пришедших байт я незнаю.
Взял пример:
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
DWORD WINAPI ReadThread(LPVOID)
{
 COMSTAT comstat;       //структура текущего состояния порта, в данной программе используется для определения количества принятых в порт байтов
 DWORD btr, temp, mask, signal; //переменная temp используется в качестве заглушки
 
 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)) //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent
      if((mask & EV_RXCHAR)!=0)                 //если произошло именно событие прихода байта
       {
        ClearCommError(COMport, &temp, &comstat);       //нужно заполнить структуру COMSTAT
        btr = comstat.cbInQue;                              //и получить из неё количество принятых байтов
        if(btr)                                     //если действительно есть байты для чтения
        {
         ReadFile(COMport, bufrd, btr, &temp, &overlapped);     //прочитать байты из порта в буфер программы
         rx_counter+=btr;                                          //увеличиваем счётчик байтов
                                    //вызываем функцию для вывода данных на экран и в файл
        }
       }
    }
  }
}
Сделал такую функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Com
{
protected:
static unsigned char rx_buf[BUFSIZE], tx_buf[BUFSIZE];
static unsigned char tx_count, rx_index, rx_count;
public:
void open(void);
void pclose(void);
void write(unsigned char data);
void send(void);
unsigned char read(void);
void clear_data(void);
};
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
unsigned char Com::read(void)
{
unsigned char data;
if(!rx_count)
{
COMSTAT comstat;
DWORD btr, temp, mask, signal;
overlapped.hEvent = CreateEvent(NULL, true, true, NULL);
SetCommMask(COMport, EV_RXCHAR);
 
 do{
    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, rx_buf, btr, &temp, &overlapped);
          rx_count+=btr;
 
         }
        }
     }
 
 }while(!rx_count);
CloseHandle(overlapped.hEvent);
}
data=rx_buf[rx_index++];
if(!--rx_count)rx_index=0;
return data;
}
Проблема том что запускается функция в потоке. При первом запуске потока функция работает нормально. А вот при повторном запуске потока выскакивает ошибка.
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
DWORD WINAPI MyroboThread(LPVOID)
{
Robo r;
Com c;
 
 
if(nead_read)
  {
   switch (c.read())
   {
   case 0:
   r.synchronization();
   break;
   case 1:
   param1=c.read();
   param2=c.read();
   r.radar_read(param1,param2);
   break;
   case 2:
   r.read_sensor(c.read());
   break;
   case 3:
   break;
   case 4:
   break;
   case 5:
   break;
   case 6:
   ls.show_deg();
   break;  // */
   default:
   r.synchronization();
   break;
   }
  nead_read--;
  }
}
}
Подскажите в чём дело?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2012, 16:23     Проблемка winapi
Посмотрите здесь:

C++ Проблемка с cin
Проблемка с массивами C++
Проблемка с инициализацией C++
C++ Небольшая проблемка)
C++ Проблемка с массивом
C++ Проблемка
В чем проблемка? C++
Проблемка с указателями C++
Проблемка C++
Проблемка с exit C++
Проблемка с g++ C++
C++ Проблемка с Code::Blocks

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 03:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru