在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2336|回复: 0

[资料] Delphi中串口通信实现

[复制链接]
发表于 2011-4-11 14:59:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
Delphi 是新一代可视化斥地对象,它具有功能强除夜、简便易用和代码执行速度快等特点,是全球公认的快速应用斥地对象手艺的前驱者,它越来越在构架企业信息系统方面施展着首要感导。因为Delphi 这些显著特点,很多法度员选择Delphi作为斥地对象编制各类应用法度。然则,令人怅惘的是Delphi没有自带串口通信的控件,在它的匡助文档里也没有说起串口通信,这就给编制通信法度的斥地人员带来浩瀚麻烦,影响了斥地进度,下面就这一手艺进行评论斗嘴。
  用Delphi 实现串口通信,常用的几种方式为:哄骗控件如MSCOMM和SPCOMM,哄骗API函数或者在Delphi 中调用其它串口通信法度。行使API编写串口通信法度较为复杂,需要把握除夜量通信常识,其长处是可实现的功能更强除夜,应用面更遍及,更适合于编写较为复杂的低层次通信法度。相对照而言,行使SPComm控件则相对较简单,该控件具有雄厚的与串口通信亲切相关的属性及事宜,供应了对串口的各类操作。
  哄骗控件这一方式随意草率把握,而SPCOMM支撑多线程,所以SPCOMM控件的应用加倍遍及。连络实例具体介绍SPCOMM的哄骗。
一.SPCOMM控件的安装
1.选择下拉菜单Component的第二项Install Component 。

  弹出图1所示的窗口,在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:奇偶校验位
pBits:住手位
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。
2.编写源代码
变量申明
var
FCOMM: TFCOMM;
Viewstring:string;
i:integer;
rbuf,sbuf:array[1..6] of byte;
打开串口
procedure TFCOMM.FormShow(Sender: TObject);
begin
comm1.StartComm;
end;
封闭串口
procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;
end;
发送数据
自定义的发送过程
procedure senddata;
var
i:integer;
commflg:boolean;
begin
viewstring:="";
commflg:=true;
for i:=1 to 6 do
begin
if not fcomm.comm1.writecommdata(@sbuf[i],1) then
begin
commflg:=false;
break;
end;
sleep(2); {发送时字节间的延时}
viewstring:=viewstring+inttohex(sbuf[i],2)+" ";
end;
viewstring:="发送"+viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add("");
if not commflg then messagedlg("发送掉败!",mterror,[mbyes],0);
end;
procedure TFCOMM.Btn_sendClick(Sender: TObject);{发送按钮的点击事宜}
begin
sbuf[1]:=byte($f0); {帧头}
sbuf[2]:=byte($01); {敕令号}
sbuf[3]:=byte($ff);
sbuf[4]:=byte($ff);
sbuf[5]:=byte($01);
sbuf[6]:=byte($0f); {帧尾}
senddata;{调用发送函数}
end;
领受过程
procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
begin
viewstring:="";
move(buffer^,pchar(@rbuf^),bufferlength);
for i:=1 to bufferlength do
viewstring:=viewstring+inttohex(rbuf[i],2)+" ";
viewstring:="接管"+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add("");
end;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-2-8 23:32 , Processed in 0.012945 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表