C++课程设计说明书格式.docx

上传人:b****2 文档编号:2373884 上传时间:2023-05-03 格式:DOCX 页数:22 大小:147.15KB
下载 相关 举报
C++课程设计说明书格式.docx_第1页
第1页 / 共22页
C++课程设计说明书格式.docx_第2页
第2页 / 共22页
C++课程设计说明书格式.docx_第3页
第3页 / 共22页
C++课程设计说明书格式.docx_第4页
第4页 / 共22页
C++课程设计说明书格式.docx_第5页
第5页 / 共22页
C++课程设计说明书格式.docx_第6页
第6页 / 共22页
C++课程设计说明书格式.docx_第7页
第7页 / 共22页
C++课程设计说明书格式.docx_第8页
第8页 / 共22页
C++课程设计说明书格式.docx_第9页
第9页 / 共22页
C++课程设计说明书格式.docx_第10页
第10页 / 共22页
C++课程设计说明书格式.docx_第11页
第11页 / 共22页
C++课程设计说明书格式.docx_第12页
第12页 / 共22页
C++课程设计说明书格式.docx_第13页
第13页 / 共22页
C++课程设计说明书格式.docx_第14页
第14页 / 共22页
C++课程设计说明书格式.docx_第15页
第15页 / 共22页
C++课程设计说明书格式.docx_第16页
第16页 / 共22页
C++课程设计说明书格式.docx_第17页
第17页 / 共22页
C++课程设计说明书格式.docx_第18页
第18页 / 共22页
C++课程设计说明书格式.docx_第19页
第19页 / 共22页
C++课程设计说明书格式.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C++课程设计说明书格式.docx

《C++课程设计说明书格式.docx》由会员分享,可在线阅读,更多相关《C++课程设计说明书格式.docx(22页珍藏版)》请在冰点文库上搜索。

C++课程设计说明书格式.docx

C++课程设计说明书格式

 

课程设计说明书

课程名称:

高级语言在测控中的应用课程设计

课程代码:

8426580

题目:

基于串口通信的

高级语言控制程序的设计

学生姓名:

乔林

学号:

312008080307101

年级/专业/班:

08级机械电子工程1班

学院(直属系):

机械工程与自动化

指导教师:

刘建新

 

目录

1引言1

1.1问题的提出1

1.2国内外研究的现状1

1.3任务与分析2

1.3.1主要任务2

1.3.2分析2

2程序的主要功能2

2.1发送数据功能2

2.2接收数据功能2

2.3清空数据功能2

2.4十六进制发送和接收字符功能2

2.5端口、通讯波特率等设置功能3

3程序运行平台3

4总体界面设计3

5程序类的说明3

6模块分析5

6.1发送模块5

6.2清空模块6

6.3十六进制发送模块6

6.4十六进制接收模块8

6.5端口、通讯波特率等设置模块8

7系统测试11

8结论15

参考文献15

摘要

计算机串口编程在通信软件中有着十分广泛的应用,如电话,传真,视频控制等。

一般情况下,涉及到远程通信,自动控制的行业,通常也会涉及到串口通信技术。

在工业控制领域其也有广泛的用途。

程序员分析了串口通信程序编写的主要结构,本程序即利用c++程序设计语言在visualc++编译器下编程,从而实现了串口通信控制的需求。

该串口通信控制系统具有良好用户界面,可以发送数据、接收数据、清空数据、十六进制发送和接收字符、端口、通讯波特率等可设置的功能。

从而解决Windows应用程序与外围数据源设备通信的问题。

关键词:

串口通信;计算机

1引言

1.1问题的提出

串行通信(SerialCommunication)在现代工业控制系统中一直有着及其重要的地位,作为一种基本而又灵活方便的通信方式,它被广泛应用于PC与PC或者PC与PLC之间的数据交换以及其他工业控制与自动控制中,它不仅没有因为时代的进步而遭淘汰,反而在规格上越来越完善,应用也越来越广泛。

VC++是新一代面向对象的可视化开发工具,提供了良好的界面设计能力,在PC机的串口通信方面有很强的功能。

对于从事机械行业的人来说,熟悉基于RS232串口通信的高级语言编程方法显得十分重要。

1.2国内外研究的现状

目前,计算机的串行通信应用十分广泛,串行接口已成为计算机的必需部件和接口之一。

