Dr_Grizzly » 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;
Всем привет! Перекопал инет в поисках ответа, как принимать данные из com порта... не нашел нужный мне ответ... Может кто здесь сталкивался с проблемой - вообщем пишу на дельфе прогу, которая работает с устройством ОВЕН Autonics TM4 по протоколу Modbus RTU. Накопал библиотечку CPortLib, написал функцию отправки данных в порт, написал функцию приема данных из порта. Но проблема в том, что данные приходят иногда кусками... Отправляю пакет - приходит часть пакета, отправляю следующий пакет - приходит продолжение первого ответа + часть второго ответа... И такая канетель нестабильная длится рандомным образом... Самое интересное, что получаю количество принятых байт - нужное число. А вот сами данные рвутся на два-три, а то и 4 запроса. А иногда ровно приходят целиком. Режим передачи использую синхронный. Самое интересное, ставлю сниффер порта, он показывает четко - отправлен пакет, получен полный пакет. Почему же тогда из буфера порта я не могу получить полный пакет сразу? В чем может собака зарыта?
[code]
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;
[/code]