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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как правильно ввести два вектора ? http://www.cyberforum.ru/cpp-beginners/thread444984.html
надо чтобы элементы векторов вводились с клавиатуры, а у меня что-то не получается. и еще надо будет найти сумму векторов, но это я уже может сам сделаю:)
C++ Вычислить произведение элементов массива по модулю Дан одномерный массив состоящий из n целых чисел, надо: вычеслить произведение элементов по модулю, которые находятся между максимальным элементом и минимальным ( если возможно с обяснениями) http://www.cyberforum.ru/cpp-beginners/thread444951.html
C++ Какую платформу выбрать новичку? Желательно кроссплатформенную
Немного знаю .NET и C#
Задачи по C++ C++
Есть не сложные задачи, но что бы решить их нужно знать кое что, что я у Вас и хочу спросить: 1. Есть число 1234. Как определить какая из его частей (12 или 34) больше? 2. Есть число 1234. Как сравнить 1е и предпоследнее число? 3. Как поменять последнюю и первую цифры числа местами? Спасибо за ответы!
C++ Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? http://www.cyberforum.ru/cpp-beginners/thread444937.html
Начать с массивов, допустим То есть ситуация такая: пусть имеется два потока и глобальный массив элементов int из двух элементов, один поток выводит в цикле значение нулевого элемента, а второй- значение первого; вот сижу думаю- могут ли они перепутать элементы? С одной стороны не могут потому как обращение к элементу по индексу однозначаено идентифицирует этот элемент; а с другой стороны,...
C++ Дан одномерный массив состоящий из n целых чисел, надо: вычеслить сумму положительных элементов Дан одномерный массив состоящий из n целых чисел, надо: вычеслить сумму положительных элементов подробнее

Показать сообщение отдельно
Korbofos
4 / 4 / 0
Регистрация: 15.08.2011
Сообщений: 154

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

12.02.2012, 16:23. Просмотров 532. Ответов 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
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--;
  }
}
}
Подскажите в чём дело?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru