小弟用SPCOMM控件写一个和单片机通讯的程序,一次从单片机中取回3456个字节的数据,但该控件的缓冲区好像默认是2048个字节,这样的话就要分两次读取,之间有一个时间间隔.不知怎么样才能一次接收完?

解决方案 »

  1.   

    procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
      var rbuf :array[0..10000]  of byte;
        ReceStr,ViewStr:String;
    begin
         timer1.Enabled:=false;
        mmo1.Lines.Add('接收到来自'+comm1.CommName+'信息' ) ;
         ZeroMemory(pchar(@rbuf),10000);
         Move(buffer^,pchar(@rbuf)^,bufferlength);
         for i:=0 to bufferlength-1 do
             ReceStr:=ReceStr+chr(rbuf[i]);
        // for i :=0  to 10 do
           // ViewStr:='接收'+char(rbuf[i]);
           ViewStr:='接收';
        //   mmo1.Lines.Add('接收到:');
         mmo1.Lines.Add((recestr)) ;
         //MoInfo.lines.ADD(ViewStr);
    end;
      

  2.   

    系统启动时设置其buffersize:=4096;
    window的Socket默认缓冲区是4096,如果一次发送超过4096字节,可能导致
    数据丢失或异常出现。通常的解决方法是把数据分块发送,而且每块不超过
    4096字节,并加以同步控制。如:A 发送方;B 接收方
    开始:A发一个字节通知B开始收发。(可省略)
    发送(循环):A发送4000字节到B-----------B确认后通知A继续发送(可发送一个字节表示)-|
                 |--------------------------------------------------------------------|
    结束:A发一个字节通知B结束,双方断开Socket连接。
      

  3.   

    楼上的兄弟,我指的是SPCOMM控件通过串口和单片机通讯。
      

  4.   

    呵,顺便回复一下:)这跟波特率有关
    一般情况下,发送过来的字符都会有结束位的,你可以检查当前接收到的数据中是否有该字符来确定数据是否接收完毕。实现代码如下:var
      S: string; //全局proc 响应串口事件
    var
      S1: string
    begin
      ReadBuffer(S1);
      S := S + S1;
      if Pos('结束符', S1) = 0 then
      begin
        接收完毕,S中的值即为最终的结果。
      end;    end;我不知道是否有描述清楚,还是没有理解你的意思刚又看了一下你的问题,你说能不能一次接收完?这是不可能的,除非调整波特率。
      

  5.   

    在spcomm中有一行INPUTBUFFERSIZE = 2048;改成4096,也可以提高波特率。
      

  6.   

    INPUTBUFFERSIZE=2048这一行我始终没有找到啊~~!!!!
      

  7.   

    找到spcomm这个单元,按ctrl+F搜输入INPUTBUFFERSIZE就能找到了。