Com порт, компонента CPort Lib, прием данных

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Dr_Grizzly
Сообщения: 406
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

09 июн 2015, 14:01

Всем привет! Перекопал инет в поисках ответа, как принимать данные из com порта... не нашел нужный мне ответ... Может кто здесь сталкивался с проблемой - вообщем пишу на дельфе прогу, которая работает с устройством ОВЕН Autonics TM4 по протоколу Modbus RTU. Накопал библиотечку CPortLib, написал функцию отправки данных в порт, написал функцию приема данных из порта. Но проблема в том, что данные приходят иногда кусками... Отправляю пакет - приходит часть пакета, отправляю следующий пакет - приходит продолжение первого ответа + часть второго ответа... И такая канетель нестабильная длится рандомным образом... Самое интересное, что получаю количество принятых байт - нужное число. А вот сами данные рвутся на два-три, а то и 4 запроса. А иногда ровно приходят целиком. Режим передачи использую синхронный. Самое интересное, ставлю сниффер порта, он показывает четко - отправлен пакет, получен полный пакет. Почему же тогда из буфера порта я не могу получить полный пакет сразу? В чем может собака зарыта?

Код: Выделить всё

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
fullanswer,answer:string;
j:integer;
begin
     form1.ComPort1.ReadStr(answer,Count);

     If form3.RzCheckBox2.Checked then  // установил галку для теста, чтобы собирать данные в кучу... но не помогло...
      fullanswer:=fullanswer+answer
     else
      fullanswer:=answer;

     j:=length(fullanswer);
     form3.Edit2.Text:=decodstr(fullanswer); // декодирую данные полученные в строку
end;
 

Function decodstr(reciv:string):string;
var
i:integer;
dagramm,answer: string;
ansarray:array[1..7] of char;
begin
   assignfixedstring(ansarray,reciv);
   for i := low(ansarray) to length(reciv) do
   dagramm := dagramm+IntToHex(ord(ansarray[i]),2);
   Result:=dagramm;
end;

Procedure AssignFixedString( Var FixedStr: Array of Char; Const S: String);
Var
maxlen: Integer;
Begin

  maxlen := succ(High( FixedStr ) - Low( FixedStr ));
  FillChar( FixedStr, maxlen, ^@ ); 
  If Length(S) > maxlen Then
    Move( S[1], FixedStr, maxlen )
  Else
    Move( S[1], FixedStr, Length(S));

End;

Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Ответить