SetCommTimeouts
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.81] |
|
|
Правила раздела C/C++: Системное программирование и WinAPI
FAQ Сайта (C++)
FAQ Форума
Наши Исходники
Поиск по Разделу
MSDN Library Online (Windows Driver Kit)
Google| Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
SetCommTimeouts
|
Сообщ.
#16
,
|
|
|
|
Цитата Prince @ Допустим, размер FIFO UART - килобайт, а нужно принять 1 байт, и этот байт уже принят и лежит в буфере, что означает в данном случае "принять по таймауту"? Сложилось у меня такое представление, опытным путём. Что ты примешь этот байт когда истечёт тайм-аут. И что байты принимаются порциями, равными или кратными размеру фифо. Если число принятых байт меньше размера фифо, получишь их после истечения тайм-аута. |
|
Сообщ.
#17
,
|
|
|
|
Цитата Сложилось у меня такое представление, опытным путём. Что ты примешь этот байт когда истечёт тайм-аут. И что байты принимаются порциями, равными или кратными размеру фифо. Если число принятых байт меньше размера фифо, получишь их после истечения тайм-аута. Какой именно таймаут истечёт? О каком таймауте речь? И что будет, когда фифо заполнится, а таймаут(какой-то) не истечёт? И как эту ситуацию предотвратить? ![]() Мыслю так. Если установить размер фифо в 1 байт, по идее, винда будет считывать в свой буфер один байт сразу после его приёма, если успеет. Но ладно, пусть размер фифо будет 8 байт. Допустим, принят 1 байт(а таймаут UARTa равен длительности передачи 8 байт). При скорости 9600 бод, интервал между завершением приёма байта и запросом на прерывание будет около 10 мс (?). При скоростях обмена бОльших, задержка будет меньше. Т.е., задержка в обработке уже_фактически_принятого_байта, будет зависеть не cтолько от таймаута железа, сколько от скорости работы самой винды(пока будет обработано прерывание, пока приложение получит управление, пока истекут таймауты, установленные для readfile...). Я правильно мыслю? |
|
Сообщ.
#18
,
|
|
|
|
Ну примерно так код не весь
![]() ![]() int ReadCommBlock( HWND hWnd, LPSTR lpszBlock, int nMaxLength) { COMSTAT ComStat; DWORD dwErrorFlags; DWORD dwLength; BOOL fReadStat; // получили количесиво байт в буффере ClearCommError(g_hComDev, &dwErrorFlags, &ComStat); // Если в буфере меньше байт чем мы запрнашиваем на считывание, то // считаем весь буффер, иначе считаем запрашиваемое количество байт dwLength = min( (DWORD) nMaxLength, ComStat.cbInQue ); if (dwLength > 0) { fReadStat = ReadFile(g_hComDev, lpszBlock, dwLength, &dwLength, &g_Overlapped) ; } } |
|
Сообщ.
#19
,
|
|
|
|
gpepsi
Ну, а если не заморачиваться с MAXDWORD-фишками, и просто установить Multiplier=0, а Constant и Interval в нужные тебе значения? Constant будет ограничивать общее время ожидания, а Interval - выход при наличии задержки в поступлении данных |
|
Сообщ.
#20
,
|
|
|
|
Цитата leo @ Ну, а если не заморачиваться с MAXDWORD-фишками, и просто установить Multiplier=0, а Constant и Interval в нужные тебе значения? Constant будет ограничивать общее время ожидания, а Interval - выход при наличии задержки в поступлении данных пробовал все варианты 1. MAXDWORD, MAXDWORD, 100, 0, 1000 2. MAXDWORD, 0, 100, 0, 1000 3. MAXDWORD, 0, 0, 0, 1000 4. 0, 0, 100, 0, 1000 5. 0, 0, 0, 0, 1000 и т.д. В чем проблема я понял когда выставил 0, 0, 0 Процессор загрузил на 100%, но при этом данные пошли. Как и сказано в документации при этом управление передается сразу сколько бы данных не было. |
|
Сообщ.
#21
,
|
|
|
|
Цитата Процессор загрузил на 100% Что есть свидетельство неправильного алгоритма работы программы. |
|
Сообщ.
#22
,
|
|
|
|
Цитата gpepsi @ пробовал все варианты ... и т.д. Метод ненаучного тыка? И что значит "и.т.д.", где нужный вариант типа 15,0,100? |
|
Сообщ.
#23
,
|
|
|
|
мы не ищем легких путей
|