由于其具有连接简单、使用灵活方便、数据传递可靠等优点,在工业监控、数据采集和实时控制系统中得到了广泛应用。

当今,实现串口通信的方法以及第三方控件有很多,例如PComm控件,WindowsAPI函数等等。

但是这几种方法都过于复杂,对程序员要求较高,而且可靠性并不是很好。

利用Microsoft推出的MSComm控件,使得串口通信的实现更为简单、可靠。

随着当今信息技术的快速发展,通信已成为信息技术中的关键问题。

尤其在控制领域,以何种方式实现计算机与外围设备间既简单又可靠的通信,就显得特别重要。

由于串行通信具有实现简单、使用灵活方便、数据传输可靠等优点,因而广泛应用于工业控制系统中,是计算机与外部设备进行数据通信时经常使用的方式之一。

VC++是新一代面向对象的可视化开发工具,提供了良好的界面设计能力,在PC机的串口通信方面有很强的功能。

它具有功能强大、简便易用和代码执行速度快等特点,在通信软件的开发中成为越来越多开发人员的首选工具。

无论在工业控制中PC机和单片机之间的通信,还是在2台Pc机之间的串口通信,都具有相同的原理。

只要掌握其中的通信本质,就能灵活地实现串口通信,串口控制。

1.3任务与分析

1.3.1主要任务

★制定串口通信控制程序的总体构架;

★熟悉VC平台下的高级语言编程方法;

★熟悉基于RS232串口通信的高级语言编程方法;

★在同一台PC机上调试通过所编写的程序;

★编写设计说明书1份(不少于10页)。

1.3.2分析

目前Win32中基于VC++6.0的常用串口通信程序一般可以用两种方法实现:

①利用MSCommActiveX串行通信控件;②使用Win2dowsAPI通信函数。

虽然在Windows下Win32API提供了使用文件操作方式的函数进行串口操作的方法,但是在编程实现上还是比较复杂。

Windows平台先进的ActiveX技术使得对串口编程不再需要处理烦琐的细节。

利用已有的AxtiveX控件,只需要编写少量的代码,就可以轻松高效地完成任务。

因此程序员不需要花时间去了解复杂的API函数,只需要利用MSComm控件就可实现串口编程。

2程序的主要功能

2.1发送数据功能

读出发送编辑框的内容,将其送入MSComm的发送缓冲区。

2.2接收数据功能

在MSComm的接收缓冲区有字符时,将其在接收编辑框内显示出来

2.3清空数据功能

清除并更新发送编辑框和接收编辑框中的内容。

2.4十六进制发送和接收字符功能

将发送编辑框内的字符转化为十六进制并进行发送;将接收编辑框内字符以十六进制显示出来。

2.5端口、通讯波特率等设置功能

可对数据传输的端口、波特率、校检位、数据位、停止位进行设置更改。

3程序运行平台

Visaulc++6.0

具体操作如下:

进入vc++新建一个基于对话框的MFC应用程序SCommTest,添加MSComm控件,编辑程序界面,初始化程序,添加实现各个功能的源代码,再编译,链接,执行程序,调试出所有功能。

4总体界面设计

图4.1系统总体界面

5程序类的说明

5.1初始化串口设置

BOOLCQlDlg:

:

OnInitDialog()

{

CDialog:

:

OnInitDialog();

//Add"About..."menuitemtosystemmenu.

//IDM_ABOUTBOXmustbeinthesystemcommandrange.

ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX<0xF000);

CMenu*pSysMenu=GetSystemMenu(FALSE);

if(pSysMenu!

=NULL)

{

CStringstrAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if(!

strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);

}

}

//Settheiconforthisdialog.Theframeworkdoesthisautomatically

//whentheapplication'smainwindowisnotadialog

SetIcon(m_hIcon,TRUE);//Setbigicon

SetIcon(m_hIcon,FALSE);//Setsmallicon

//TODO:

Addextrainitializationhere

////对组合框的显示情况进行初始化

m_ctrlPort.SetWindowText(_T("COM1"));

m_ctrlBaud.SetWindowText(_T("9600"));

m_ctrlParity.SetWindowText(_T("无NONE"));

m_ctrlDataBits.SetWindowText(_T("8"));

m_ctrlStopBits.SetWindowText(_T("1"));

m_ctrlComm.SetCommPort

