本文整理自网络,侵删。
最近两天一直在研究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 Markcomm1.StopBits:=_1; //停止位 1 1.5 2comm1.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
usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, SPComm, ExtCtrls;
typeTForm1 = 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;
varForm1: TForm1;viewstring:string;sbuf:array of byte;rbuf:array of byte;implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); //属性设置begincomm1.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;
beginsetlength(sbuf,18);for i:=0 to 3 dosbuf[i]:=$fe;sbuf[4]:=$68;for i:=5 to 10 dosbuf[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);varj: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);vark: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);转自――飘雪的世界
相关阅读 >>
Delphi datetime,date,time tdatetimepicker
更多相关阅读请进入《Delphi》频道 >>