求助:串口通信数据包的处理(50分)

  • 主题发起人 主题发起人 aimarli
  • 开始时间 开始时间
A

aimarli

Unregistered / Unconfirmed
GUEST, unregistred user!
我用这个接受了串口消息
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
strReceive: string;
begin
memo1.Clear;
setLength(StrReceive,BufferLength);
Move(Buffer^,PChar(strReceive)^,BufferLength);
Memo1.Lines.Add(strReceive);
Memo1.Invalidate;
end;

然后我又这样对数据进行了处理
procedure TForm1.Memo1Change(Sender: TObject);
var
j:integer;
str1,str2,bcc1,bcc2:string;
checksum,NUM,NNAME,LAMPP,ALARMT:integer;
bcc3,bcc4,bcc5,bcc6:integer;
begin
str1:=memo1.Text;
j:=pos('55AA',str1);
str2:=copy(str1,j,20);

NUM:=strtonint(copy(str2,5,2));
NNAME:=strtonint(copy(str2,7,2));
LAMPP:=strtonint(copy(str2,9,2));
ALARMT:=strtonint(copy(str2,11,2));
bcc1:=copy(str2,13,2);
bcc2:=copy(str2,15,2);
bcc5:=strtonint(bcc1);
bcc6:=strtonint(bcc2);

checksum:= NUM xor NNAME xor LAMPP xor ALARMT;
bcc3:=checksum shr 4;
if bcc3>9
then
bcc3:=bcc3+$37
else bcc3:=bcc3+$30;

bcc4:=checksum and $0f;
if bcc4>9 then
bcc4:=bcc4+$37
else bcc4:=bcc4+$30;

if (bcc3<>bcc5) or (bcc4<>bcc6)
then
begin
showmessage('bad');
end
else
begin
showmessage('good');
end;
end;

这个程序运行没有错误,memo1一有数据就异常,'类型不对'.
我只是想把截取的字符串根据我的方法进行个异或操作.
为什么这么痛苦``````````
肯请各位大侠,英雄路过看看
 
j:=pos('55AA',str1);
str2:=copy(str1,j,20);

NUM:=strtonint(copy(str2,5,2)); //能保证str2的第5 6个字符是 数字字符吗?
NNAME:=strtonint(copy(str2,7,2));//能保证str2的第7 8个字符是 数字字符吗?
LAMPP:=strtonint(copy(str2,9,2));//能保证str2的第9 10个字符是 数字字符吗?
ALARMT:=strtonint(copy(str2,11,2));//能保证str2的第11 12个字符是 数字字符吗?
....
下面的也是一样
 
串口传过来的实质上就是二进制代码,只不过在你的接收代码部分把它强制变成了string型,
你把传过来的数据的格式搞清楚后,不要这么复杂的.
如你的接收字符串变量是strRecive ,要取得其中的第一个字符只要 str := StrRecive[1];
就要以的了,其余自己去修改
 
首先,在写上论坛的程序里有个笔误strtonint应该改成strtoint.
然后,bmsr说是否能保证为数字字符,我写的全是数字,一样异常.
再有,ayu310所说的提取字符,但是delphi xor操作的时候仿佛字符也不行.
 
后退
顶部