1、24位AD值分成4字节发过来。上面处理代码写错了应该是:
//将每个字节的顺序号置为0 ,同时将网络字节序转换为主机字节序。
iAd:= ((bTempAdData[0] and $3f) shl 18)
or ((bTempAdData[1]and $3f) shl 12)
or ((bTempAdData[2] and $3f) shl 6 )
or (bTempAdData[3] and $3f);
2、spcomm是不能保证是正确的,它只负责接收,发送数据,数据到达的先后顺序它是管不了的,只有自己写代码处理,我的代码已有做处理了。
3、spcomm我是第一次有,不知到。
PS:你这个问题我之所以回答,是因为spcomm我没有用过,而我做的程序正好有串口的操作,所以做来玩玩。
最终代码:
// Spcomm串口控件的ReceiveData事件。。。。
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
pByte:^Byte;
i:Word;
iAd:integer;
begin
pByte:= Buffer;
for i:= 0 to BufferLength-1 do
begin
//遇到第一位则放弃以前的数据。
if (pByte^ and $C0) = 0 then iAdIndex:= 0;
//如果顺序是正确的就录入
if iAdIndex = pByte^ shr 6 then
begin
bTempAdData[iAdIndex] := pByte^;
inc(iAdIndex);
//正确收到32位的数据后进行处理。
if iAdIndex = 4 then
begin
iAd:=integer(bTempAdData);
//将每个字节的顺序号置为0 ,同时将网络字节序转换为主机字节序。
iAd:= ((bTempAdData[0] and $3f) shl 18)
or ((bTempAdData[1]and $3f) shl 12)
or ((bTempAdData[2] and $3f) shl 6 )
or (bTempAdData[3] and $3f);
//iAd是已经转换好的AD值,在这里写处理代码。
showmessage(inttostr(iAd));
end;
end else
begin
{这里写错误顺序的字节的处理代码,
当有处理的字节(pByte^)不能接上bTempAdData[iAdIndex -1]字节,
如果这里不作处理当前字节将被放弃。}
{其实处理也没有什么好处理的,做些提示,或者保存这几个字节就是了。}
end;
inc(pByte);
end;
end;