串口通信程序设计.docx
- 文档编号:6630007
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:27
- 大小:1.22MB
串口通信程序设计.docx
《串口通信程序设计.docx》由会员分享,可在线阅读,更多相关《串口通信程序设计.docx(27页珍藏版)》请在冰点文库上搜索。
串口通信程序设计
2011级通信工程
《基于ARM9嵌入式Linux系统开发原理与实践》课程设计报告
设计题目:
基于Linux的网络通信程序设计
XX学号:
王强
邓祖坤
陶晓明
学院:
工程技术学院
专业:
通信工程
班级:
2011级3班
指导教师:
方飞
2014年6月30日
题目:
基于Linux的网络通信程序设计
一、设计题目及要求
1、设计题目
基于Linux的网络通信程序设计
2、设计要求
(1)基本要求
1)使用linux网络编程技术设计网络通信程序;
2)熟练使用编译工具GCC和调试工具GDB;
3)实现主机与开发板之间的通信;
指导教师签名:
2014年月日
二、指导教师评语
指导教师签名:
2014年月日
三、成绩
理论(60%):
分,作品(40%):
分,总分:
分。
验收盖章
2014年月日
摘要
Linux系统是一种自由的Unix类多用户、多任务的操作系统,可以运行在目前已知的PC机、ARMS、MIPS和PowerPC等多种计算机平台,已成为应用广泛、可靠性高、功能强大的计算机操作系统。
Linux具有内核小、效率高、源代码开放等优点,还内含了TCP/IP网络协议,很适合在服务器领域使用,而服务器主要用途之一就是进行网络通信。
随着计算机办公自动化处理技术的应用与推广、网络的不断普及,人们期待一种便捷、高效、环保、安全的网络通信方式。
本设计就是考虑到这一现状,基于Linux操作系统下的TCP/IP网络通信原理、多线程编程技术,使用linux编译工具GCC和调试工具GDB设计了一个网络通信程序,实现计算机与开发板之间的网络通信。
关键词:
Linux系统;编译工具GCC;调试工具GDB
1程序设计的基本原理与思路
本设计的基本原理是利用MFC应用程序以及MicrosoftmunicationsControl控件的基本知识而设计的。
MicrosoftmunicationsControl控件是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
1.1MFC简介
MFC是VisualC++是核心。
MFC类库将所有图形用户界面的元素如窗口、菜单、按钮等都以类的形式进行了封装,MFCAppWizard向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。
每个MFC类都包括了一些函数,函数放到类中,符合C++编程方法,这些函数必须通过类定义对象才能使用。
因为MFC是对API的封装,微软做了大量的工作,隐藏了好多程序开发人员在Windows下用C++&MFC编制软件时的大量内在环节,如应用程序实现消息的处理,设备环境绘图,这种结合是以方便开发者编程为目的。
因此就造成了MFC对类封装中的一定程度的的冗余和迂回,使开发者在开发过程中必定要付出一定代价,但这是可以接受的。
1.2MSm控件简介
MSm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VC++、Delphi等语言中均可使用。
MicrosoftmunicationsControl(以下简称MSm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:
一是事件驱动(Event-driven)方法,一是查询法。
1.2.1事件驱动方式
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者CarrierDetect(CD)或RequestToSend(RTS)线上一个字符到达或一个变化发生时。
在这些情况下,可以利用MSm控件的Onm事件捕获并处理这些通讯事件。
Onm事件还可以检查和处理通讯错误。
在编程过程中,就可以在Onm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSm控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSm控件。
1.2.2查询方式
查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查mEvent属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
1.3设计的基本思路
Windows应用程序要使用串口进行通信,必须在使用之前向Windows操作系统提出资源申请要求(打开串口),申请得到允许后要对串行端口相关参数进行配置(设置串口),配置好参数后进行数据传输(读写串口),通信完成后必须释放资源(关闭串口)。
程序模块图如图1.3.1所示。
退出程序
关闭串口
显示数据
发送数据
设置串口
打开串口
图1.3.1程序模块
知道了要做什么后,接下来就要部署该做些什么了:
首先要解决的问题是弄清楚MSm控件与命令消息的名称类型和功能;其次是通过分析串行端口通信的具体过程,在通信过程中应用程序需要做哪些事情,以便在应用程序中加入对这些过程支持的代码;在对应用程序的流程有了大致的轮廓以后,再开始考虑程序框架和应用程序外观的设计;最后,也是最关键的就是编写实现通信的代码将通信程序的基本功能实现,紧接着就是程序的调试和完善。
2程序设计与代码分析
2.1建立工程
打开VC++6.0,建立一个基于基本对话框的MFC应用程序SmTest的工程。
新建SmTest工程和SmTest工程初始界面如图2.1.1和图2.1.2所示。
图2.1.1新建SmTest工程
图2.1.2SmTest工程初始界面
2.2在工程中插入MSm控件
在菜单栏中选择Project菜单下AddToProject子菜单中的“ponentsandControl”选项,在弹出的对话框中双击RegisteredActiveXControls文件夹,则所有注册过的ActiveX控件出现在列表框中。
选择MicrosoftmunicationsControl,version6.0,单击Insert按钮将它插入到我们的Project中来。
这时在ClassView视窗中就可以看到CMSm类了,并且在控件工具栏Controls中出现了图标,用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
向工程添加MSm控件和向对话框添加MSm控件如图2.2.1和图2.2.2所示。
图2.2.1向工程添加MSm控件
图2.2.2向对话框添加MSm控件
2.3利用ClassWizard定义CMSm类控制对象
点击鼠标右键打开ClassWizard->MemberViariables选项卡,选择SerialPortTestDlg类,为IDC_MSM1添加控制变量:
m_ctrlm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES()#include"msm.h"//}}AFX_INCLUDES。
定义CMSm类控制对象如图2.3.1所示。
图2.3.1定义CMSm类控制对象
2.4向对话框中添加发送数据和接收数据的编辑框
向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。
然后将接收编辑框的Properties->Styles中把Miltiline和VerticalScroll属性选上,在发送编辑框若想输入多行文字,也可选上Miltiline。
添加发送和接收数据编辑框如图2.4.1所示。
图2.4.1添加发送和接收数据编辑框
再打开ClassWizard->MemberViariables选项卡,选择CSmTestDlg类,为IDC_EDIT_RXDATA添加CString变量m_strRXData,为IDC_EDIT_TXDATA添加CString变量m_strTXData。
说明:
m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。
定义两编辑框变量类型如图2.4.2所示。
图2.4.2定义两编辑框变量类型
2.5添加串口事件消息处理函数Onm()
打开ClassWizard选择MessageMaps,选择类CSmTestDlg,选择IDC_MSM1,双击消息Onm,将弹出的对话框中将函数名改为OnOnmMsm1。
这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnOnmMsm1()函数加入相应的处理代码就能实现自已想要的功能了。
添加串口事件消息处理函数如图2.5.1所示。
图2.5.1添加串口事件消息处理函数
相关代码如下:
voidCSmTestDlg:
:
OnOnmMsm1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
VARIANTvariant_inp;
COleSafeArraysafearray_inp;
LONGlen,k;
BYTErxdata[2048];//设置BYTE数组An8-bitintegerthatisnotsigned.
CStringstrtemp;
if(m_ctrlm.GetmEvent()==2)//事件值为2表示接收缓冲区内有字符
{
////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlm.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);//字符型 strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放 m_strRXData+=strtemp;//加入接收编辑框对应字符串 } } UpdateData(FALSE);//更新编辑框内容 } 2.6“开始”——打开串口和设置串口参数 可以在需要的时候打开串口,在程序中做一个“开始”按钮,在该按钮的处理函数中打开串口和设置串口参数。 在主对话框的CSmTestDlg: : OnButtonStart()打开串口。 添加“开始”按钮如图2.6.1所示。 图2.6.1添加“开始”按钮 添加“开始”按钮响应函数如图2.6.2所示。 图2.6.2添加“开始”按钮响应函数 加入如下代码: voidCSmTestDlg: : OnButtonStart() { //TODO: Addyourcontrolnotificationhandlercodehere if(m_ctrlm.GetPortOpen()) m_ctrlm.SetPortOpen(FALSE); m_ctrlm.SetmPort (1);//选择1 if(! m_ctrlm.GetPortOpen()) m_ctrlm.SetPortOpen(TRUE);//打开串口 else AfxMessageBox("cannotopenserialport"); m_ctrlm.SetSettings("9600,n,8,1");//波特率9600,无校验,8个数据位,1个停止位 m_ctrlm.SetInputMode (1);//以二进制方式检取数据 m_ctrlm.SetRThreshold (1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的Onm事件 m_ctrlm.SetInputLen(0);//设置当前接收区数据长度为0 m_ctrlm.GetInput();//先预读缓冲区以清除残留数据 } 2.7“发送”按钮——发送数据 先为“发送”按钮添加一个单击消息即DBN_CLICKE处理函数,打开ClassWizard->MessageMaps,选择类CSmTestDlg,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数。 添加“发送”按钮如图2.7.1所示。 图2.7.1添加“发送”按钮 添加“发送”按钮响应函数如图2.7.2所示。 图2.7.2添加“发送”按钮响应函数 在函数中添加如下代码: voidCSmTestDlg: : OnButtonManualsend() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(TRUE);//读取编辑框内容 m_ctrlm.SetOutput(COleVariant(m_strTXData));//发送数据 } 2.8相关控件的属性 利用ClassWizard为各控件设置系统变量类型。 控件的属性如表2.8.1所示。 表2.8.1控件的属性表 资源标识 类型 相关属性及功能说明 IDC_MSCoom1 CMSm m_ctrlmMSm控件 IDC_EDIT_TXDATA CString m_strTXDATA发送数据 IDC_EDIT_RXDATA CString m_strRXDATA接收数据 IDC_BUTTON_START “开始”按钮 IDC_BUTTON_MANUALSEND “发送”按钮 2.9相关响应函数的建立 利用ClassWizard为各控件添加系统消息响应函数,各控件的消息响应函数将实现程序的相应功能。 添加的各控件对应的消息响应函数如表2.9.1所示。 表2.9.1函数功能表 函数名称 对应控件 函数功能 OnButtonStart ON_IDC_BUTTON_START: BN_CLICKED 打开并设置串口 OnButtonManualsend ON_IDC_BUTTON_MANUALSEND: BN_CLICKED 发送数据 Onm ON_IDC_MSM1: Onm MSM控件 Onlnitdialog ON_WM_INITTDIALOG 功能区对话框 Onpaint ON_WM_PAINT OnQueryDragicon ON_WM_QUEYDRAGICON OnSysmand ON_WM_SYSMAND 系统命令 3总结 经过上一学期《VC++编程》和这一学期《通信网络程序设计》的学习,我们学到了很多,而且在这一段时间的实际动手学习中,我们对《VC++编程》和《通信网络程序设计》这两门课程又有了更深刻的认识,基本掌握了用MFC创建基于对话框的应用程序的方法,同时了解了MSm的相关知识。 编程虽是辛苦劳累的,但是收获同样是巨大的,在设计中每解决一个问题,那种成就感是无法言语的,设计中第一次调试程序时出现了逻辑错误,编译能通过,运行始终无法通过,后来经过自己思考,找同学咨询,借助参考书资料以及网络资源,找到了问题所在,进行了多次修改调试之后终于得到了运行结果,这让我们感觉到了学会收集资料也是很重要的,可以在这个过程中学到不少知识。 最后,通过这次设计,提高了我们的分析问题和软件调试能力;同时也大大提高了VC++6.0软件编程的能力;不但学会了如何去利用课本和参考资料,而且还提高了设计和制作过程中解决实践问题的能力,把在课堂所学的知识灵活运用,理论联系实际,为以后的学习和工作打下了扎实的基础。 参考文献 [1]甘玲.面向对象技术与VisualC++.: 清华大学,2004;. [2]李久进.MFC深入浅出..XX: 华中理工大学,1999; [3]X锐宁.VisualC++从入门到精通.: 清华大学,2010; [4]尹立民.VisualC++应用编程150例.: 电子工业,2003; [5]贾斌.网络编程与技巧实例.: 人民有电,2001; [6]黄维通.VisualC++面向对象与可视化程序设计.: 清华大学,2003; [7]王晓东.通信网络程序设计.XX: XX电子科技大学,2011 附录 程序代码如下: //SmTestDlg.cpp: implementationfile // #include"stdafx.h" #include"SmTest.h" #include"SmTestDlg.h" #ifdef_DEBUG #definenewDEBUG_NEW #undefTHIS_FILE staticcharTHIS_FILE[]=__FILE__; #endif ///////////////////////////////////////////////////////////////////////////// //CAboutDlgdialogusedforAppAbout classCAboutDlg: publicCDialog { public: CAboutDlg(); //DialogData //{{AFX_DATA(CAboutDlg) enum{IDD=IDD_ABOUTBOX}; //}}AFX_DATA //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport //}}AFX_VIRTUAL //Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg: : CAboutDlg(): CDialog(CAboutDlg: : IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } voidCAboutDlg: : DoDataExchange(CDataExchange*pDX) { CDialog: : DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg,CDialog) //{{AFX_MSG_MAP(CAboutDlg) //Nomessagehandlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// //CSmTestDlgdialog CSmTestDlg: : CSmTestDlg(CWnd*pParent/*=NULL*/) : CDialog(CSmTestDlg: : IDD,pParent) { //{{AFX_DATA_INIT(CSmTestDlg) m_strRXData=_T(""); m_strTXData=_T(""); //}}AFX_DATA_INIT //NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32 m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); } voidCSmTestDlg: : DoDataExchange(CDataExchange*pDX) { CDialog: : DoDataExchange(pDX); //{{AFX_DATA_MAP(CSmTestDlg) DDX_Control(pDX,IDC_MSM1,m_ctrlm); DDX_Text(pDX,IDC_EDIT_RXDATA,m_strRXData); DDX_Text(pDX,IDC_EDIT_TXDATA,m_strTXData); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSmTestDlg,CDialog) //{{AFX_MSG_MAP(CSmTestDlg) ON_WM_SYSMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON2,OnButton2) ON_BN_CLICKED(IDC_BUTTON_MANUALSEND,OnButtonManualsend) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// //CSmTestDlgmessagehandlers BOOLCSmTestDlg: : OnInitDialog() { CDialog: : OnInitDialog(); //Add"About..."menuitemtosystemmenu. //IDM_ABOUTBOXmustbeinthesystemmandrange. ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 串口 通信 程序设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)