小弟我使用readfile 和writefile对串口读写,哪位老大帮我编个小例子,小弟感激不尽!

解决方案 »

  1.   

    nit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls,Unit2;type
      TForm1 = class(TForm)
        rdCOM: TRadioGroup;
        Label1: TLabel;
        mSend: TMemo;
        Label2: TLabel;
        mReceive: TMemo;
        btnOpenPort: TButton;
        btnSend: TButton;
        btnEnd: TButton;
        btnClear: TButton;
        procedure btnSendClick(Sender: TObject);
        procedure btnClearClick(Sender: TObject);
        procedure btnOpenPortClick(Sender: TObject);
        procedure btnEndClick(Sender: TObject);
        procedure mKeyPress(Sender: TObject; var Key: Char);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
        ReadThread:TReadThread;//声明读取数据的线程
      end;var
      Form1: TForm1;
      hComm: THandle;
      
    implementation{$R *.DFM}procedure TForm1.btnSendClick(Sender: TObject);
    var
      Temp:string;
      lrc:LongWord;
    begin
        if (hComm=0) then exit;//若尚未打开通信端口,则跳出
        Temp:=mSend.Text ;//欲送出的数据
        //执行送出的函数
        WriteFile(hComm,Pointer(Temp)^,Length(Temp), lrc, nil); //送出数据
    end;//以下是清除显示数据按钮按下时的执行程序代码
    procedure TForm1.btnClearClick(Sender: TObject);
    begin
     mReceive.Clear;   //将接收区清除
    end;//以下是打开通信端口的函数
    procedure TForm1.btnOpenPortClick(Sender: TObject);
    var
      cc:TCOMMCONFIG;
      Temp:string;
    begin
      //Temp:='COM'+inttostr(rdcom.ItemIndex+1); // 选择所要打开的COM
      Temp:='COM1';
      hComm:=CreateFile(PChar(Temp), GENERIC_READ or GENERIC_WRITE,
           0, nil, OPEN_EXISTING, 0, 0);// 打开COM
      if (hComm = INVALID_HANDLE_VALUE) then begin//如果COM 未打开
        MessageBox (0, '打开通信端口错误!!','',MB_OK);
        exit;
      end;  GetCommState(hComm,cc.dcb);  // 得知目前COM 的状态
      cc.dcb.BaudRate:=CBR_115200;  // 设置波特率为9600
      cc.dcb.ByteSize:=8;        //字节为 8 bit
      cc.dcb.Parity:=NOPARITY;  // Parity 为 None
      cc.dcb.StopBits:=ONESTOPBIT;// 1 个Stop bit  if not SetCommState(hComm, cc.dcb) then begin// 设置COM 的状态
        MessageBox (0, '通信端口设置错误!!!','',MB_OK);
        CloseHandle(hComm);//关闭通信端口
        exit;
      end;
    end;
    //结束系统的按钮
    procedure TForm1.btnEndClick(Sender: TObject);
    begin
       CloseHandle(hComm);//关闭通信端口
       close;//结束程序
    end;
    //当于Memo对象中按下按钮后,执行以下的程序
    procedure TForm1.mKeyPress(Sender: TObject; var Key: Char);
    begin
      if key=#13 then btnSendClick(btnSend);//按下Enter才执行
    end;//窗体建立时执行以下的程序
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      //建立线程对象,并且激活执行
      ReadThread:=TReadThread.Create(False);
    end;//窗体关闭时执行以下的程序
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      ReadThread.Free; //释放对象
    end;
    end.
      

  2.   

    unit Unit2;interfaceuses
      Windows,Classes, SysUtils;type
      TReadThread = class(TThread)
      private
        { Private declarations }
        procedure ReadPort;   //读取串行端口数据
      protected
        procedure Execute; override;
      end;implementation
    uses Unit1; // 声明引用Unit1,必须放在implementation区段function ReadHex(AString:string):integer;
    begin
      Result:=StrToInt('$'+AString)
    end;function UnicodeToAnsi(Unicode: string):string;
    var
      s:string;
      i:integer;
      j,k:string[2];
    begin
      i:=1;
      s:='';
      while i<Length(Unicode)+1 do begin
        j:=Copy(Unicode,i+2,2);
        k:=Copy(Unicode,i,2);
        i:=i+4;
        s:=s+Char(ReadHex(j))+Char(ReadHex(k));
      end;
      if s<>'' then
        s:=WideCharToString(PWideChar(s+#0#0#0#0))
      else
        s:='';
      Result:=s;
    end;procedure TReadThread.Execute;
    begin
      { Place thread code here }
      While not Terminated do
      begin
        Synchronize(ReadPort);//刚才所定义的读取数据函数
      end;
    end;//读取串行端口的程序放在这里
    procedure TReadThread.ReadPort;
      var
      Temp : string;
      inbuff: array[0..2047] of Char;
      nBytesRead, dwEvent, dwError:LongWORD ;
      cs:TCOMSTAT;
      begin
       if (hComm=0) then exit;//先判断是否已打开通信端口
       ClearCommError(hComm,dwError,@CS);  //取得状态
       ReadFile(hComm, inbuff,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据
       //串行在读取数据后,会自动将缓冲区中已被读取的数据清除掉
       if cs.cbInQue =0 then exit;
       // 数据是否大于我们所准备的Buffer
       if cs.cbInQue > sizeof(inbuff) then begin
         PurgeComm(hComm, PURGE_RXCLEAR);  // 清除COM 数据
         exit;
       end;
       Temp:=Copy(inbuff,1,cs.cbInQue);//取出数据
       //Temp := UnicodeToAnsi(Temp);
       Form1.mReceive.Text :=Form1.mReceive.Text + Temp;   // 将数据显示于Memo1 上
       Form1.mReceive.SetFocus ;
       Form1.mReceive.SelStart  := Length(Form1.mReceive.Text);
       Form1.mReceive.SelLength := 0;  //移到最下端end;
    end.
      

  3.   

    太多了~
    还不如用mscomm呢~
    这个来得快啊~
      

  4.   

    他要用API啊,不过我还是喜欢用SPCOMM控件,又稳定,比mscomm好多了,只不过16进字,不怎么样
      

  5.   

    mscomm:微软的东西,ActivX控件,使用简单,在VB中带的,性能一般,由于是ActivX控件,打包时需要注册好多信息,不推荐使用。
    spcomm:比较好的vcl,算是比较专业的,解剖了一下,功能比较完善。
    TurboPower:公认的专业通讯控件。可以到其站点下载,开放源码了。
    我在制作串口通讯软件时三种都用过,最终全部使用TurboPower!所以也推荐大家使用它。
    写了个例子,基本的串口通讯都可以实现,可提供参考。
    下载地址:http://www.kaer.cn/default.aspx(网站安全性较差,经常当机,如果急用,mail我)
    多多指正:[email protected]