comport控件读取串口数据,怎么经常把一整个数据分成2部分来读啊,这就变成2个数据了啊~
帖下我的代码:
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
RecvS,Disps:shortstring;
RecvLen,DataIdx,xcidx:integer;
CardVer:dword;
p,i,CMD,SuccFlag,CID,Zoneb,DevID0,DevID1,DevID2:byte;
OldFn,OldFn1,NewFn,DirS:string;
UDPBuf:array[0..1023] of byte;
begin
//xcidx:=comport.Read(RecvBuf, ComPort.InputCount); //读取
//AddLog( ' 读取字节数: '+inttostr(xcidx));
{ xcidx:=ComPort.InputCount;
CardID:=xcidx+CardID;
if (CardID=16) or (CardID=13) then
begin
ComPort.Read(RecvBuf[RecvPos],count);
CardID:=0;
xcidx:=0;
end else Exit; }
ComPort.Read(RecvBuf[RecvPos],count);
DataIdx:=9;
CMD:=RecvBuf[DataIdx];
SuccFlag:=RecvBuf[DataIdx+1];
CID:=RecvBuf[DataIdx+2];
RecvS:= ' '; for i:=0 to 15 do RecvS:=RecvS+IntToHex(ord(RecvBuf[i]),2)+ ' ';
AddLog( ' 接收码: '+RecvS);
if (cmd =$16) or (cmd=$17) or (cmd=$12) then
begin
if CMD=$16 then
begin
case CID of
1 : if SuccFlag> 0 then begin Addlog( ' 外出布防成功 ');end else Addlog( ' 外出布防失败 ');
2 : if SuccFlag> 0 then begin Addlog( ' 在家布防成功 ');end else Addlog( ' 在家布防失败 ');
end;
end else if CMD=$17 then
begin
if SuccFlag> 0 then begin Addlog( ' 撤防成功 ');end else Addlog( ' 撤防失败 ');
end else if CMD=$12 then
begin
case CID of
24 : if SuccFlag> 0 then begin Addlog( ' 布防成功 ');end else Addlog( ' 布防失败 ');
56 : if SuccFlag> 0 then begin Addlog( ' 撤防成功 ');end else Addlog( ' 撤防失败 ');
40 : if SuccFlag> 0 then begin Addlog( ' 开设备1成功 ');end else Addlog( ' 开设备1失败 ');
8 : if SuccFlag> 0 then begin Addlog( ' 关设备1成功 ');end else Addlog( ' 关设备1失败 ');
48 : if SuccFlag> 0 then begin Addlog( ' 开设备2成功 ');end else Addlog( ' 开设备2失败 ');
16 : if SuccFlag> 0 then begin Addlog( ' 关设备2成功 ');end else Addlog( ' 关设备2失败 ');
32 : if SuccFlag> 0 then begin Addlog( ' 开设备3成功 ');end else Addlog( ' 开设备3失败 ');
0 : if SuccFlag> 0 then begin Addlog( ' 关设备3成功 ');end else Addlog( ' 关设备3失败 ');
end;
end;
end else if (cmd=$13) or (cmd=$14) or (cmd=$15) then
begin
Zoneb:=RecvBuf[DataIdx+2]; // 防区
DevID0:=RecvBuf[DataIdx+3];
DevID1:=RecvBuf[DataIdx+4];
DevID2:=RecvBuf[DataIdx+5];
Addlog(IntToHex(Zoneb,2)+ ' 防区 '+IntToHex(DevID2,2)+ ' 设备告警 ');
RecvPos:=0;
end;
end;
========================
我用的是TMemo的add添加日志的,老是把一条数据分成2次add,我都快疯球了。。。。。。。哪位遇到类似的问题啊,急等~~
[解决办法]
把读超时设大一点
[解决办法]
把UDPBuf:array[0..1023] of byte;
设大点
[解决办法]
像楼上所说的那样可以,也可以把取出的缓冲区数据存入变量,然后利用变量进行字符链接,两次的链接结果再送到memo中显示。