Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Проблемы при работе с СОМ-портом


Автор: Nick64 5.10.2006, 12:17
Привет ALL!
Есть проблема. Написал прогу которая читает данные из СОМ-порта в ассинхронном режиме, установки порта 8n1, выводинфы делаю в Memo. Так вот на выходе должна получаться строка длиной около 140 байт, а на практике получаю 8 байт, потом переход на новую строку в Memo и след. 8 байт из той же строки. Мне интересно как можно сделать чтобы выходная строка была как одна строчка в Memo?
Код

procedure ReadThread.Execute;
var
ComStat: TComStat;
dwMask, dwError, R: DWORD;

begin
  FRead:=0;

  OverRead.hEvent := CreateEvent(nil, True, False, nil);
  if OverRead.hEvent = Null then
   raise Exception.Create('Error creating read event');
  FreeOnTerminate := True;

  while not Terminated do
  begin
    if not WaitCommEvent(hPort, dwMask, @OverRead) then
    begin
      if GetLastError = ERROR_IO_PENDING then
      WaitForSingleObject(OverRead.hEvent, INFINITE)
    else
      raise Exception.Create('Error waiting port event');
    end;
   if not Terminated then
     if not ClearCommError(hPort, dwError, @ComStat) then
       raise Exception.Create('Error clearing port');


   R := ComStat.cbInQue;
    If R>FRead then begin
      FreeMem(Buffer);
      Buffer:=AllocMem(R);
    end;
    FRead:=R;

   If Terminated then Break;
   if FRead > 0 then
   begin
     if not ReadFile(hPort, Buffer^, FRead, FRead, @OverRead) then
       raise Exception.Create('Error reading port');
   Synchronize(DoRead);
   end;
end;
end;

procedure ReadThread.DoRead;
var
  arrBytes: array of Byte;
  i: Integer;
  TmpStr : string;
begin
try
  If Terminated then Exit;
  begin
    SetLength(arrBytes, FRead);
    for i := 0 to FRead - 1 do
      arrBytes[i] := Buffer^[i]; //возможно Buffer^[i]

    TmpStr := '';
    for i := Low(arrBytes) to High(arrBytes) do
      begin
        if i >= Low(arrBytes) then
        TmpStr := TmpStr + IntToHex(arrBytes[i], 2);
      end;
    fmMain.mmOutput.Lines.Add(HexToStr(TmpStr));

    arrBytes:=nil;
  end;
except
end;
end;

Автор: Coder 6.10.2006, 06:09
удали из строки котору считал символы возврата каретки 0Dh и 0Ah (#13#10)

Автор: Nick64 6.10.2006, 11:17
Цитата(Coder @ 6.10.2006,  06:09)
удали из строки котору считал символы возврата каретки 0Dh и 0Ah (#13#10)

Если было бы все так просто, я бы наверно не писал в форум.
В строке пучаемой с порта символы 0Dh и 0Ah (#13#10) стоят в конце и прога их нормально воспринимает,а вот в самой строке этих символов быть не может в принципе!

Автор: Max111 7.10.2006, 21:09
Доброе утро,

Когда Вы вызываете операцию fmMain.mmOutput.Lines.Add(HexToStr(TmpStr));
то в строку которую Вы добавляете в мемо по умолчанию добавляется делиметер который установлен в системе
для мемо

Автор: Nick64 9.10.2006, 09:43
Огромное спасибо Max111, я сам понял что сглупил. Поменял на fmMain.mmOutput.Text:=fmMain.mmOutput.Text+HexToStr(TmpStr) и все пошло как хотелось. Только вот странно получается, когда открываешь порт в начале выводиться мусор какой-то, а потом нормально идут данные, при чем не всегда мусор бывает иногда нормально пашет. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)