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

Получить количество байт, записанных в com-порт (асинхронный режим)

10.05.2008, 20:06. Показов 7884. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не могу получить кол-во байт записанных в порт(асинхронный режим)+отдельный поток.
Точнее значение всегда одно-нуль.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2008, 20:06
Ответы с готовыми решениями:

Получить количество элементов записанных в double[]
Имеем double x = new double; x = 1; x = 9; как получить количество элементов записанных в...

Как получить количество записанных элементов в файл?
Как получити количество записанных елементов в файл? Добавлено через 5 минут Например я записал...

Rs 232, асинхронный режим
как открыть порт?как принимать и отсылать на порт?

Получить количество байт, готовых к считыванию из сокета
Как можно получить кол-во байт готовых к считыванию из TCP сокета? Добавлено через 8 минут в...

12
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
10.05.2008, 20:58 2
Кажется, так:
C++
1
2
3
4
DWORD dwErrors;
COMSTAT cs;
ClearCommError(hCom, &dwErrors, &cs);
//cs.cbInQue
0
0 / 0 / 0
Регистрация: 10.05.2008
Сообщений: 7
12.05.2008, 00:18  [ТС] 3
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Кажется, так:
Код
DWORD dwErrors;
COMSTAT cs;
ClearCommError(hCom, &dwErrors, &cs);
//cs.cbInQue
Попробовал ClearCommError, возвращается нуль. Судя по описанию функция несработала, ставил в других местах-тот же нуль.
0
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
12.05.2008, 06:57 4
Что возвращает GetLastError() ?
Какой хендл пихаешь в функцию?
0
0 / 0 / 0
Регистрация: 10.05.2008
Сообщений: 7
12.05.2008, 22:50  [ТС] 5
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Что возвращает GetLastError() ?
Какой хендл пихаешь в функцию?
Вот кусок моего кода.
Delphi
1
2
3
4
o.hEvent:=CreateEvent(nil,true,false,#0);
setcommmask(hndcom,EV_TXEMPTY    );
WriteFile(hndcom,j,w,num,@o);
err3:=GetLastError;
и.т.д
Так вот, err3=0.
0
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
13.05.2008, 11:21 6
Вот так я записавыю, работает.
Delphi
1
2
3
4
5
6
7
8
var errs,written:Cardinal;
    cs:COMSTAT;
 
if not ClearCommError(hCom, errs, @cs) then exit;
if WriteFile(hCom, sBuff[1], Length(sBuff), written, nil) then
    //записалось
else
    //не записалось
0
0 / 0 / 0
Регистрация: 10.05.2008
Сообщений: 7
14.05.2008, 08:10  [ТС] 7
Спасибо за пример. Я вот слегка не допер что значит sBuff[1] и Length(sBuff). Более полный код не можеш прислать?
0
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
14.05.2008, 11:09 8
Это был Delphi. sBuff - это строка, т.е. буфер. sBuff[1] - это первый элемент буффера (там оно передается через var, поэтому на СИ получится что-то типа &sBuff[0]), а Length(sBuff) - это реальная длина буфера, которую мы можем принять.
Если функция вернет true, то в параметр written будет кол-во принятых байт.
0
0 / 0 / 0
Регистрация: 10.05.2008
Сообщений: 7
15.05.2008, 00:34  [ТС] 9
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Это был Delphi. sBuff - это строка, т.е. буфер. sBuff[1] - это первый элемент буффера (там оно передается через var, поэтому на СИ получится что-то типа &sBuff[0]), а Length(sBuff) - это реальная длина буфера, которую мы можем принять.
Если функция вернет true, то в параметр written будет кол-во принятых байт.
Наверное всетаки переданных байт, ибо функция Writefile. Или я че то опять не догоняю.:eek:
0
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
15.05.2008, 20:15 10
Да, конечно, written - кол-во байт, записанных в порт.
0
0 / 0 / 0
Регистрация: 16.05.2008
Сообщений: 7
16.05.2008, 06:23 11
Для асинхронного режима я делаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HANDLE h_ovp_ev;
//событие с ручным сбросом
h_ovp_ev=CreateEvent(NULL,true,false,NULL);
 
OVERLAPPED ovp;
ZeroMemory(&ovp,sizeof(OVERLAPPED));
ovp.hEvent=h_ovp_ev;
 
DWORD nwr_bytes;
char buf[BUFF_SIZE];
 
//запись в COM порт
WriteFile(h_com,buf,BUFF_SIZE,&nwr_bytes,&ovp);
 
//ждем окончания записи
WaitForSingleObject(h_ovp_ev,INFINITE);
 
GetOverlappedResult(h_com,&ovp,&nwr_bytes,false);
//теперь в nwr_bytes количество записанных байт
0
0 / 0 / 0
Регистрация: 10.05.2008
Сообщений: 7
20.05.2008, 22:01  [ТС] 12
Вроде все прояснилось, только вот непонятно: иногда ждут через waitcommevemt, а иногда через WaitForSingleObject. Чем же они отличаются?
0
0 / 0 / 0
Регистрация: 16.05.2008
Сообщений: 7
22.05.2008, 06:15 13
WaitCommEvent служит для мониторинга событий на COM порту. Причем возможны два варианта:

1. Синхронный режим (в CreateFile не использовался флаг FILE_FLAG_OVERLAPPED)
В этом случае WaitCommEvent "повесит" поток до наступления заданного функцией SetCommMask события

2. Асинхронный режим (в CreateFile использовался флаг FILE_FLAG_OVERLAPPED)
В этом случае если события заданные SetCommMask не наступили с предыдущего вызова WaitCommEvent функция вернет FALSE. А GetLastError вернет ERROR_IO_PENDING. Так что тут опять придется использовать WaitForSingleObject чтобы дождаться нужного события
0
22.05.2008, 06:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2008, 06:15
Помогаю со студенческими работами здесь

Асинхронный ввод/вывод данных в COM-порт
Всем доброго времени суток. Подключаю плату STM32-discovery к компьютеру. Программа...

Асинхронный клиент: сервер подаёт 4440 байт, приходит 2048
Здравствуйте форумчане. Клиент - Сервер на разных компьютерах.Посылается на сервер "Начать...

Часы(асинхронный режим таймера) + ds18b20
Всем привет! Товарищи, хочу сделать девайс часы+термометр с выводом на дисплей, что идет с...

Дан массив из 11 байт. Подсчитать количество байт с нечетным числом 1 в байте
Дан массив из 11 байт. Подсчитать количество байт с нечетным числом 1 в байте.-Assembler помогите...


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

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