小弟想编写于串口通信的程序,主要是和单片机通信,本来是使用SSPCOM控件,但是发现到现在出现了一些问题,就是,对于发送的数据太大的就发送不出去,我是一个字节一个字节的发,好像我不敢一次发一串,因为单片机是每次只能收一个,我试过一次发一串的,单片机好像每次都只能受到第一个字节,所以改用每次发一个字节,COMFALG:=FALSE;
......
IF NOT COMM1.WRITEDATA(@SBUF,1) 
THEN
 COMFLAG:=TRUE;
......
IF COMFLAG THEN
SHOWMESSAGE(' SEND FAILURE');
发送600字节以下的基本上每次都可以成功,发送600-700之间的数据偶尔成功,发送700以上的一般都是显示“SEND FAILURE”;
看了sspcom的源程序,发现他定义的缓冲区是4096啊,但是我的就是不行啊!我想每次发送到600字节就主动清发送缓冲区,但是,SSPCOM好像不能清除,各位给个主意好不好啊!不想使用ACTIVEX 控件,安装时太麻烦!

解决方案 »

  1.   

    spcomm好像不能清空发送缓冲区,
    如果是用API还可以用
    var
      hcom:THandle;
    begin
      .........
       hcom:=CreateFile(....
       PurgeComm(hcom,PURGE_TXCLEAR);//清空发送缓冲区
       PurgeComm(hCom,PURGE_RXCLEAR) //清空接收缓冲区
      
    end;
      

  2.   

    还有没有其他的方法吗,难道只能用API编了吗,我的数据量有点大,不过最多也就32k,不想用MSCOMM,应为安装时很麻烦,我的软件做完了后不想做安装程序的!
      

  3.   

    我发送2560个数据没有问题。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, SPComm, ComCtrls;type
      TForm1 = class(TForm)
        Comm1: TComm;
        ComboBox1: TComboBox;
        BitBtn1: TBitBtn;
        Edit1: TEdit;
        BitBtn2: TBitBtn;
        BitBtn3: TBitBtn;
        BitBtn4: TBitBtn;
        Memo2: TMemo;
        BitBtn5: TBitBtn;
        Label1: TLabel;
        Label2: TLabel;
        memo1: TRichEdit;
        procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
          BufferLength: Word);
        procedure BitBtn4Click(Sender: TObject);
        procedure BitBtn3Click(Sender: TObject);
        procedure BitBtn5Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        tbuff:string;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      comm1.CommName:=ComboBox1.Text;
      Comm1.BaudRate:=StrToInt(Edit1.text);
      Comm1.StartComm;
    end;procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
      comm1.StopComm;
    end;procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var buff:array [0..65534] of char;
        count:integer;
        temp:string;          //凭证内容
        temp1:string;         //名称
    begin
      ////////////////////////////////////
      //开始接收数据
      //////////////////////////////////////////////
     // buff:=PChar(buffer);
     // count:=integer(bufferlength);
      //buff:=copy(buff,1,count);
      //showmessage('l');
      tbuff:='';
    //  setlength(buff,bufferlength);
      move(buffer^,buff,bufferlength);
      for count:=0 to bufferlength-1 do
      tbuff:=tbuff+' '+inttohex(ord(buff[count]),2);
      
      memo1.Text:=memo1.Text+tbuff;
      
    end;procedure TForm1.BitBtn4Click(Sender: TObject);
    begin
      tbuff:='';
      Memo1.Clear;
    end;procedure TForm1.BitBtn3Click(Sender: TObject);
    begin
      close;
    end;procedure TForm1.BitBtn5Click(Sender: TObject);
    var tmp:string;
        pDataToWrite:array of char;
        dwSizeofDataToWrite:Word;
        i:byte;
    begin
            setlength(pdatatowrite,2560);
      for i:=0 to 9 do
      for dwsizeofdatatowrite:=0 to 256 do
            pdatatowrite[i*256+dwsizeofdatatowrite]:=char(dwsizeofdatatowrite);  Comm1.WriteCommData(pchar(pDataToWrite),2560);end;end.
    我也是在朋友的上面改的,如果你要源程序,我给你发到你的email
    ************
    * 努力学习 *
    *   全为   *
    *¥人民币¥*
    ************
      

  4.   

    用Activex控件太麻烦了,我这里有一个用CBC写的对串口操作的类(源码,也是网上找的),我使用这个做这一些东西,感觉很好用.需要的话,请EMail:[email protected],
      

  5.   

    单片机因该没什么问题,因为,它每次都是收一个字节,然后送到RAM存起来,需要收的字节数在发送前已经获得了,单片机收够字节数后就转向处理数据了,600左右个字节基本上都可以成功的,但是数据大一点就不行了,650就不行了,我不用单片机收,改用串口调试工具收也是一样的,不知道为什么呢?
      

  6.   

    1。spcomm和单片机通信并不一定每次只发一个
    2。单片机接收中断处理程序不要进行复杂耗时的运算
    3。如果没有流量控制,则发送一定的字节数以后,spcomm要进行延时比如半秒
      

  7.   

    1。spcomm和单片机通信并不一定每次只发一个
    2。单片机接收中断处理程序不要进行复杂耗时的运算
    3。如果没有流量控制,则发送一定的字节数以后,spcomm要进行延时比如半秒
      

  8.   

    能不能直接写端口呢?
    比如说在VC中用IN、OUT类函数写个dll,给DELPHI调用就是了。
    我以前做过,没发现问题。
    COM口地址你自己在设备管理器的看一下,我忘了。