1,用spcomm时计算接受次数在XP机下是n个n个的加的,n指的是一次接收了多少字符,而在自己的win机下用同样的程序试了下,发现是正常的一个一个加的,不知道跟系统有么有关系?
2,在打开串口时也遇到同样问题,在自己电脑下是用try except 可以捕捉异常,在xp下就不同。而且delphi和spcomm是一模一样的·····

解决方案 »

  1.   

    应该跟mscomm的rthread接收的字节设置有关。
      

  2.   

    你用的Spcomm是哪个版本的,推荐使用cnpack的组件包。里面有Spcomm的封装,很不错的。W7有权限控制的。运行程序,要给管理员权限的。
      

  3.   

    SPCOMM不是有设置单次数据接收长度设置吗,一般都是一包接收一次,当然接收超时不要设置的刻意的小,我试过一包数据最大2048个字节的,数据加CRC校验的,收完之后用验证下就可以了,基本没什么错。XP、win7、win8.1都有试过。
      

  4.   

     感觉unearth说的有道理。小弟刚学,听不太懂,用的spcomm是网上下的,说是源码进过修改,可以虚拟串口实验。不过个人感觉跟接收长度设置没关系,
    接受代码跟大家的差不多,如下
    procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
     var
     i:integer;
     begin
    viewstring1:='';
    sleep(30);
    move(buffer^ ,(pchar(@rbuf))^,Bufferlength);
     for i:=1 to bufferlength do
     begin
     viewstring1:=viewstring1+inttohex(rbuf[i],2)+' ';
    end;
    Memo2.Text:=Memo2.Text+viewstring1;
     statusbar1.Panels[1].Text:='通讯状态:'+'串口正在接收数据';
     count2:=count2+1;      //这是计算接收次数的,在公司电脑就是几个几个加的,自己电脑就是一个一个加
      Label7.Caption:='Tx:'+IntToStr(count2);
     s:='$0012';
     n:=strtoint(s);
     memo3.text:=memo3.Text+inttostr(n);
     if autoclear.Checked and (Memo1.Lines.Count > 100) then
         Memo2.Clear;
     end; 
      

  5.   

    你可以发一包大于2048个字节的数据看看,比如5000字节,spcomm最大一包没记错的话,应该就是2048,你如果这时设置接收数据长度是2048,那么5000字节的话会触发spcomm接收3次,你的记数会因为这包数据加3次。当然长度设置短了,分包触发就越多。
    另外一个原因是发送超时,每个字节和每包数据都有超时时间,超过这个临界值,一包数据也会被分为二次触发,你的记数也会增加。
    电脑cpu在很忙,或者内存吃紧的时候串口数据收发会有延迟,也可能会影响超时时间,从而影响触发次数。
    经验之谈,仅供参考。
      

  6.   

    谢谢wangyang4506。我只有十六进制形式发送接收,当然,接收时也可以接,而且设置的接受长度位一直2048,上面rbuf在程序开始已设置了,现在是自己的电脑,明天去公司试一下看看