http://www.cnblogs.com/beeone/archive/2010/08/12/1798280.html
心得
如果你已经会使用SPCOMM且出现10个以上的串口问题
请改一下串口名
COM1.CommName='//./com18';
就这样 加'//./'就行了我也不知道什么回事.......
以下为抄录不知道是谁的
Delphi 是新一代可视化开发工具,它具有功能强大、简便易用和代码执行速度快等特点,是全球公认的快速应用开发工具技术的先驱者,它越来越在构架企业信息系统方面发挥着重要作用。由于Delphi 这些显著特点,许多程序员选择Delphi作为开发工具编制各种应用程序。但是,令人惋惜的是Delphi没有自带串口通讯的控件,在它的帮助文档里也没有提及串口通讯,这就给编制通讯程序的开发人员带来众多麻烦,影响了开发进度,下面就这一技术进行讨论。 用Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序。利用API编写串口通信程序较为复杂,需要掌握大量通信知识,其优点是可实现的功能更强大,应用面更广泛,更适合于编写较为复杂的低层次通信程序。相比较而言,利用SPComm控件则相对较简单,该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作。 使用控件这一方法容易掌握,而SPCOMM支持多线程,所以SPCOMM控件的应用更加广泛。结合实例详细介绍SPCOMM的使用。一.SPCOMM控件的安装
1.选择下拉菜单Component的第二项Install Component 。
在Unit file name 处填写控件SPCOMM控件所在路径,其它可用默认值,点击OK按纽。
2.安装成功后,system控件面板中将出现一个红色控件COMM。现在使用COMM控件可以象Delphi自带控件一样使用.。
二.SPCOMM的主要属性,方法和事件
1.属性CommName:填写COM1,COM2…等串口的名字,在打开串口前,必须填写好此值。
BaudRate:设定波特率9600,4800等,根据实际需要来定,在串口打开后也可更改波特率,实际波特率随之更改。
ParityCheck:奇偶校验。
ByteSize:字节长度_5,_6,_7,_8等,根据实际情况设定。
Parity:奇偶校验位StopBits:停止位SendDataEmpty:这是一个布尔属性,为true时表示发送缓存为空,或者发送队列里没有信息;为False时表示表示发送缓存不为空,或者发送队列里有信息。
2.方法 Startcomm过程用于打开串口,当打开失败时通常会报错,错误主要有7种:
⑴串口已经打开 ;
⑵打开串口错误 ;
⑶文件句柄不是通讯句柄;
⑷不能够安装通讯缓存;
⑸不能产生事件 ;
⑹不能产生读进程;
⑺不能产生写进程;
StopComm过程用于关闭串口,没有返回值。
函数WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word ): boolean 用于发送一个字符串到写线程,发送成功返回true,发送失败返回false, 执行此函数将立即得到返回值,发送操作随后执行。函数有两个参数,其中 pdatatowrite是要发送的字符串,dwsizeofdatatowrite 是发送的长度。
3.事件OnReceiveData : procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object
当输入缓存有数据时将触发该事件,在这里可以对从串口收到的数据进行处理。Buffer中是收到的数据,bufferlength是收到的数据长度。
OnReceiveError : procedure(Sender: TObject; EventMask : DWORD)
当接受数据时出现错误将触发该事件。
三.SPCOMM的使用 下面,我们结合一个串口通讯的例子来说明SPCOMM的使用。
为了实现PC与单片机8051之间的通讯,首先要调通它们之间的握手信号,假定它们之间的通讯协议是,
PC到8051一帧数据6个字节,8051到PC一帧数据也为6个字节,当PC发出(F0,01,FF,FF,01,F0)后能收到这样一帧(F0,01,FF,FF,01,F0),表示数据通信握手成功,两者之间就可以按照协议相互传输数据。在PC方要发送及接受数据需要以下步骤:1.创建一个新的工程COMM.DPR,把窗体的NAME属性改为FCOMM,把窗体的标题改为测试通讯,添加控件。 对COMM1(黑色矩形围住的控件)进行属性设计,设波特率4800,校验位无,字节长度_8,停止位_1,串口选择COM1。Memo1中将显示发送和接受的数据。选择File/Save As将新的窗体存储为Comm.pas。
实例一:
01 |
{ |
02 |
@功能:用Spcomm控制串口收发数据。 |
03 |
@作者:小涛(beeone) |
04 |
@时间:2010-08-12 |
05 |
@EMail :[email protected] |
06 |
} |
07 |
|
08 |
unit Unit1; |
09 |
|
10 |
interface |
11 |
|
12 |
uses |
13 |
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, |
14 |
Dialogs, StdCtrls, SPComm; |
15 |
|
16 |
type |
17 |
TForm1 = class (TForm) |
18 |
Com1: TComm; |
19 |
Edit1: TEdit; |
20 |
Button4: TButton; |
21 |
Memo1: TMemo; |
22 |
GroupBox1: TGroupBox; |
23 |
Button1: TButton; |
24 |
Button2: TButton; |
25 |
Button3: TButton; |
26 |
procedure Button1Click(Sender: TObject); |
27 |
procedure Button2Click(Sender: TObject); |
28 |
procedure Button4Click(Sender: TObject); |
29 |
procedure Com1ReceiveData(Sender: TObject; Buffer: Pointer ; |
30 |
BufferLength: Word ); |
31 |
procedure Button3Click(Sender: TObject); |
32 |
private |
33 |
{ Private declarations } |
34 |
public |
35 |
{ Public declarations } |
36 |
end ; |
37 |
|
38 |
var |
39 |
Form1: TForm1; |
40 |
|
41 |
|
42 |
implementation |
43 |
|
44 |
{$R *.dfm} |
45 |
//打开串口 |
46 |
procedure TForm1 . Button1Click(Sender: TObject); |
47 |
begin |
01 |
Com1 . StopComm; |
02 |
Com1 . StartComm; |
03 |
Button1 . Enabled := False ; |
04 |
Button2 . Enabled := True ; |
05 |
|
06 |
end ; |
07 |
//关闭串口 |
08 |
procedure TForm1 . Button2Click(Sender: TObject); |
09 |
begin |
10 |
Com1 . StopComm; |
11 |
Button2 . Enabled := False ; |
12 |
Button1 . Enabled := True ; |
13 |
|
14 |
end ; |
15 |
|
16 |
procedure TForm1 . Button4Click(Sender: TObject); |
17 |
begin |
18 |
com1 . WriteCommData( PChar (Edit1 . text),length(Edit1 . Text)); |
19 |
|
20 |
end ; |
21 |
|
22 |
procedure TForm1 . Com1ReceiveData(Sender: TObject; Buffer: Pointer ; |
23 |
BufferLength: Word ); |
24 |
var |
25 |
pStr : PChar ; |
26 |
|
27 |
begin |
28 |
pStr := Buffer; |
29 |
Memo1 . Lines . Add(pStr); |
30 |
|
31 |
end ; |
32 |
procedure TForm1 . Button3Click(Sender: TObject); |
33 |
begin |
34 |
Close; |
35 |
end ; |
36 |
|
37 |
end . |
001 |
//********************************************************* |
002 |
// Kaersoft 卡尔软件 |
003 |
// ************************************* |
004 |
// http://www.kaer.cn/default.aspx |
005 |
// Email:[email protected] |
006 |
// QQ:54076683 |
007 |
// Delphi 7.0 PASS |
008 |
// 调测人:JPYC |
009 |
//********************************************************** |
010 |
// 程序功能 |
011 |
// 演示SPCOMM收发数据的例子 |
012 |
//********************************************************** |
013 |
//实现思路:打开窗体时自动打开串口1,关闭是自动关闭串口 |
014 |
//********************************************************** |
015 |
// 2010-08-12 被 Beeone完善 |
016 |
//********************************************************** |
017 |
unit Unit1; |
018 |
|
019 |
interface |
020 |
|
021 |
uses |
022 |
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, |
023 |
Dialogs, StdCtrls, SPComm; |
024 |
|
025 |
type |
026 |
TForm1 = class (TForm) |
027 |
Comm1: TComm; |
028 |
Memo1: TMemo; |
029 |
Memo2: TMemo; |
030 |
Button3: TButton; |
031 |
Button4: TButton; |
032 |
Check1: TCheckBox; |
033 |
Label1: TLabel; |
034 |
Label2: TLabel; |
035 |
procedure Button4Click(Sender: TObject); |
036 |
procedure Button3Click(Sender: TObject); |
037 |
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer ; |
038 |
BufferLength: Word ); |
039 |
procedure FormCreate(Sender: TObject); |
040 |
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean ); |
041 |
procedure SendHex(S: String ); |
042 |
private |
043 |
{ Private declarations } |
044 |
public |
045 |
{ Public declarations } |
046 |
end ; |
047 |
|
048 |
var |
049 |
Form1: TForm1; |
050 |
|
051 |
implementation |
052 |
|
053 |
{$R *.dfm} |
054 |
|
055 |
procedure TForm1 . Button4Click(Sender: TObject); |
056 |
begin |
057 |
close; |
058 |
end ; |
059 |
|
060 |
procedure TForm1 . SendHex(S: String ); |
061 |
var |
062 |
s2: string ; |
063 |
buf1: array [ 0..50000 ] of char ; |
064 |
i: integer ; |
065 |
begin |
066 |
s2:= '' ; |
067 |
for i:= 1 to length(s) do |
068 |
begin |
069 |
if ((copy(s,i, 1 )>= '0' ) and (copy(s,i, 1 )<= '9' )) or ((copy(s,i, 1 )>= 'a' ) and (copy(s,i, 1 )<= 'f' )) |
070 |
or ((copy(s,i, 1 )>= 'A' ) and (copy(s,i, 1 )<= 'F' )) then |
071 |
begin |
072 |
s2:=s2+copy(s,i, 1 ); |
073 |
end ; |
074 |
end ; |
075 |
for i:= 0 to (length(s2) div 2 - 1 ) do |
076 |
buf1[i]:= char (strtoint( '$' +copy(s2,i* 2 + 1 , 2 ))); |
077 |
Comm1 . WriteCommData(buf1,(length(s2) div 2 )); |
078 |
end ; |
079 |
|
080 |
//发送数据 |
081 |
procedure TForm1 . Button3Click(Sender: TObject); |
082 |
var |
083 |
p: pchar ; |
084 |
x: integer ; |
085 |
begin |
086 |
if Check1 . Checked then |
087 |
SendHex(Memo1 . Lines . Text) //发送十六进制 |
088 |
else begin |
089 |
x:=Length(Memo1 . Lines . Text); //发送字符 |
090 |
p:= Pchar (Memo1 . Lines . Text); |
091 |
Comm1 . WriteCommData(p,x); //spcomm发送数据的函数 |
092 |
end ; |
093 |
end ; |
094 |
|
095 |
//接受数据 |
096 |
procedure TForm1 . Comm1ReceiveData(Sender: TObject; Buffer: Pointer ; |
097 |
BufferLength: Word ); |
098 |
var |
099 |
tmpArray : array [ 0..4096 ] of Byte ; |
100 |
ArraySize,i : DWORD; |
101 |
Count : DWORD; |
102 |
tmpStr : string ; |
103 |
pStr : PChar ; |
104 |
begin |
105 |
//如果“十六进制/字符”被选中 |
106 |
if Check1 . Checked then |
107 |
begin |
108 |
pStr := Buffer; |
109 |
tmpStr := string (pStr); |
110 |
Dec(PStr); |
111 |
for i:= 0 to Length(tmpStr)- 1 do |
112 |
begin |
113 |
inc(pStr); |
114 |
tmpArray[i] := Byte (pStr^); |
115 |
Memo2 . Lines . Add(IntToHEX(Ord(tmpArray[i]), 2 )); |
116 |
end ; |
117 |
exit; |
118 |
end ; |
119 |
//------------------------------------------------------------------------------ |
120 |
|
121 |
pStr := Buffer; |
122 |
memo2 . Lines . Add(pStr); |
123 |
end ; |
124 |
|
125 |
//打开串口 |
126 |
procedure TForm1 . FormCreate(Sender: TObject); |
127 |
begin |
01 |
Comm1 . StopComm; |
02 |
Comm1 . StartComm; |
03 |
end ; |
04 |
|
05 |
//关闭串口 |
06 |
procedure TForm1 . FormCloseQuery(Sender: TObject; var CanClose: Boolean ); |
07 |
begin |
08 |
Comm1 . StopComm; |
09 |
end ; |
10 |
|
11 |
end . |