Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
1

Функция чтения из порта

15.12.2012, 08:50. Показов 1482. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, проблема в том что comstat.cbInQue возвращает неверное значение, точнее когда как, то верное то не верное. Хотя сниффером видно что ответ устройства 133 байта всегда. Вот весь код. Где что проверить ? как исправить ? Пример запроса/ответа ниже.
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
void __fastcall ReadThreadBVR::Execute()                        //главная функция потока, реализует приём байтов из COM-порта
{
        COMSTAT comstat;                                //структура текущего состояния порта, в данной программе используется для определения количества принятых в порт байтов
        DWORD btr, temp, mask, signal;                          //переменная temp используется в качестве заглушки
        overlapped.hEvent = CreateEvent(NULL, true, true, NULL);//создать сигнальный объект-событие для асинхронных операций
        SetCommMask(COMportBVR, EV_RXCHAR);                     //установить маску на срабатывание по событию приёма байта в порт
        while(!Terminated)                  //пока поток не будет прерван, выполняем цикл
        {
                WaitCommEvent(COMportBVR, &mask, &overlapped);                  //ожидать события приёма байта (это и есть перекрываемая операция)
                signal = WaitForSingleObject(overlapped.hEvent, INFINITE);  //приостановить поток до прихода байта
                if(signal == WAIT_OBJECT_0)                     //если событие прихода байта произошло
                {
                        if(GetOverlappedResult(COMportBVR, &overlapped, &temp, true)) //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent
                        if((mask & EV_RXCHAR)!=0)                     //если произошло именно событие прихода байта
                        {
                                ClearCommError(COMportBVR, &temp, &comstat);        //нужно заполнить структуру COMSTAT
                                btr =133;//comstat.cbInQue;                             //и получить из неё количество принятых байтов
                                if(btr)                                     //если действительно есть байты для чтения
                                {
                                        ReadFile(COMportBVR, bufrd, btr, &temp, &overlapped);//прочитать байты из порта в буфер программы
                                        counter+=btr;//увеличиваем счётчик байтов
                                        Synchronize(Printing);                           //вызываем функцию для вывода данных на экран и в файл
                                }
                        }
                }
        }
        CloseHandle(overlapped.hEvent);//перед выходом из потока закрыть объект-событие
}
Запрос:18.11.2012 9:09:30.26864 (+0.9375 seconds)

02 03 10 02 00 40 E1 09

Ответ:18.11.2012 9:09:30.29964 (+0.0313 seconds)

02 03 80 02 06 35 62 0E 00 0C 0B 12 09 0B 15 7A
2C 50 03 02 C8 8E AB 41 34 90 01 3F 1E 39 7D 3F
DA 71 AB 42 EE 3E 01 44 B8 BF 2E 03 00 00 94 1B
28 00 F2 2F D4 3E 00 00 A6 47 D4 00 4B 04 39 3E
00 00 00 00 00 00 00 00 00 00 01 27 8D 15 C2 F5
3D 7F BE 00 00 00 00 00 00 00 00 00 00 00 00 12
00 00 00 00 00 05 00 00 00 5E 8F 42 3F 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 08 BD 20 F8
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2012, 08:50
Ответы с готовыми решениями:

Не работает поток чтения из COM порта
Программа открывает COM порт и шлет в него 8-ми битное значение. Поток передачи работает: на TX...

Функция чтения из файла на WinAPI
Пытаюсь создать функцию на WinAPI для чтения данных с файла. Ниже приведен мой пример, но он не...

Функция чтения ком порта
Господа помогите новичку. Необходимо написать функцию чтения строк с ком порта длина которых больше...

Оптимизация чтения с COM - порта
И снова здравствуйте, у меня возникла проблема, от которой уже мозги кипят. Разобраться с ней...

0
15.12.2012, 08:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.12.2012, 08:50
Помогаю со студенческими работами здесь

Ошибка чтения порта
Нужно считать байт с порта, я использую операцию in, и записываю в регистр AL (восьмиразрядный),...

Остановка чтения из COM-порта
Здравствуйте, уважаемые. Возник вопрос: как принудительно остановить чтение из COM-порта. у меня...

Метод чтения байтов из порта
Добрый день! Почему ругается компилятор ? Как исправить ? Спасибо! private: System::Void...

Помогите с макросом чтения-записи порта
Всем здрасти! Прошу помощи. Сам не могу разобраться :( Нужно организовать программу чтения и...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru