关于delphi上位机的报告Word格式文档下载.docx
- 文档编号:19874825
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:12
- 大小:58.08KB
关于delphi上位机的报告Word格式文档下载.docx
《关于delphi上位机的报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《关于delphi上位机的报告Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
PIC单片机是一种RISC(精简指令集计算机)、哈佛双总线和两级指令系统流水线结构的高性价比的8位嵌入式控制器,具有集成度高、速度快、工作电压低、功耗低、I/O直接驱动、指令简单易学易用等特点,是目前使用非常广泛的一种单片机。
在PIC系列单片机中多数型号具有串行通信接口USART(通用同步异步收发器),选用的PIC单片机(PIC16c)PORTC口的RC6、RC7分别与发送端TX、接收端RX复用。
为了把它们分别设置成串行通信接口的发送和接收线,需要把片内的寄存器RCSTA中的SPEN位(D7)置1,同时还需要把PORTC的方向控制寄存器TRISC的D7位和D6位分别置1和置0,即将RC7、RC6分别设置为输人和输出。
单片机内与串行通信有关的寄存器为:
发送状态和控制寄存器TXSAT、接收状态和控制寄存器RCS.TA、波特率寄存器SPBRG、发送移位寄存器TSR、发送缓冲器TXREG、接收移位寄存器RSR和接收缓冲器
在Delphi中进行串行通信的方法有以下几种:
a)利用嵌人式汇编语言;
b)调用Windows中的API函数;
c)利用ActiveX控件;
d)利用第三方控件,一般情况下较易实现串行通信,能够用少量的代码轻松高效地完成任务。
本文采用Spcomm控件,其功能强大,使用方便,具有丰富的与串口通信密切相关的属性事件和方法,提供了对串口的各种操作。
其主要属性、事件及方法如下。
1)属性
Commnamm:
表示串口coml、corn2的名字;
Baudrate:
根据实际情况设定的波特率,在打开串口后也可更改此值,实际波特率随之改变;
Bytesize:
根据实际情况设定的字节长度;
Paritycheck:
表示是否需要校验;
Parity:
奇偶校验位;
st0pbits:
停止位;
Senddataempty:
布尔型属性,为True时表示发送缓存为空或者发送队列中没有消息,为False时表示发送缓存不为空。
2)事件
Onreceivedata:
当有数据输人缓存时,将触发该事件;
OnreceiveError:
当接收数据出现错误时,触发该事件。
3)方法
Startcomm:
用于打开串口,当打开失败时通常会报错;
Stopcomm:
用于关闭串口,没有返回值;
Writecommdata:
用于将一个字符串发送到写进程。
硬件连接见图l。
MAX232ACPE为一个电平转换器,以实现,ITIIL电平与RS-232电平的相互转换。
图1.硬件连接示意图
程序实现。
先创建一个工程comm.dpr,把窗体的NAME属性定义为FComm,窗口的标题定义为串口通信,再添加控件COMM,然后设定FComm窗体中COMM属性,波特率为9.6kb/s,奇偶校验位设为False,字节长度设为8,停止位设为1,串口(Comm.Name)设为COM1。
上位机主要通信程序如下:
proceduretfcomm.formshow(sender:
tobject);
begin
comm1.startcomm;
//创建窗体时将Comm控件打开
end
procedurefcomm.formclose(sender:
tobject;
varaction:
tcloseaction);
begincomm1.stopeomm;
//关闭窗体时将Comm控件关闭
proceduresenddata;
//定义数据发送过程
vati:
integer;
commflg:
boolean
viewstring:
;
true;
fori:
=1to8do
ifnotfcomm.comm1.writeeommdata(@sbuf[i],1)then
begincommflg:
=false;
break
end;
sleep
(2);
=viewstring+inttohex(subf[i],2);
:
发送+viewstring;
fcomm.memo.1ine.add(viewstring);
fcomm.memo.1ine.add();
ifnotcommflgthen
messageflg(发送失败.mterror.[mbyes],0);
proceduretfcomm.buttonclick(sender:
//接收数据过程VHI
strreceive:
string;
bufer:
pointer;
buferlength:
word;
setlength(strreceive。
buferlength);
move(bufer~,pcher(strreceive),buferlength);
memo.1ine.add(strreceive);
//接收传送来的数据并在窗体中显示
memo.invalidate;
本文对Delphi下利用spcomm控件实现上位机(PC机)与PIC单片机之间的串行通信的方法进行了探讨。
通信程序编制容易实现,具有一定的参考价值。
该串行通信方法值得在其他工程中应用。
三.Delphi环境下PC机与AVR单片机的串行通讯
本文即介绍了X射线板材测厚系统中上下位机的串行通讯。
下位机采用AVR单片机ATmega16进行数据采集,前置电路对3路检测信号进行光电转换和放大处理后送入到ATmega16单片机自带的10位A/D转换器中进行A/D转换,单片机再将三路转换值以16进制通过串行通讯发往PC机;
上位机中采用Delphi编写软件,利用Delphi的强大数据库功能管理下位机发送的数据,供图表显示和产量、成品计算等;
并在Delphi中利用SPComm控件实现与下位机的串行通讯。
3.1下位机软件设计
AVR单片机ATmega16的USART是一个高度灵活的串行通讯设备,能进行全双工操作,可工作在异步方式或同步方式下,并具有多处理器通讯模式、倍速异步通讯模式等增强型通信功能。
下位机的软件设计主要是通讯协议的设定和相关程序的设计。
(1)通讯协议给上下位机设置适当的通讯协议是保证上下位机能正常通讯的基础。
系统采用全双工异步通讯模式,通讯协议设置如下:
波特率 采用9600帧格式,数据格式采用8位数据位,1位起始位,1位停止位。
为使通讯更可靠,使能了奇偶校验功能,采用奇校验。
但如果上位机检测出所接收的数据错误,则丢弃不用,不再给下位机发信号请求重新发送数据,以保证单片机稳定的采样频率。
握手协议,采用软件实现上下位机的握手,下位机要往上位机发送数据时,先发送一个握手信号:
aa;
上位机收到后回发一个信号:
bb,表示已经做好数据接收准备。
(2)程序设计
下位机通讯的程序采用C语言编写,主要任务是完成USART的初始化、采集数据的A/D转换、握手的实现和数据的发送。
这里主要介绍串口的初始化程序以及通讯程序的流程图。
串口的初始化程序:
主要设置相关的通信协议。
voidusartinit(void)//USART初始化
{
UCSRB=0x00;
//初始化时先关闭USART
UCSRC=(1<
<
URSEL)|0x36;
//异步模式,奇校验,1个停止位,8位数据位
UBRRL=0x33;
UBRRH=0x00;
//波特率设为9600
UCSRA=0x00;
//单机通讯
UCSRB=<
RXCIE)|(1<
RXEN)|(1<
TXEN);
//打开USART,使能接收中断,使能发送和接收
}
通讯流程简介:
在完成相关的初始化工作后,启动A/D转换,当3路信号都转换完成后单片机往上位机发握手信号,等待上位机的应答。
串口发送采用查询方式,即CPU不停地查询数据寄存器是否为空,若为空则装载新的数据开始发送;
而接收则采用中断方式,在数据接收结束后进入中断服务程序,为使程序尽量少地在中断中停留,中断服务程序中仅完成对握手信号的判别和发送标志的置位。
当握手成功后,单片机把转换的数据往上位机发送,数据全部发送完成后即进入下一轮的采样、转换和发送。
串行通讯流程如图2所示:
图2串行通讯流程图
3.2上位机软件设计
Delphi是一种采用事件驱动方式、面向对象的可视化高级编程语言,本系统的通讯软件设计采用Delphi7.0。
在Delphi可以利用的众多串行通信控件,SPComm控件是最简单,功能比较强大的一种。
该控件具有丰富的与串口通信密切相关的属性及事件,提供对串口的各种操作。
3.2.1SPComm的主要属性、方法和事件
(1)属性
Commonage:
串口名,填写COM1,COM2等串口的名字,字符型变量;
BaudRate:
设定波特率。
如9600,19200等,在串口打开后也可更改波特率;
ParityCheck:
是否使能奇偶校验;
ByteSize:
字节长度。
根据实际情况可设定为5,6,7或8位;
Parity:
奇偶校验位;
StopBits:
停止位的位数;
SendDataEmpty:
这是一个布尔属性,为True时表示发送缓存为空,或者发送队列里没有信息;
为False时表示发送缓存不为空,或者发送队列里有信息。
(2)方法
Startcomm:
用于打开串口,若打开失败通常会报错;
StopComm:
用于关闭串口,没有返回值。
(3)函数
WriteCommData(pDataToWrite:
PChar;
dwSizeofData2ToWrite:
Word):
boolean:
用于发送一个字符串到写线程,发送成功返回True,失败则返回False,执行此函数将立即得到返回值,发送操作随后执行。
函数有2个参数,其中pDataToWrite是需要发送的字符串,dwSizeofDataToWrite是发送的字符串的长度。
(4)事件
OnReceiveData:
procedure(Sender:
TObject;
Buffer:
Pointer;
Bufferlength:
Word)ofobject:
当输入缓存有数据时触发该事件,在这里可以对从串口收到的数据进行处理。
Buffer中是收到的数据,Bufferlength是收到的数据长度。
OnReceiveError:
procedure(Sender:
Event2Mask:
DW()RD):
当接收数据时出现错误将触发该事件。
3.1.2程序关键部分的实现
Delphi中用于串口通讯的程序较少,集中在简单的串口打开和关闭、握手信号的测试和下位机采集数据的接收这几大板块,以下仅做简单介绍。
(1)打开串口并初始化
procedureTForm1.Opencomm(Sender:
TObject);
Comm1.CommName:
=comm;
//选择串口
Comm1.BaudRage:
=9600;
//设定波特率为9600
Comm1.Parity:
=odd;
//奇校验
Comm1.StopBits:
=1;
//1位停止位
Comm1.ByteSize:
=8;
//8位数据位
Comm1.StartComm;
//打开串口
end;
(2)测试握手信号
procedureTForm1.ButtonlClick(Sender:
var
i:
byte;
commflg:
boolean;
//变量定义
sbuf[1]:
=byte(aa);
=true;
//若信号正确标志设定true
ifnotTForm1.comm1.writecommdata(@sbuf[1],1)then
=false;
//若接收的握手信号错误,标志设为false
(3)数据接收事件
procedureTForm1.CommlReceiveData(Sender:
TObject;
Buffer:
Pointer;
BufferLength:
Word);
i,j:
integer;
commRevstr:
shortstring;
RevP:
RecData[1..1024]ofbyte;
SetLength(CommRevStr,BufferLength);
//设置字符串长度与缓冲区大小相等;
move(buffer,pchar(@rbuf),bufferlength);
//将缓冲区内容拷贝到字符串地址上;
fori:
=1tobufferlengthdo
viewstring:
=viewstring+inttohex(rbuf[i],2)+””;
//接收到的数据在窗体中显示
RecData[i]:
=integer(S[i]);
//存储接收到的数据
⋯⋯
//限于篇幅和论述目的,接收到的数据的后续处理程序在此省略
(4)关闭串口
procedureTForm1.Button3Click(Sender:
Comm1.StopComm;
//关闭Comml
本文对实现上位机与AVR单片机之间串行通信的方法进行了详细的讨论。
通讯程序编程容易实现,在实际X射线实时板材测厚系统应用中,这种串口通信方法表现出了很强的工程实用性,通讯稳定可靠且成本低廉。
同时由于上下位机软件都是用高级语言编写,稍加修改便可方便地移植到其他相类似的工程系统中,故在测控工程领域有着广泛的应用前景。
四.我对Delphi的掌握
由于接触Delphi的时间并不长,所以对它的掌握还只是初级水平,下面以我编的一个四则运算器为例介绍一下。
程序如下:
unit四则运算;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls;
type
TForm1=class(TForm)
Label1:
TLabel;
Label2:
Label3:
Edit1:
TEdit;
Edit2:
Edit3:
Button1:
TButton;
Button2:
Button3:
Button4:
procedureButton1Click(Sender:
TObject);
procedureButton2Click(Sender:
procedureButton3Click(Sender:
procedureButton4Click(Sender:
private
{Privatedeclarations}
public
FunctionADD(A,B:
Integer):
Integer;
FunctionDEC(A,B:
FunctionMUL(A,B:
FunctionDEV(A,B:
real;
{Publicdeclarations}
end;
Form1:
TForm1;
implementation
functionTForm1.ADD(A,B:
integer):
begin
result:
=A+B;
functionTForm1.DEC(A,B:
=A-B;
functionTForm1.MUL(A,B:
=A*B;
functionTForm1.DEV(A,B:
=A/B;
{$R*.dfm}
procedureTForm1.Button1Click(Sender:
X,Y:
X:
=StrToInt(Edit1.Text);
Y:
=StrToInt(Edit2.Text);
Edit3.Text:
=IntToStr(ADD(X,Y));
end;
procedureTForm1.Button2Click(Sender:
=IntToStr(DEC(X,Y));
procedureTForm1.Button3Click(Sender:
=IntToStr(MUL(X,Y));
procedureTForm1.Button4Click(Sender:
=FloatToStr(DEV(X,Y));
end.
程序运行结果如下:
五.总结
Delphi的确是一款功能强大的上位机软件,学习Delphi的过程是一件充满愉快的事情,给人带来很大的成就感。
遗憾的是目前,我的掌握程度还很浅,将来做更深入的研究之后,一定再向林老师汇报。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 delphi 上位 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)