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

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

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

Студворк — интернет-сервис помощи студентам
День добрый, пишу софтинку для личного ползования, а конкретно опрос ИБП через 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.01.2019, 12:23
Ответы с готовыми решениями:

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

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

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

2
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,120
16.01.2019, 15:04
Я бы вернулся к синхронному чтению и дополнил его установкой таймаутов SetCommTimeouts.
1
0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 6
16.01.2019, 16:46  [ТС]
по всей видимости так и сделаю пока что
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2019, 16:46
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru