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

Com порт, асинхронное чтение не возвращает весь ответ

16.01.2019, 12:23. Показов 1071. Ответов 2

Author24 — интернет-сервис помощи студентам
День добрый, пишу софтинку для личного ползования, а конкретно опрос ИБП через com порт по протоколу megatec, все вроде неплохо, но столкнулся с одной особенностью.

Если я ставлю Sleep(1000) после отправки запроса "Q1\r" в ИБП, то ответ приходит полностью, независимо от того синхронный вызов ReadFile или нет, но если задержку вовсе убрать или поставить меньше, то получаю обрезок ответа, соответственно сколько успел ибп послать данных, это логично, поэтому я решил что меня спасет асинхронный вызов ReadFile и цикл чтения пока я не получу нужное кол-во данных, но не тут то было, я посылаю запрос, в ответ получаю какое то кол-во данных, а потом ошибку WAIT_TIMEOUT, но как только я отправляю второй запрос "Q1\r" через ReadFile я сначала получаю остаток предыдущего запроса, а потом новый, как с этим бороться?
Кликните здесь для просмотра всего текста

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
 int TTY::Read(char* data, int len) {
 
    //return -1;
 
    const int READ_TIME = 1500;
    OVERLAPPED sync = {0};
    unsigned long wait = 0, read = 0, state = 0;
    int result = -1;
    /* Создаем объект синхронизации */
    sync.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
 
    /* Устанавливаем маску на события порта */
    if(SetCommMask(m_Handle, EV_RXCHAR)) {
    /* Связываем порт и объект синхронизации*/
        WaitCommEvent(m_Handle, &state, &sync);
        /* Начинаем ожидание данных*/
        wait = WaitForSingleObject(sync.hEvent, READ_TIME);
        /* Данные получены */
        if(wait == WAIT_OBJECT_0) {
            /* Начинаем чтение данных */
            if(!ReadFile(m_Handle, data, len, &read, &sync))
                if (GetLastError() != ERROR_IO_PENDING) {
                // ReadFile failed, but isn't delayed. Report error and abort.
                    return GetLastError();
                }
            else{
            /* Ждем завершения операции чтения */
            wait = WaitForSingleObject(sync.hEvent, READ_TIME);
            /* Если все успешно завершено, узнаем какой объем данных прочитан */
            if(wait == WAIT_OBJECT_0)
                if(GetOverlappedResult(m_Handle, &sync, &read, FALSE))
                    result = read;
 
            }
            }
    }
    CloseHandle(sync.hEvent);
 
    return result;
 }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2019, 12:23
Ответы с готовыми решениями:

WinSock - recv возвращает не весь ответ?
Привет всем. Столкнулся с такой проблемой. Работаю с UDP сервером, посылаю ему запрос и на...

Асинхронное чтение
форумчане помогите сделать, плииз 1. Создать файл lines.txt с помощью функции CreateFile,...

Асинхронное чтение из COM-порта
Уважаемые спецы! Помогите, плиз, понять небольшую проблему. написал чтение с COM-порта....

Асинхронное чтение данных из COM порта
Приветствую всех. Совсем недавно получил я нелестные высказывания по поводу моего способа чтения...

2
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
16.01.2019, 15:04 2
Я бы вернулся к синхронному чтению и дополнил его установкой таймаутов SetCommTimeouts.
1
0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 6
16.01.2019, 16:46  [ТС] 3
по всей видимости так и сделаю пока что
0
16.01.2019, 16:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2019, 16:46
Помогаю со студенческими работами здесь

Асинхронное чтение последовательного порта. MVVM
Здравствуйте уважаемые форумчане! Такая проблема. Писал код, для чтения com порта на c# form еще,...

Синхронное и асинхронное чтение в Windows Forms Application
Доброго времени суток. Интересует простой вопрос. Мне нужно читать данные с usb-устройства,...

COM порт - ответ
Можно ли как-то эмулировать ответ от прибора на другом конце COM порта? Желательно самому вбивать...

Не возвращает ответ
Не возвращает ответ, как сделать? <form method="post" action="index.php"> Значение 1 <input...


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

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