您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > DELPHI串口助手
目录第一章课程设计要求……………………………………………………………1第二章系统的组成及原理………………………………………………………22.1系统的组成…………………………………………………………………22.2系统设计的原理……………………………………………………………2第三章串口调试助手的设计……………………………………………………33.1串口调试助手的概要设计…………………………………………………33.2串口调试助手的详细设计…………………………………………………33.2.1窗体设计………………………………………………………………33.2.2打开端口部分设计……………………………………………………43.2.3接收数据部分的设计…………………………………………………53.2.4发送数据部分的设计…………………………………………………11第四章调试及测试结果与分析…………………………………………………15第五章结论………………………………………………………………………16参考文献…………………………………………………………………………17附录A:程序清单及注释…………………………………………………………18第一章课程设计要求利用Delphi或C++作为开发工具,根据SPCOM或MSCOMM控件、PCOMM.DLL等,设计出一串口调试助手,要求在不同计算机之间实现串口间数据通信,并以此为基础,实现对不同数据格式间的转换功能。要求:1、串口通信。2、数据格式。3、系统软件(Delphi7.0)。第二章系统的组成及原理2.1系统的组成串口调试助手经常用于对串口的调试和检查,也可传送一些简单的数据。本软件主要包括:1、接收部分接收时能够分别以十六进制、二进制、十进制等格式接收数据,并能以*.Txt或*.Doc保存接收的数据。2、发送部分发送部分分为手动发送和自动发送,并且都能以ASCII码和文本格式发送。2.2系统设计的原理MicrosoftCommunicationControl(简称MSCOMM控件)是微软公司为VisualBasic提供的一个串口控件,在VisvalC++、VisvalBasic、Delphi等开发环境中均可使用。它通过串行端口传送和接收数据,为应用程序提供基本的串口通信功能,使得程序员不必花费大量的时间去了解较为复杂的API函数,因此被广泛使用。所以本软件可以利用Delphi7.0根据MSCOMM控件设计。利用MSCOMM控件可以简化很多较繁琐的程序。它提供了两种处理通信问题的方法:一是事件驱动方法,一是查询法。用于串口调试助手的功能比较简单,不需要太复杂的处理方式,所以使用查询法就足够了。查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。通信MSCOMM控件提供了27个关于通信控制方面的属性和5个标准属性。其中主要的和本次使用的属性如下:CommPort设置并返回通信端口号;Settings以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位;PortOpen设置并返回通信端口的状态,也可以打开和关闭端口;Input从接收缓冲区返回和删除字符;Output向传送缓冲区写一个字符。第三章串口调试助手的设计3.1串口调试助手的概要设计串口调试助手的系统层次结构图如图3-1所示。3.2串口调试助手的详细设计3.2.1窗体设计由于串口调试助手的功能比较简单,所以只需一个窗体就足够了,其窗体如图3-2所示。3.2.2打开端口部分设计1.打开端口部分设计流程图如图3-3所示2.端口初始化就是对波特率、校验、数据位和停止位的设置,端口的设置参数赋给ComSetting函数,然后赋给MSComm1.Setting即可。当端口打开时指示灯为绿色,当端口为打开时指示灯为红色。代码如下:procedureTForm1.Button1Click(Sender:TObject);beginifnotMSComm1.PortOpenthenbegin//打开串口MSComm1.CommPort:=CmbComPort.ItemIndex+1;ComSetting:=ComboBox1.Text;ComSetting:=ComSetting+','+ComboBox2.Text;ComSetting:=ComSetting+','+ComboBox3.Text;ComSetting:=ComSetting+','+ComboBox4.Text;MSComm1.Settings:=ComSetting;tryMSComm1.PortOpen:=True;exceptshowmessage('该COM错误!');application.Terminate;//关闭程序end;Panel1.Enabled:=false;ShowComSetting;//变换各个组件的状态ShpSerialPort.Brush.Color:=clLime;//指示灯变绿Button1.Caption:='关闭串口';endelsebegin//关闭串口//变换各个组件的状态MSComm1.PortOpen:=False;ShpSerialPort.Brush.Color:=clRed;//指示灯变红Panel1.Enabled:=True;Button1.Caption:='打开串口';end;end;3.2.3接收数据部分的设计1.接收数据部分的设计流程图如图3-4所示。2.当接收数据后对数据进行变换时,要先判断接收的数据是否符合变换的条件,例如当以十进制显示时,接收的数据不是十六进制数就会报错。判断数据是否是十六进制的代码如下:functionPanDuan16(Str:string):boolean;varmLen,i:Integer;beginmLen:=Length(Str);fori:=mLendownto1dobeginifStr[i]in['0'..'9','a'..'f','A'..'F']thenbeginContinue;Result:=true;endelseResult:=false;break;end;end;判断数据是否是十进制的代码如下:functionPanDuan(Str:string):boolean;varmLen,i:Integer;beginmLen:=Length(Str);fori:=mLendownto1dobeginifStr[i]in['0','1','2','3','4','5','6','7','8','9']thenbeginContinue;Result:=true;endelseResult:=false;break;end;end;procedureTForm1.MSComm1Comm(Sender:TObject);varInputLen:Integer;tmpvar:Variant;a:string;beginInputLen:=0;ifMSComm1.CommEvent=2then//接收数据时beginInputLen:=MSComm1.InBufferCount;//返回输入缓冲区内等待读取的字节数//接收二进制数据,转换为ASCII码显示ifASCIIRecv.Checked=truethen//ASCII码begintmpvar:=MSComm1.Input;//读取接收缓冲区中的数据InputStr:='';inputstr:=inputstr+StrToASCIIStr(tmpvar)+#72+#32;endelseifzifu.Checked=truethen//ASCII码字符begintmpvar:=MSComm1.Input;//读取接收缓冲区中的数据ifPanDuan16(tmpvar)thenbeginInputStr:='';InputStr:=InputStr+chr(strtoint('$'+tmpvar))+#32;endelsebeginshowmessage('输入数据有错!');InputStr:='';end;endelseifHRecv.Checked=truethen//十六进制begintmpvar:=MSComm1.Input;//读取接收缓冲区中的数据ifPanDuan(tmpvar)thenbeginInputStr:='';a:=tmpvar;InputStr:=InputStr+inttohex(strtoint(a),2)+#72+#32;endelsebeginshowmessage('请输入0~9之间的数');InputStr:='';end;endelseifBRecv.Checked=truethen//二进制begintmpvar:=MSComm1.Input;//读取接收缓冲区中的数据ifPanDuan16(tmpvar)thenbeginInputStr:='';a:=tmpvar;InputStr:=InputStr+dtoB(strtoint('$'+a))+#66+#32;endelsebeginshowmessage('输入数据有错!');InputStr:='';end;endelseifDRecv.Checked=truethen//十进制begintmpvar:=MSComm1.Input;//读取接收缓冲区中的数据ifPanDuan16(tmpvar)thenbeginInputStr:='';a:=tmpvar;InputStr:=InputStr+inttostr(strtoint('$'+a))+#32;endelsebeginshowmessage('输入数据有错!');InputStr:='';end;endelse//直接接收字符beginInputStr:='';InputStr:=MSComm1.Input;end;MemRecv.Text:=MemRecv.Text+InputStr;end;//加入数据显示模块RecvStr:=MemRecv.Text;RXNum:=RXNum+InputLen;ShowRX;end;3.2.4发送数据部分的设计1.发送数据部分的设计流程图如图3-5所示。2.发送数据之前必须保证串口打开,所以先判断端口有没有打开。由于发送空内容没有意义,所以还要保证发送内容不能为空。procedureTForm1.BtnSendClick(Sender:TObject);varLen:Integer;i,Count,MaxCount,tmpInt:Integer;tmpvar:Variant;tmpStr,Output:string;beginLen:=0;Count:=1;MaxCount:=1;ifnotMSComm1.PortOpenthenbeginShowMessage('没有打开串口!');Exit;endelsebeginoutput:=stringreplace(MemSend.Text,#13#10,'',[rfReplaceAll]);//去掉换行符Len:=Length(output);iflen=0thenShowMessage('没有输入数据!')elseifLen0thenbegin//发送二进制数,需要使用Variant变量矩阵,矩阵大小自动调节ifASCIISendthenbegini:=1;//创建一个Variant数组tmpvar:=VarArrayCreate([1,1],varByte);while(iLen)dobegin//转换为16进制tmpStr:=Copy(Output,i,2);tmpStr:=LowerCase(tmpStr);//将字符转换成小写tmpstr:=TrimAll(tmpstr);tmpInt:=HexToInt(tmpStr);iftmpInt=-1thenbeginShowM
本文标题:DELPHI串口助手
链接地址:https://www.777doc.com/doc-2909788 .html