Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы при работе с СОМ-портом 
:(
    Опции темы
Nick64
Дата 5.10.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 5.10.2006

Репутация: нет
Всего: нет



Привет 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;

PM MAIL   Вверх
Coder
Дата 6.10.2006, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 1
Всего: 11



удали из строки котору считал символы возврата каретки 0Dh и 0Ah (#13#10)
PM MAIL   Вверх
Nick64
Дата 6.10.2006, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 5.10.2006

Репутация: нет
Всего: нет



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

Если было бы все так просто, я бы наверно не писал в форум.
В строке пучаемой с порта символы 0Dh и 0Ah (#13#10) стоят в конце и прога их нормально воспринимает,а вот в самой строке этих символов быть не может в принципе!
PM MAIL   Вверх
Max111
Дата 7.10.2006, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 18.1.2006

Репутация: нет
Всего: нет



Доброе утро,

Когда Вы вызываете операцию fmMain.mmOutput.Lines.Add(HexToStr(TmpStr));
то в строку которую Вы добавляете в мемо по умолчанию добавляется делиметер который установлен в системе
для мемо
PM MAIL   Вверх
Nick64
Дата 9.10.2006, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 5.10.2006

Репутация: нет
Всего: нет



Огромное спасибо Max111, я сам понял что сглупил. Поменял на fmMain.mmOutput.Text:=fmMain.mmOutput.Text+HexToStr(TmpStr) и все пошло как хотелось. Только вот странно получается, когда открываешь порт в начале выводиться мусор какой-то, а потом нормально идут данные, при чем не всегда мусор бывает иногда нормально пашет. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.