首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

comport控件读取串口数据,如何经常把一整个数据分成2部分来读啊这就变成2个数据了啊

2012-03-11 
comport控件读取串口数据,怎么经常把一整个数据分成2部分来读啊,这就变成2个数据了啊~帖下我的代码:proced

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中显示。

热点排行