• delphi中使用spcomm来实现串口通讯(转载)


    http://blog.sina.com.cn/s/blog_7880f98301010pi8.html

    转自——飘雪的世界

    最近两天一直在研究spcomm控件的使用,之前也是很不太明白,看了很多的例子,可是按照网上很多的例子它们多少都有点瑕疵,运行不了,鉴于自己在做这方面的项目,也用了645规约试验了下,现在终于明白了一点。不过要想精通还再要学习!先把我的学习经验跟大家分享下,也让很多新手快点上手。

    其实相对于mscomm来讲,spcomm简单明了容易操作,其主要有几个属性要设置和它的方法判断以及事件驱动三大块,掌握了这三个步骤那全盘解决了!

    一、属性设置-(不过我还没研究好怎么在程序中动态设置)

    comm1.CommName:=‘COM1’;   //串口号
    comm1.BaudRate:=1200; //波特率 1200 4800 9600 115200当然也可以有范围比方1201 1205 
    comm1.ByteSize:=_8;         //数据位   5 6 7 8 
    comm1.Parity:=Even;        //检验位 Even Odd None Space Mark
    comm1.StopBits:=_1;       //停止位 1 1.5 2
    comm1.OnReceiveData:=Comm1ReceiveData; //这个是你以后写事件驱动时的名称,你可以改成你的名字

    二、方法

        comm1.StartComm;   //打开串口 当然它也有异常捕获共七种::⑴串口已经打开;⑵打开串口错误;⑶文件句柄不是通信句柄;⑷不能够安装通信缓存;⑸不能产生事件;⑹不能产生读进程;⑺不能产生写进程;


    comm1.StopComm方法用于关闭串口,没有返回值; 

    comm1.WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word )方法是个带有布尔型返回值的函数,用于将一个字符串发送到写进程,发送成功返回 true,发送失败返回 false。执行此函数将立即得到返回值,发送操作随后执行。该函数有两个参数,其中 pDataToWrite是要发送的字符串, dwSizeofDataToWrite是发送字符串的长度。 



    3.事件 

    comm1.OnReceiveData :procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object 

    当有数据输入缓存时将触发该事件,在这里可以对从串口收到的数据进行处理。 Buffer中是收到的数据, BufferLength是收到的数据长度。

    下面是我用645规约编写的一个例子 在delphi7.0中已经试验过。

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, SPComm, ExtCtrls;

    type
    TForm1 = class(TForm)
        Comm1: TComm;
        memo1: TMemo;
        Button2: TButton;
        Panel1: TPanel;
        Label5: TLabel;
        ComboBox1: TComboBox;
        ComboBox4: TComboBox;
        Label1: TLabel;
        Label4: TLabel;
        ComboBox5: TComboBox;
        ComboBox2: TComboBox;
        Label2: TLabel;
        Label3: TLabel;
        ComboBox3: TComboBox;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
          BufferLength: Word);
    private
        { Private declarations }
        procedure senddata(Sarr:array of byte);
    public
        { Public declarations }
    end;

    var
    Form1: TForm1;
    viewstring:string;
    sbuf:array of byte;
    rbuf:array of byte;
    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);   //属性设置
    begin
    comm1.CommName:=COMBOBOX1.Text;
    comm1.BaudRate:=strtoint(combobox2.Text);
    comm1.ByteSize:=_8;
    comm1.Parity:=Even;
    comm1.StopBits:=_1;
    comm1.OnReceiveData:=Comm1ReceiveData;
        comm1.StartComm;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
       comm1.StopComm;
       close;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var i:integer;

    begin
    setlength(sbuf,18);
    for i:=0 to 3 do
    sbuf[i]:=$fe;
    sbuf[4]:=$68;
    for i:=5 to 10 do
    sbuf[i]:=$99;
    sbuf[11]:=$68;
    sbuf[12]:=$01;
       sbuf[13]:=$02;
       sbuf[14]:=$65;
       sbuf[15]:=$f3;
       sbuf[16]:=$c1;
       sbuf[17]:=$16;
       senddata(sbuf);     //调用发送数据函数 sbuf{254 254 254 254 104 153 153 153 153 153 153 104 1 2 193 22}
    end;
    procedure TForm1.senddata(Sarr:array of byte);
    var
    j:integer;
    commflag:boolean;
    begin
       viewstring:='';
       commflag:=true;
       for j:=0 to 17 do
         begin
           if not Form1.Comm1.WriteCommData(@Sarr[j],1) then   //应用WriteCommData方法
             begin
               commflag:=false;
               break;
             end;
             sleep(2);
             viewstring:=viewstring+inttohex(Sarr[j],2)+' ';
         end;
         viewstring:='发送'+viewstring;
         form1.memo1.Lines.Add(viewstring);
         form1.memo1.Lines.Add(' ');
         if not commflag then messagedlg('发送失败',mterror,[mbyes],0);

    end;
    procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;   //事件
    BufferLength: Word);
    var
    k:integer;
    begin
       viewstring:='';
       setlength(rbuf,bufferlength);
       move(buffer^,pchar(rbuf)^,bufferlength);
       for k:=0 to bufferlength do
         viewstring:=viewstring+ inttohex(rbuf[k],2)+ ' ';
         viewstring:='接收'+viewstring;
         memo1.Lines.Add(viewstring);
         memo1.Lines.add(' ');
    end;

    end.

    这个是根据645规约的协议写的。

    动态设置spcomm的属性值

        终于找到了动态设置spcomm属性值的方法了,真的很感谢“暴风雨前的宁静"的文章,他给了很大的提示和帮助。

       spcomm的属性主要是5个方面的设置,其中串口名和波特率都很好处理,直接设置text / strtoint就可以了,而其他三个属性就不是这么容易。其动态设置如下,但是如果在运行中若更改则是需要先关闭stopcomm,然后再设置,否则会出错。

       comm1.CommName:=combobox1.Text;
       comm1.BaudRate:=strtoint(combobox2.Text);
       comm1.ByteSize:=Tbytesize(combobox3.ItemIndex);
       comm1.StopBits:=Tstopbits(combobox4.ItemIndex);
       comm1.Parity:=Tparity(combobox5.ItemIndex);

  • 相关阅读:
    git 回滚到某个历史版本
    java值传递与引用传递
    Spring的事务管理
    MySql安装详细图解 以及卸载不干净解决方法
    如果你决定要出发,那么旅行中最困难的部分已经结束,出发吧!
    微信小程序总是提醒安装X5内核
    使用vuerouter实现返回
    手机上测试
    H5移动端知识点总结
    微信小程序授权问题
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/6096345.html
Copyright © 2020-2023  润新知