微机原理课程设计双机通信示波器报告.docx
《微机原理课程设计双机通信示波器报告.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计双机通信示波器报告.docx(23页珍藏版)》请在冰豆网上搜索。
微机原理课程设计双机通信示波器报告
一、内容摘要
本课程设计主要目的是实现计算机的双机串行通信。
在远程监控和自动控制系统中,通信编程是很重要的,并且在大多数情况下为串口通信的编程,因为串口通信较并行通信传输距离远,且信号跟稳定,通信线少,节约经济成本。
通过本次设计,有助于设计者了解和掌握串行通信的基本原理及编程设置。
本设计利用了计算机9针RS-232串行接口作为数据传送通道,进行双机、串行、异步、全双工的通信,并采用Delphi语言开发双机通信程序相应的人机界面,实现从键盘输入数据到发送缓冲区,并将接收缓冲区的数据读入并显示在相应的窗口,及具有将输入输出数据以十六进制数码进行传输的功能。
二、设计的意义和系统功能及使用方法
2.1本课程设计的意义
本课程设计通过利用计算机9针RS-232串口来实现双机串行通信,进一步巩固了学生在微机及汇编语言程序设计课程中所学习到的知识,同时,通过使用Delphi语言开发人机界面,也能让学生了解并掌握Delphi这种在自动化控制中有着很大作用的开发工具。
2.2系统功能及使用方法
本系统主要功能是实现计算机的双机串行通信,通信时参数——通信端口、波特率、数据位、校验位以及停止位可以在人机交互界面中动态修改,发送及接收到的数据可即时显示在交互界面的相应窗口处,并且还可设置是否以十六进制发送和显示接收到的数据。
本系统使用方法简单易行。
首先务必用串口线将两台微机的串行接口连接好;再在两台微机中分别运行用Delphi编写的可执行程序,此时该程序窗口中的指示灯为黑色,按需要设置好各通信参数——通信端口、波特率、数据位、校验位以及停止位(注意:
两台微机的通信参数必须设置一致,否则通信会出现错误);然后单击“打开端口”按钮,如打开端口成功,则指示灯变为红色,此时可在一台发送区输入要发送的数据,如要以十六进制传送则勾选“十六进制发送”复选框,最后单击“发送”按钮,至此即可从另一台微机的相应窗口看到传送来的数据,如要以十六进制显示输入缓冲区的数据则勾选“十六进制显示”复选框。
三、硬件电路设计及描述
本系统硬件电路设计较为简单,即用一条两端为母头的9针RS-232串口线连接到两台微机中即可。
值得注意的是,由于市场上销售的串口线有的未将两端的RXD和TXD对调,因此,使用串口线前,应对串口线的一个端口进行跳线处理——即将第2号引脚(RXD)和第3号引脚(TXD)对调,其目的在于将一台计算机9针RS-232的接受引脚连接上对方计算机9针RS-232的传送引脚,一方作为发送,一方作为接受,形成一个完整的回路。
具体跳线方法如图1所示:
两台计算机之间的联机示意图如图2所示:
图2微机通信接线示意图
9针RS-232串口的各个引脚的简写及定义如表1所示:
引脚
简写
意义
引脚1
CD
载波检测
引脚2
RXD
接受字符
引脚3
TXD
传送字符
引脚4
DTR
数据端准备好
引脚5
GND
地线
引脚6
DSR
数据准备好
引脚7
RTS
请求传送
引脚8
CTS
清除传送
引脚9
RI
响铃检测
表19针RS-232串口引脚定义
本次课程设计虽然通过9针串口线将两台微机串口的9个引脚做了相应链接,但实际上仅使用到了其中的RXD引脚、TXD引脚进行通信。
四、软件设计流程及描述
要建立串行通信的机制,可考虑使用WindowsAPI函数、MSComm或者SPComm组件。
本次课程设计采用的是在Delphi中安装和使用SPComm组件来实现对串行通信的控制。
以下给出SPComm的主要属性、方法和事件。
1.属性
SPComm组件的属性如图3所示。
图3PComm组件的属性
CommName:
表示COM1、COM2等串口的名字。
BaudRate:
根据实际需要设定的波特率,在串口打开后也可以更改此值,实际波特率随之更改。
ParityChece:
表示是否需要奇偶校验。
ByteSize:
根据实际情况设定的字节长度。
Parity:
奇偶校验位。
StopBits:
停止位。
SendDataEmpty:
这是一个布尔类型属性,为True时表示发送缓冲存储为空,或者发送队列里没有信息;为False时表示发送缓冲存储不为空,或者发送队列里有信息。
2.方法
Startcomm方法用于打开串口,当打开失败时通常会报错。
错误只要有7种:
1)串口已经打开
2)打开串口错误
3)文件句柄不是通信句柄
4)不能够安装通信缓存
5)不能产生事件
6)不能产生读进程
7)不能产生写进程
StopComm方法用于关闭串口,没有返回值。
WriteCommData方法是个带有布尔类型返回值的函数,用于将一个字符串发送到写进程,发送成功返回True,发送失败返回False。
执行此函数将立即得到返回值,发送操作随后执行。
该函数有两个参数,其中pDataToWrite参数是要发送的字符串,dwSizeofDataToWrite参数是发送字符串的长度。
3.事件
OnReceiveData:
当有数据输入缓存时将触发该事件。
在这里可以对从串口接收的数据进行处理。
其中Buffer参数中是接收到的数据,BufferLength参数是接收到的长度。
OnReceiveError:
当接收数据出错时将触发该事件。
软件主要方法的程序流程图及描述如下:
1.单击“打开串口”(“关闭串口”)按钮触发的方法程序流程图如图4所示:
通信参数编辑框中的值赋给SPComm组件相应属性,并打开串口,此时通信指示灯变为红色;若flag为奇数,则关闭串口,此时通信指示灯变为黑色。
每单击一次该按钮,flag均做加1运算。
2.显示数据程序流程图如图5所示:
图5流程图II
显示数据程序流程描述:
程序开始时先检查“十六进制显示”复选框是否被勾选。
若未被勾选,则调用显示Memo组件的Lines.Add()方法,将数据接收缓冲区中的字符串显示在“接收区”窗口;
否则调用Ord()函数及inttostr()函数,将接收到的数据转换为相应ASCII后在显示到“接收区”窗口。
3.单击“发送”按钮触发的方法程序
本程序的流程图如图6所示。
本程序流程描述:
程序开始时先检查“十六进制发送”复选框是否被勾选。
若未被勾选,则调用SPComm组件的WriteCommData()方法向另一台计算机传送数据;
反之,则先将“发送区”中符合十六进制的字符(0~9、a~z、A~Z)保存到字符串变量SendData_Hex,然后通过调用copy()函数、strtoint函数和char()函数将字符串SendData_Hex中的字符两个为一组,依次转换为两位十六进制数,再将该两位十六进制数转换为对应的字符存储到字符数组buf中。
若SendData_Hex中字符数为奇数,则最后一个字符转换为十六进制数是前面一位补零。
转换完毕后调用SPComm的WriteCommData()方法向另一台计算机传送数据。
图6流程图III
图6流程图III
另外,工程文件中的清空“接收区”和清空“发送区”两个过程,均调用了Memo组件的Lines.Clear方法来实现清空功能,而关闭程序过程则调用Close方法来实现关闭程序。
软件运行界面如下:
1.端口关闭与打开界面
图7端口关闭状态图8端口打开状态
2.非十六进制发送与显示界面
图9非十六进制发送图10非十六进制显示
3.十六进制发送与非十六进制显示界面
图11十六进制发送图12非十六进制显示
4.十六进制发送与显示界面
图13十六进制发送图14十六进制显示
5.打开TXT文件和保存TXT文件
图15打开TXT文件发送图16保存接收数据到TXT
五、源程序代码
unitDelphi_Com;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,ExtCtrls,SPComm,ComCtrls,jpeg,Buttons;
type
TDel_Com=class(TForm)
Panel1:
TPanel;
GroupBox1:
TGroupBox;
Label1:
TLabel;
Label2:
TLabel;
Label3:
TLabel;
Label4:
TLabel;
Label5:
TLabel;
Label10:
TLabel;
Label6:
TLabel;
Label7:
TLabel;
Label8:
TLabel;
Label9:
TLabel;
Port:
TComboBox;
BaudRate:
TComboBox;
ParityBit:
TComboBox;
DataBit:
TComboBox;
StopBit:
TComboBox;
Open_OK:
TButton;
StatusBar:
TStatusBar;
Comm:
TComm;
Deng:
TShape;
BitBtn1:
TBitBtn;
OpenDialog1:
TOpenDialog;
Panel2:
TPanel;
ReceiveData:
TMemo;
Clear_Receive:
TButton;
Label12:
TLabel;
HexReceive_Check:
TCheckBox;
Panel3:
TPanel;
SendData:
TMemo;
Label11:
TLabel;
SendBotton:
TButton;
Clear_Send:
TButton;
HexSendCheck:
TCheckBox;
Savefile:
TBitBtn;
Sendfile:
TBitBtn;
Label13:
TLabel;
Label14:
TLabel;
Label15:
TLabel;
Label16:
TLabel;
Label18:
TLabel;
Label19:
TLabel;
Label20:
TLabel;
SaveDialog1:
TSaveDialog;
Label17:
TLabel;
Label21:
TLabel;
procedureButton2Click(Sender:
TObject);
procedureOpen_OKClick(Sender:
TObject);
procedureClear_ReceiveClick(Sender:
TObject);
procedureClear_SendClick(Sender:
TObject);
procedureSendBottonClick(Sender:
TObject);
procedureCommReceiveData(Sender:
TObject;Buffer:
Pointer;
BufferLength:
Word);
procedureSendfileClick(Sender:
TObject);
procedureSavefileClick(Sender:
TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;
var
Del_Com:
TDel_Com;
flag:
Shortint=0;//用来指示打开或者关闭串口
implementation
{$R*.dfm}
procedureTDel_Com.Button2Click(Sender:
TObject);
begin
close;
end;
procedureTDel_Com.Open_OKClick(Sender:
TObject);
begin
if(flagmod2=0)thenbegin//打开串口
Comm.BaudRate:
=strtoint(BaudRate.Items[BaudRate.ItemIndex]);//波特率设置
CaseDataBit.ItemIndexof//数据位设置
0:
Comm.ByteSize:
=_5;
1:
Comm.ByteSize:
=_6;
2:
Comm.ByteSize:
=_7;
3:
Comm.ByteSize:
=_8;
End;
Comm.CommName:
=Port.Text;//端口设置
CaseParityBit.ItemIndexof//奇偶校验位设置
0:
Comm.Parity:
=None;
1:
Comm.Parity:
=Odd;
2:
Comm.Parity:
=Even;
3:
Comm.Parity:
=Space;
4:
Comm.Parity:
=Mark;
End;
CaseStopBit.ItemIndexof//停止位设置
0:
Comm.StopBits:
=_1;
1:
Comm.StopBits:
=_1_5;
2:
Comm.StopBits:
=_2;
End;
Comm.StartComm;
flag:
=flag+1;
SendBotton.Enabled:
=True;
Deng.Brush.Color:
=ClRed;
Port.Enabled:
=False;
BaudRate.Enabled:
=False;
ParityBit.Enabled:
=False;
DataBit.Enabled:
=False;
StopBit.Enabled:
=False;
StatusBar.Panels[0].Text:
='端口状态--使用端口:
'+Port.Text+''+'波特率:
'+BaudRate.Text+''+'校验位:
'+ParityBit.Text+''+'数据位:
'+DataBit.Text+''+'停止位:
'+StopBit.Text;
Open_OK.Caption:
='关闭串口';
end
elsebegin//关闭串口
Comm.StopComm;
flag:
=flag+1;
SendBotton.Enabled:
=False;
Deng.Brush.Color:
=clBtnText;
Port.Enabled:
=True;
BaudRate.Enabled:
=True;
ParityBit.Enabled:
=True;
DataBit.Enabled:
=True;
StopBit.Enabled:
=True;
StatusBar.Panels[0].Text:
='端口状态--端口未启用';
Open_OK.Caption:
='打开串口';
end;
end;
procedureTDel_Com.Clear_ReceiveClick(Sender:
TObject);//清空数据接受区
begin
ReceiveData.Lines.Clear;
end;
procedureTDel_Com.Clear_SendClick(Sender:
TObject);//清空数据发送区
begin
SendData.Lines.Clear;
end;
procedureTDel_Com.SendBottonClick(Sender:
TObject);//发送数据
var
p:
pchar;//指向数据发送区的指针
x:
integer;//保存发送区数据长度
i:
integer;
buf:
Array[0..50000]ofchar;
SendData_Hex:
string;
begin
p:
=Pchar(SendData.Lines.Text);//指向数据发送区的指针
x:
=Length(SendData.Lines.Text);//保存发送区数据长度
if(NotHexSendCheck.Checked)then//未选择以十六进制发送
begin
Comm.WriteCommData(p,x);
End
elsebegin//选择以十六进制发送
SendData_Hex:
='';
fori:
=1toxdo//将符合十六进制的字符存入字符串SendData_Hex中
begin
if((p+i-1)^in['0'..'9','A'..'F','a'..'f'])then//判断是否为'0'~'9'、'a'~'z'、'A'~'Z'的字符
SendData_Hex:
=SendData_Hex+copy(SendData.Text,i,1);
end;
x:
=Length(SendData_Hex);//修改长度
if(((xmod2)=0)and(x<>2))then//判断发送区数据长度是否为偶数
begin
fori:
=0to((xdiv2)-1)dobuf[i]:
=char(strtoint('$'+copy(SendData_Hex,i*2+1,2)));//将发送区数据(字符型)转化为对应的十六进制数码
x:
=(xdiv2);//修改发送数据长度
end
else//发送区数据长度为奇数,最后一位前面补零后发送
begin
fori:
=0to((xdiv2)-1)dobuf[i]:
=char(strtoint('$'+copy(SendData_Hex,i*2+1,2)));
//将发送区数据(字符型)转化为对应的十六进制数码
buf[i]:
=char(strtoint('$'+'3'+copy(SendData_Hex,i*2+1,1)));
//i最后一位补零
x:
=(xdiv2)+1;//修改发送数据长度
end;
Comm.WriteCommData(buf,x);
end;
end;
procedureTDel_Com.CommReceiveData(Sender:
TObject;Buffer:
Pointer;BufferLength:
Word);
//在接受区显示接收的数据
var
pStr:
PChar;//指向数据接收缓冲区的指针
buf:
string;//存放转换为十六进制数字符串
i:
integer;//循环控制变量
j:
integer;
begin
buf:
='';
pStr:
=Buffer;
if(notHexReceive_check.Checked)then
ReceiveData.Lines.Add(pStr)
Else
begin
fori:
=0toBufferlength-1do
begin
j:
=ord((pStr+i)^);
buf:
=buf+InttoHex(j,2);//接收缓冲区的数据转化为相应的ASCII
end;
ReceiveData.Lines.Add(buf);//显示转换后的ASCII字符串
end;
end;
procedureTDel_Com.SendfileClick(Sender:
TObject);
begin
ifopendialog1.execute()then
SendData.Lines.LoadFromFile(opendialog1.filename);
end;
procedureTDel_Com.SavefileClick(Sender:
TObject);
begin
ifsavedialog1.Executethen
ReceiveData.Lines.SaveToFile(savedialog1.FileName)
end;
end.
六、课程设计收获、体会
本课程设计是自动化专业学习《微机原理及汇编语言程序设计》课程的一个关键实践环节,不但要求有较高的理论水平,而且还要求有实际动手解决问题的能力。
经过本次课程设计,我深感自己获益匪浅,具体表现在以下几个方面:
通过完整地设计具有一定功能的微机系统,我进一步巩固了在课堂上所学的微机组成和工作原理的理论知识——特别是串行通信部分的内容;
通过实地操作与使用硬件设备,让我对抽象的理论知识有了感性的认识,并提升了自己学以致用和解决实际问题的综合素质;
通过查阅资料,如到图书馆借阅和在网上查找相关书籍、文章等方式,我得以初步掌握Delphi语言的基本知识,并熟悉了Delphi程序设计的基本编程和调试方法,这不仅培养自己微机应用系统设计方面的硬件架构与软件调试的基本技能,而且也加强了我的自学能力和信息搜集能力。
通过和队友们一起分析问题,解决问题,我还获得了有关项目管理和团队合作等等众多方面的具体经验,懂得了如何去进行分工协作,以及培养了自己的团队合作精神。
本次课程设计为我们将来的毕业设计打下了比较好的基础,让自己体会的毕业设计的大概经历过程,并且明白了自己的不足之处,提前查漏补缺,避免相同的错误及不足在毕业设计中再次出现。
虽然此次课程设计已经接近尾声,但是这个设计成果“从无到有”的过程让我学到的东西确是受用终生的。
它不仅让我及时认识到了课堂上学到的东西是如此的不够,理论能联系实际才是最重要的,做学问,我们决不能养成眼高手低的坏毛病;而且还帮助我明确了自己在以后的学习生涯中努力的方向——继续夯实科学理论知识基础,及时自主地吸收最新的精神食粮,并注重培养自己的动手能力和创新能力,加强同他人甚至一个大型项目团队协同工作能力,将自己打造为一个研究、设计和应用开发的“复合型”人才。
最后,感谢老师在这两周时间里对我们孜孜不倦的教诲。
七、参考文献
(1)黄军等.《Delphi串口通信编程》,北京:
人民邮电出版社,2001.8
(2)范逸之,陈立元等.《Delphi与RS-232串行通信控制》,北京:
清华大学出版社,2002.6
(3)周荷琴,吴秀清.《微型计算机原理与接口技术》,合肥:
中国科学技术大学出版社,2004.12
(4)张景安.《Delphi程序设计及实验指导(第二版)》,北京:
水利水电出版社,2008.6
(5)谭浩强.《Delphi程序设计》,北京:
中国铁道出版社,2006.2
(6)张增强,蒋志光.《Delphi7编程实例与技巧集粹》,北京:
中国希望电子出版社,2003.1
忽略此处..