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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Korbofos
4 / 4 / 0
Регистрация: 15.08.2011
Сообщений: 154
#1

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

12.02.2012, 16:23. Просмотров 536. Ответов 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--;
  }
}
}
Подскажите в чём дело?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2012, 16:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблемка winapi (C++):

Проблемка - C++
Доброго всем времени суток. Подскажите,что это за ошибка и что не так? // linaer_system.cpp : Defines the entry point for the console...

Проблемка - C++
#include "stdafx.h" #include <math.h> #include <iostream> int _tmain(int argc, _TCHAR* argv) { setlocale (LC_ALL,"Russian");...

Проблемка с g++ - C++
Вот недавно установил винду (раньше была линь), и хотел чтоб всё было привычно, установил g++ компилятор, всё ок, взял написал код самый...

Проблемка с указателями - C++
Нужно перегрузить "+" чтобы он делал слияние 2ух массивов(элементы не повторялись) вот код: #include <iostream.h> #include...

Проблемка с exit - C++
Пример из книги. #include <iostream> #include <iomanip> // для setw() #include <process.h> // для exit() using...

Небольшая проблемка) - C++
Всем доброго времени суток, у меня возникла проблема с напиванием одной программы задание следующее :"Написать функцию нахождения MAX среди...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2012, 16:23
Привет! Вот еще темы с ответами:

В чем проблемка? - C++
Сделал метод итерации, но програма после компиляции как бегущая строка... в чем ошибка програми? #include <iostream.h> #include...

Проблемка с cin - C++
Мне нужно сделать так, чтобы в конце программы нажимался "enter". Ну, как в паскалеreadln;

Проблемка с массивами - C++
В Си++ я недавно и возник вопрос. Есть к примеру массив a. Есть ли функция, определяющая конечный индекс массива? :scratch:

Проблемка с массивом - C++
Всем привет, в общем у меня такая задача: в целочисленном массиве после каждых 3х отрицательных чисел идущих подряд вставить 0. Например...


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

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

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