На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> SetCommTimeouts
    Цитата Prince @
    Допустим, размер FIFO UART - килобайт, а нужно принять 1 байт, и этот байт уже принят и лежит в буфере, что означает в данном случае "принять по таймауту"?

    Сложилось у меня такое представление, опытным путём.
    Что ты примешь этот байт когда истечёт тайм-аут.

    И что байты принимаются порциями, равными или кратными
    размеру фифо. Если число принятых байт меньше размера фифо,
    получишь их после истечения тайм-аута.
      Цитата
      Сложилось у меня такое представление, опытным путём.
      Что ты примешь этот байт когда истечёт тайм-аут.

      И что байты принимаются порциями, равными или кратными
      размеру фифо. Если число принятых байт меньше размера фифо,
      получишь их после истечения тайм-аута.

      Какой именно таймаут истечёт? О каком таймауте речь? :scratch:
      И что будет, когда фифо заполнится, а таймаут(какой-то) не истечёт? И как эту ситуацию предотвратить? :scratch:

      Мыслю так. Если установить размер фифо в 1 байт, по идее, винда будет считывать в свой буфер один байт сразу после его приёма, если успеет.
      Но ладно, пусть размер фифо будет 8 байт. Допустим, принят 1 байт(а таймаут UARTa равен длительности передачи 8 байт). При скорости 9600 бод, интервал между завершением приёма байта и запросом на прерывание будет около 10 мс (?). При скоростях обмена бОльших, задержка будет меньше. Т.е., задержка в обработке уже_фактически_принятого_байта, будет зависеть не cтолько от таймаута железа, сколько от скорости работы самой винды(пока будет обработано прерывание, пока приложение получит управление, пока истекут таймауты, установленные для readfile...). Я правильно мыслю?
      Сообщение отредактировано: Prince -
        Ну примерно так код не весь
        ExpandedWrap disabled
          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) ;
           
                  }
          }
          gpepsi
          Ну, а если не заморачиваться с MAXDWORD-фишками, и просто установить Multiplier=0, а Constant и Interval в нужные тебе значения? Constant будет ограничивать общее время ожидания, а Interval - выход при наличии задержки в поступлении данных
            Цитата 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%, но при этом данные пошли.
            Как и сказано в документации при этом управление передается сразу сколько бы данных не было.
            Сообщение отредактировано: gpepsi -
              Цитата
              Процессор загрузил на 100%

              Что есть свидетельство неправильного алгоритма работы программы.
              Сообщение отредактировано: Prince -
                Цитата gpepsi @
                пробовал все варианты
                ...
                и т.д.

                Метод ненаучного тыка? ;) И что значит "и.т.д.", где нужный вариант типа 15,0,100?
                  мы не ищем легких путей :facepalm:
                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0302 ]   [ 15 queries used ]   [ Generated: 7.04.26, 21:03 GMT ]