(1);//默认选择COM1

m_ctrlComm.SetPortOpen(TRUE);//串口打开

m_ctrlComm.SetSettings("9600,n,8,1");//默认波特率9600,无校验,8个数据位,1个停止位

voidCQlDlg:

:

OnSelchangeComboPort();//串口选择

voidCQlDlg:

:

OnSelchangeComboBaud();//波特率选择

voidCQlDlg:

:

OnSelchangeComboParity();//校检位选择

voidCQlDlg:

:

OnSelchangeComboDatabits();//数据位选择

voidCQlDlg:

:

OnSelchangeComboStopbits();//停止位选择

m_ctrlComm.SetInputMode

(1);//以二进制方式检取数据

m_ctrlComm.SetRThreshold

(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

m_ctrlComm.SetInputLen(0);//设置当前接收区数据长度为0

m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

}

5.2声明的所有控件

voidCQlDlg:

:

DoDataExchange(CDataExchange*pDX)

{

CDialog:

:

DoDataExchange(pDX);

//{{AFX_DATA_MAP(CSCommTestDlg)

DDX_Control(pDX,IDC_COMBO_STOPBITS,m_ctrlStopBits);

DDX_Control(pDX,IDC_COMBO_PORT,m_ctrlPort);

DDX_Control(pDX,IDC_COMBO_PARITY,m_ctrlParity);

DDX_Control(pDX,IDC_COMBO_DATABITS,m_ctrlDataBits);

DDX_Control(pDX,IDC_COMBO_BAUD,m_ctrlBaud);

DDX_Control(pDX,IDC_CHECK_HEXDISPLAY,m_ctrlHexDisplay);

DDX_Control(pDX,IDC_CHECK_HEXSEND,m_ctrlHexSend);

DDX_Control(pDX,IDC_MSCOMM1,m_ctrlComm);

DDX_Text(pDX,IDC_EDIT_RXDATA,m_strRXData);

DDX_Text(pDX,IDC_EDIT_TXDATA,m_strTXData);

//}}AFX_DATA_MAP

}

5.3声明的所有控件映射的函数

BEGIN_MESSAGE_MAP(CSCommTestDlg,CDialog)

//{{AFX_MSG_MAP(CSCommTestDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON_MANUALSEND,OnButtonManualsend)

ON_BN_CLICKED(IDC_BUTTON_MANUALCLEAR,OnButtonManualclear)

ON_CBN_SELCHANGE(IDC_COMBO_PORT,OnSelchangeComboPort)

ON_CBN_SELCHANGE(IDC_COMBO_BAUD,OnSelchangeComboBaud)

ON_CBN_SELCHANGE(IDC_COMBO_PARITY,OnSelchangeComboParity)

ON_CBN_SELCHANGE(IDC_COMBO_DATABITS,OnSelchangeComboDatabits)

ON_CBN_SELCHANGE(IDC_COMBO_STOPBITS,OnSelchangeComboStopbits)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

6模块分析

6.1发送模块

设计思想

读出发送编辑框的内容,将其送入MSComm的发送缓冲区。

关键代码

voidCQlDlg:

:

OnSend()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

UpdateData(TRUE);//读取编辑框内容

if(m_ctrlHexSend.GetCheck())

{

CByteArrayhexdata;

intlen=String2Hex(m_strTXData,hexdata);//此处返回的len可以用于计算发送了多少个十六进制数

m_ctrlComm.SetOutput(COleVariant(hexdata));//发送十六进制数据

}

else

m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据

}

6.2清空模块

设计思想

清除并更新发送编辑框和接收编辑框中的内容。

关键代码

voidCQlDlg:

:

OnClear()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_strRXData="";

m_strTXData="";

UpdateData(FALSE);

}

……

6.3十六进制发送模块

设计思想

将发送编辑框内的字符转化为十六进制并进行发送。

关键代码

//由于转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔

intCQlDlg:

:

String2Hex(CStringstr,CByteArray&senddata)

