我用delphi做串口通信,控件用的是mscomm.
现在出现的问题是mscomm在接收数据每接收8个字节就产生一次oncomm事件(我设置的MSComm1.RThreshold为1)。
初始化程序为:
  if MSComm1.PortOpen then
  MSComm1.PortOpen := false;//关闭端口
  mscomm1.CommPort := 1;//指定端口
  mscomm1.Settings := '9600,N,8,1';//其它参数
  mscomm1.InBufferSize := 256; //接收缓冲区
  mscomm1.OutBufferSize := 256;  //发送缓冲区
  mscomm1.InputMode := comInputModeBinary;  //接收模式
  mscomm1.InputLen := 0;       //一次读取所有数据
  mscomm1.SThreshold := 0;    //一次发送所有数据
  mscomm1.InBufferCount := 0;   //清空读取缓冲区
  mscomm1.OutBufferCount := 0;  //清空发送缓冲区
  MSComm1.RThreshold := 1;   //设置接收多少字节开产生oncomm事件
  mscomm1.PortOpen:=true;      //打开端口
   
接收程序是:
procedure TForm1.MSComm1Comm(Sender: TObject);
var
xtemp:olevariant;
xscr:array of byte;
i,j:integer;
xRecData:string;
begin
i:=mscomm1.InBufferCount; //这个i的结果老出错
if i=0 then
     exit;
if mscomm1.CommEvent=2 then
  begin
   xtemp:=mscomm1.Input;
   setlength(xscr,i);
   xscr:=xtemp;
   for j:=0 to i-1 do
       xRecData:=xRecData+inttohex((xscr[j]),2);
       memo2.Text:=memo2.Text+xrecdata;
       prodata(xrecdata);//针对接收到的数据进行处理
       xrecdata:='';
  end;
end;
接收到的字节个数显示不对。应该怎么办?我需要接收不同的字节个数,分别是1,9,10,23。
请各位帮帮忙,谢谢!

解决方案 »

  1.   

    自己顶下,比如我要发送的数据是BA D1 05 01 02 03 04 05 0F
    然后再接收的时候,发现是先收到前面的8个字节BA D1 05 01 02 03 04 05 ,
    然后再收到最后一个字节0F
      

  2.   


      mscomm1.InputLen := 0;      //一次读取所有数据 
      mscomm1.SThreshold := 0;    //一次发送所有数据 
    为什么是零!?这个两个属性是干啥用的
    改成你的1,9,10,23。 
    试试
      

  3.   

    没用啊,在程序里我只能设定一次啊,不可能更改为1,9,10,23。
    mscomm一次只能接收8个字节吗?在MSComm1.RThreshold := 1时,其他条件不变!
    有没有办法解决这个问题???
      

  4.   

    延时取缓存数据,不管是事件里还是直接READ()
      

  5.   

    据说微软公司的MSComm下的
    procedure TForm1.MSComm1Comm(Sender: TObject); 
    有点问题。
    偶一直不用的。
    偶一直这么用:
    function serialsend(mscomm:TMSComm):Integer;
    var
        //errmessage:string;
        recvlen:Integer;
        i: integer;
        reData:array of Variant;
        restr: string;
        StrSend: string;
        TxBuff: OleVariant;
    begin
        if mscomm.PortOpen = false then mscomm.PortOpen := True; 
        try 
            StrSend := '';        //重置它的大小,为0~n,int为n的类型。 //varByte为TxBuff每一个元素的类型。
            TxBuff := VarArrayCreate([0, 255],varByte);
            //填充元素其中buff为你定义的一个固定数组,其中有你要发的数据
            StrSend := '';
            for i := 0 to XorLen do
            begin
                TxBuff[i] := ApduSendDataBuff[i];
                StrSend := StrSend + IntToHex(ApduSendDataBuff[i], 2) + ' ';
            end;
            WriteLog('发送命令:' + StrSend);
            mscomm.Output:=TxBuff;//发送数据        XorLen := 0;
            FillChar(ApduRecvDataBuff, High(ApduRecvDataBuff) + 1, 0);
            FillChar(ApduSendDataBuff, High(ApduSendDataBuff) + 1, 0);
            Sleep(300);        if mscomm.InBufferCount > 0 then
            begin
                redata := mscomm.Input;      // 接收数据            for i := 0 to vararrayhighbound(redata,1) do
                begin
                    ApduRecvDataBuff[i] := Integer(redata[i]);
                    restr := restr + IntToHex(Integer(redata[i]), 2) + ' ';
                end;
                WriteLog('接收数据:' + restr);
            end else
            begin          
                WriteLog('接收数据:' + restr);
                Result := 0;
                Exit;
            end;
      

  6.   

    你在你发送的每个字符串后面加一个chr(13),把Rthread设置为1,把inputlen属性也设置为1,应该就没什么问题了