关于cport控件的问题,返回老是有错误 ( 积分: 100 )

  • 主题发起人 主题发起人 lsssxs
  • 开始时间 开始时间
L

lsssxs

Unregistered / Unconfirmed
GUEST, unregistred user!
116 [00049382] IRP_MJ_WRITE Length: 0008, Data: 01 03 00 00 00 01 84 0A
117 [00049384] IRP_MJ_READ Length: 0006, Data: 01 03 02 16 65 C4
118 [00049482] IRP_MJ_WRITE Length: 0008, Data: 01 03 00 00 00 01 84 0A
119 [00049484] IRP_MJ_READ Length: 0006, Data: 01 03 02 17 A4 04
120 [00049582] IRP_MJ_WRITE Length: 0008, Data: 01 03 00 00 00 01 84 0A
121 [00049584] IRP_MJ_READ Length: 0007, Data: FF 01 03 02 16 65 C4
122 [00049682] IRP_MJ_WRITE Length: 0008, Data: 01 03 00 00 00 01 84 0A
123 [00049684] IRP_MJ_READ Length: 0007, Data: FF 01 03 02 16 65 C4
124 [00049782] IRP_MJ_WRITE Length: 0008, Data: 01 03 00 00 00 01 84 0A
125 [00049782] IRP_MJ_READ Length: 0001, Data: FF
126 [00049784] IRP_MJ_READ Length: 0010, Data: FF 2F 68 10 20 20 40 11 1A F0
127 [00049882] IRP_MJ_WRITE Length: 0008, Data: 01 03 00 00 00 01 84 0A
128 [00049884] IRP_MJ_READ Length: 0006, Data: 01 03 02 17 A4 04
129 [00049982] IRP_MJ_WRITE Length: 0008, Data: 01 03 00 00 00 01 84 0A
130 [00049984] IRP_MJ_READ Length: 0005, Data: 01 03 02 18 E4
//问题点:上面是我监控到的返回的字符,老是返回的出错,有的时候没有返回,有的时候返回了也错误,
老是返回ff或者bf bf就一定是错误的了,看看下面的代码,是不是那里错误了,那位兄弟也遇到这样的问题,请高手指教,比如这里返回Length: 0010, Data: FF 2F 68 10 20 20 40 11 1A F0 就是错误的,我发送的字符都是一样的,为什么返回的结果有不一样的,如果使用国外的标准串口软件的就不会有这个问题,但是使用串口调试精灵和串口调试大师等软件来发送,也有这个问题,也返回出错,
这里Length: 0005, Data: 01 03 02 18 E4
Length: 0006, Data: 01 03 02 17 A4 04

Length: 0007, Data: FF 01 03 02 16 65 C4

这些字符,返回都是正常的,比如:Length: 0007, Data: FF 01 03 02 16 65 C4 前面有的返回了FF ,01表示电子,03表示功能码,02表示地址,16这里表示返回的值,65 c4表示校验码(根据前面计算得到)

===============返回数据处理===============
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);

var
Str: String;

begin
//count:=14;
ComPort1.ReadStr(Str, count);//获得返回代码
scr:=StrToHexStr(Str);//转换成16进值字符
// Memo2.Text:=Memo2.Text+' '+scr; //累加显示返回的16进制字符
// RzMemo2.Text:=scr; //显示返回的16进制字符
end;

===============================发送代码================

procedure TForm1.Timer2Timer(Sender: TObject);
var
sar:array[1..5] of string;
i:integer;
begin
if Button3.Caption='关闭串口' then//判断串口是否打开
begin
sar[1]:=HexStrToStr('01 03 00 00 00 01 84 0A');
begin
//ComPort1.ClearBuffer(true,true);
wait(100); //延期100ms 继续下面的代码,这里使用一个函数
SendString(sar[1]); //这个是发送一组
wait(100); //延期100ms 继续下面的代码,等待100ms数据返回以后判断后转换显示
if scr<>'' then
begin
edit4.text:=inttostr(HextoOct(copy(scr,length(scr)-8+1,2)));
end else
begin
edit4.Text:='0';
memo3.lines.add('通讯不正常,或未设定');
end;
end;
//上面是把返回的字符截取实际值除以10,
//copy(scr,length(scr)-8+1,2))是截取返回字符倒数第8位开始,截取2位
//然后转换成10进制,再使用to97函数把值除以10,显示到edit中

end //那个没有打开端口
else
ShowMessage('请先打开端口,同时确认硬件连接正常!');
end;
 
这里Length: 0005, Data: 01 03 02 18 E4
Length: 0006, Data: 01 03 02 17 A4 04

Length: 0007, Data: FF 01 03 02 16 65 C4

这些字符,返回都是正常的,比如:Length: 0007, Data: FF 01 03 02 16 65 C4 前面有的返回了FF ,01表示电子,03表示功能码,02表示地址,16这里表示返回的值,65 c4表示校验码(根据前面计算得到)
 
自己顶一下,有兄弟可以回答吗?
 
后退
顶部