{

inthexdata,lowhexdata;

inthexdatalen=0;

intlen=str.GetLength();

senddata.SetSize(len/2);

for(inti=0;i

{

charlstr,hstr=str[i];

if(hstr=='')

{

i++;

continue;

}

i++;

if(i>=len)

break;

lstr=str[i];

hexdata=ConvertHexChar(hstr);

lowhexdata=ConvertHexChar(lstr);

if((hexdata==16)||(lowhexdata==16))

break;

else

hexdata=hexdata*16+lowhexdata;

i++;

senddata[hexdatalen]=(char)hexdata;

hexdatalen++;

}

senddata.SetSize(hexdatalen);

returnhexdatalen;

}

//这是一个将字符转换为相应的十六进制值的函数,功能:

若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1

charCQlDlg:

:

ConvertHexChar(charch)

{

if((ch>='0')&&(ch<='9'))

returnch-0x30;

elseif((ch>='A')&&(ch<='F'))

returnch-'A'+10;

elseif((ch>='a')&&(ch<='f'))

returnch-'a'+10;

elsereturn(-1);

}

6.4十六进制接收模块

设计思想

将接收编辑框内字符以十六进制显示出来。

关键代码

voidCQlDlg:

:

OnOnCommMscomm1()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

VARIANTvariant_inp;

COleSafeArraysafearray_inp;

LONGlen,k;

BYTErxdata[2048];//设置BYTE数组An8-bitintegerthatisnotsigned.

CStringstrtemp;

if(m_ctrlComm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有字符

{

variant_inp=m_ctrlComm.GetInput();//读缓冲区

safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量

len=safearray_inp.GetOneDimSize();//得到有效数据长度

for(k=0;k

safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组

for(k=0;k

{

BYTEbt=*(char*)(rxdata+k);//字符型

if(m_ctrlHexDisplay.GetCheck())

strtemp.Format("%02X",bt);//将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔

else

strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放

m_strRXData+=strtemp;//加入接收编辑框对应字符串

}

}

UpdateData(FALSE);//更新编辑框内容

}

6.5端口、通讯波特率等设置模块

设计思想

可对数据传输的端口、波特率、校检位、数据位、停止位进行设置更改。

关键代码

//端口设置

voidCQlDlg:

:

OnSelchangeComboPort()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

if(m_ctrlComm.GetPortOpen())

m_ctrlComm.SetPortOpen(FALSE);//关闭串口

switch(m_ctrlPort.GetCurSel())

{

case0:

m_ctrlComm.SetCommPort

(1);

break;

case1:

m_ctrlComm.SetCommPort

(2);

break;

case2:

m_ctrlComm.SetCommPort(3);

break;

case3:

m_ctrlComm.SetCommPort(4);

break;

default:

;break;

}

if(!

m_ctrlComm.GetPortOpen())

m_ctrlComm.SetPortOpen(TRUE);

else

AfxMessageBox("cannotopenserialport");

}

//波特率设置

voidCQlDlg:

:

OnSelchangeComboBaud()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

switch(m_ctrlBaud.GetCurSel())

{

case0:

m_ctrlComm.SetSettings("2400,,,");

break;

case1:

m_ctrlComm.SetSettings("4800,,,");

break;

case2:

m_ctrlComm.SetSettings("9600,,,");

break;

case3:

m_ctrlComm.SetSettings("19200,,,");

break;

case4:

m_ctrlComm.SetSettings("38400,,,");

break;

default:

;break;

}

}

//校检位设置

voidCQlDlg:

:

OnSelchangeComboParity()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

switch(m_ctrlParity.GetCurSel())

{

case0:

m_ctrlComm.SetSettings(",n,,");

break;

case1:

m_ctrlComm.SetSettings(",o,,");

break;

case2:

m_ctrlComm.SetSettings(",e,,");

break;

default:

;break;

}

}

//数据位设置

voidCQlDlg:

:

OnSelchangeComboDatabits()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

switch(m_ctrlDataBits.GetCurSel())

{

case0:

m_ctrlComm.SetSettings(",,8,");

break;

case1:

m_ctrlComm.SetSettings(",,7,");

break;

case2:

m_ctrlComm.SetSettings(",,6,");

break;

default:

;break;

}

}

//停止位设置

voidCQlDlg:

:

OnSelchangeComboStopbits()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

switch(m_ctrlStopBits.GetCurSel())

{

case0:

m_ctrlComm.SetSettings(",,,1");

break;

case1:

m_ctrlComm.SetSettings(",,,2");

break;

default:

;break;

}

}

7系统测试

首先运行软件VSPM添加串口对:

然后打开串口调试助手

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2