Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2011, 12:01   #1
yuta_86
Пользователь
 
Регистрация: 06.12.2010
Сообщений: 99
Печаль читает с COM но ошибка

добрый день.
у меня вопрос следующего плана. Происходит событие принятия байта а при чтении реально прочитанных байт всегда 0. и функция чтения ReadFile всегда возвращает false, хотя в массив b записалось именно столько сполько пришло.почему так? что за хитрости ?надеюсь на Вашу помощь, господа-знатоки.

Код:
Procedure TReadThread.Execute;
Var i : Byte;
    CurrentState : TComStat;
    B:array[1..70000]of byte;
    AvaibleBytes, ErrCode, ModemState, RealRead : Cardinal;
    ReadOL : TOverLapped; {структура для асинхронного чтения}
    Signaled, Mask : DWORD;
    BytesTrans : DWORD; {не используется для WaitCommEvent}
    bResult:BOOLEAN;
Begin
 With FOwner do
 begin
  Try
    {создание события для асинхронного чтения}
    FillChar(ReadOL, SizeOf(ReadOL), 0);// установление в 0
    FillChar(B,sizeof(B), 0);
   ReadOL.hEvent:= CreateEvent(nil, True, True, nil); 	//создать сигнальный объект-событие для асинхронных операций
    {Маска событий, которые будет отслеживать читающий поток }
    {Пока это только получение символа                       }
    SetCommMask(FHandle, EV_RXCHAR);   //установить маску на срабатывание по событию приёма байта в порт
    RealRead:=0;

    While (not Terminated) and Connected do   {пока порт открыт}
     begin
       { Ждем одного из событий }
       WaitCommEvent(FHandle, Mask, @ReadOL); //ожидать события приёма байта (это и есть перекрываемая операция)
       Signaled:= WaitForSingleObject(ReadOL.hEvent, INFINITE);//приостановить поток до прихода байт
       If (Signaled  = WAIT_OBJECT_0) then   //если событие прихода байта произошло
        begin
         If GetOverlappedResult(FHandle, ReadOL, BytesTrans, false) then //false //проверяем, успешно ли завершилась перекрываемая
 //операция WaitCommEvent
          begin
            //после GetOverlappedResult в переменной mask, которая передавалась
            //в WaitCommEvent, появятся флаги произошедших событий, либо 0 в
            // случае ошибки.
             If (Mask and EV_RXCHAR) <> 0 then  	//если произошло именно событие прихода байта
              begin
                {Получаем состояние порта (линий и модема)}
                CurrentState:= GetState(ErrCode);
                ModemState  := GetModemState;
                { Число полученных, но еще не прочитанных байт}
                AvaibleBytes:= CurrentState.cbInQue;//Число байтов, полученное от  поставщика последовательных данных
                { Проверка числа доступный байт}
                If AvaibleBytes > 0 then
                 begin
                     bResult:=ReadFile(FHandle, B,AvaibleBytes , RealRead, @ReadOL);
                
                    {сохраняем параметры вызова события}
                 IF bResult=true then showmessage('yes');
               
                    for i:=1  to AvaibleBytes do //RealRead do
                      begin
                         FByte_array[i]:= B[i];// FByte_array[chet+i]:= B[i];
                      end;
                       chet:=chet+RealRead;
                       FByte:= B[1];
                       FPState := CurrentState;
                       FMState := ModemState;
                       FErrCode:= ErrCode;
                     {Вызываем событие OnReadByte. Для синхронизации с VCL}
                     {надо вызвать метод Synchronize                      }


                     Synchronize(DoReadByte);
                  //  End;
                 End;
              End;
          End;
        End;
     End;

      Finally
       {закрытие дескриптора сигнального объекта}
       CloseHandle(ReadOL.hEvent);
       {Сброс события и маски ожидания}
       SetCommMask(FHandle, 0);
      End;
 End;
End;

Последний раз редактировалось Stilet; 17.01.2011 в 12:21.
yuta_86 вне форума Ответить с цитированием
Старый 17.01.2011, 12:24   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> функция чтения ReadFile всегда возвращает false

А ф-ция GetLastError для Пушкина придумана ?
mss вне форума Ответить с цитированием
Старый 17.01.2011, 12:28   #3
yuta_86
Пользователь
 
Регистрация: 06.12.2010
Сообщений: 99
По умолчанию

ладно пусть так. почему тогда при чтении реально прочитанных байт всегда 0
yuta_86 вне форума Ответить с цитированием
Старый 17.01.2011, 12:31   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Потому что операция асинхронная.
mss вне форума Ответить с цитированием
Старый 17.01.2011, 12:33   #5
yuta_86
Пользователь
 
Регистрация: 06.12.2010
Сообщений: 99
По умолчанию

и как узнать сколько я прочитал байт?
yuta_86 вне форума Ответить с цитированием
Старый 17.01.2011, 12:35   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

GetOverlappedResult покажет
mss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто что читает Utkin Свободное общение 22 12.01.2010 15:52
Читает вывод из консоли Consol Win Api 10 31.08.2009 08:42
Почему читает лишнюю строку nusik Общие вопросы C/C++ 6 20.05.2009 18:22
не читает входную строчку DoGGy Паскаль, Turbo Pascal, PascalABC.NET 3 23.01.2009 21:46
плеер Divx не читает Xatr Софт 4 26.12.2008 03:00