我用如下代码接收数据
procedure TForm1.MSComm1Comm(Sender: TObject);
var
vtmp,ovtmp:variant;
bTmp:Byte;
i,ireceived:integer;
begin
if mscomm1.CommEvent =2 then
mscomm1.InputMode:=comInputModeBinary; iReceived:=mscomm1.InBufferCount;
ovtmp:=mscomm1.Input;
vtmp:=VarArrayCreate([0,17],varbyte);
vtmp:=ovtmp ;
end;
现在我要解析一个18byte的数据包
连续输出格式
STX A B C X X X X X X X X X X X X CR CKS
1 2 3 4 5 6
其中:
1、〈STX〉ASCII起始符(02H)。
2、状态字A、B、C。
3、显示重量 可能是毛重也可能是净重。6位不带符号和小数点的数字。
4、皮重 6位不带符号和小数点的数字。
5、〈CR〉ASCII回车符(0DH)。
6、〈CKS〉可选的校验和。
A的格式为前3位为小数点的位置
0 0 0 XXXX00
1 0 0 XXXXX0
0 1 0 XXXXXX
1 1 0 XXXXX.X
0 0 1 XXXX.XX
1 0 1 XXX.XXX
0 1 1 XX.XXXX
1 1 1 X.XXXXX
我怎样判断数据包并获得像状态字A每一位的置来确定数据的小数点位置呢?
procedure TForm1.MSComm1Comm(Sender: TObject);
var
vtmp,ovtmp:variant;
bTmp:Byte;
i,ireceived:integer;
begin
if mscomm1.CommEvent =2 then
mscomm1.InputMode:=comInputModeBinary; iReceived:=mscomm1.InBufferCount;
ovtmp:=mscomm1.Input;
vtmp:=VarArrayCreate([0,17],varbyte);
vtmp:=ovtmp ;
end;
现在我要解析一个18byte的数据包
连续输出格式
STX A B C X X X X X X X X X X X X CR CKS
1 2 3 4 5 6
其中:
1、〈STX〉ASCII起始符(02H)。
2、状态字A、B、C。
3、显示重量 可能是毛重也可能是净重。6位不带符号和小数点的数字。
4、皮重 6位不带符号和小数点的数字。
5、〈CR〉ASCII回车符(0DH)。
6、〈CKS〉可选的校验和。
A的格式为前3位为小数点的位置
0 0 0 XXXX00
1 0 0 XXXXX0
0 1 0 XXXXXX
1 1 0 XXXXX.X
0 0 1 XXXX.XX
1 0 1 XXX.XXX
0 1 1 XX.XXXX
1 1 1 X.XXXXX
我怎样判断数据包并获得像状态字A每一位的置来确定数据的小数点位置呢?
我发的是一小篇文章,用你的发到超级终端或别的串口测试程序中则没有乱码。
我修改了你的程序,在接收同时保存到一个文件中,结果保存的文件正常,而你的程序显示的有乱码。
说明你的程序发送,接收都没有问题,只是在Memo_show中显示有问题,请问怎么改正?
vTmp:variant;
...
begin
CodeSize:=MsCommCall.InBufferCount;
if CodeSize>0 then begin
vTmp:=VarArrayCreate([0,CodeSize-1],varByte);
vTmp:=MsCommCall.Input;
Code:=vTmp[CodeSize-1];
end
else begin
Code:=C_None;
end;
...mscomm返回的类型是variant类型的数组,所以delphi端也要用variant数组去接收,不然就会损失掉高位,返回结果就不对了,用variant数组取得数据后,再赋给byte型就可以正常使用了。
能否也发给我学习学习?[email protected] 谢谢。
vtmp[1] and $07就是低三位的值。
另外,我在http://www.csdn.net/develop/article/20/20663.shtm上发现了一个非常简单的函数:
function GetBit(i: Cardinal; n: Cardinal): Boolean;
begin
Result := Boolean((i shr n) and 1);
end;这个函数只需改改i的类型为byte就行,即
function getbit(i:byte;n:integer):integer;
begin
result:=(i shr n) and 1;
end;
这样getbit(i,n)就返回的值就是i的第n位,够简单吧
我也需要设计一个电子称接受数据的程序,好像我们的电子称是一个型号的。
我以前没有做过串口(我一般做企业管理方面的程序),你能否把你的程序发给我呢?
愿我们能够互相学习,互相帮助。谢谢你。[email protected]
还有 怎么接收时是四个字四个字的接收的呀?
(选择逐行就可以看出来是一次接收了4个字)
InputBytes:array of Byte; MSComm1.InputMode:=comInputModeBinary;
InputBytes:=MSComm1.Input;