计算机控制新版专业系统设计方案报告ARM.doc
《计算机控制新版专业系统设计方案报告ARM.doc》由会员分享,可在线阅读,更多相关《计算机控制新版专业系统设计方案报告ARM.doc(19页珍藏版)》请在咨信网上搜索。
《计算机控制系统》 PC-ARM网络通信系统 设计报告 姓 名:魏 文 学 号:132065 指引教师:范中磊 完毕时间:12月28日 0 引言 近年来,运用Internet进行网际间通讯,在WWW浏 览、FTP、Gopher这些常规服务,以及在网络电话、多媒体会议等这些对实时性规定严格 应用中成为研究热点,并且已经是必须了。Windows环境下进行通讯程序设计最基本办法是应用Windows Sockets实现进程间通讯,为此微软提供了大量基于Windows Sockets通讯API,如WinSockAPI、WinInetAPI和ISAPI,并始终致力于开发更快、更容易通讯API,将其和MFC集成在一起以使通讯编程越来越容易。文中重点简介了使用MFCCSocket类编写PC端网络通讯程序设计办法,并基于Windows CE开发环境运用VS设计ARM端网络通讯程序。 1 设计思路 MFC把复杂WinSock API函数封装到类里,这使得编写网络应用程序更容易。CAsyncSocket类逐个封装了WinSock API,为高档网络程序员 提供了更加有力而灵活办法。这个类基于程序员理解网络通讯假设,目是为了在MFC中使用WinSock,程序员有责任解决诸如阻塞、字节顺序和在Unicode与MBCS 间转换字符任务。为了给程序员提供更以便接口以自动解决这些任务,MFC给出 了CSocket类,这个类是由CAsyncSocket类继承下来,它提供了比CAsyncSocket更高层WinSock API接口。Csocket类和CsocketFile类可以与Carchive类一起合伙来管理发送和接受数据,这使管理数据收发更加便利。CSocket对象提供阻塞模式,这对于Carchive同步操作是至关重要。阻塞函数(如Receive()、Send()、ReceiveFrom()、SendTo() 和Accept())直到操作完毕后才返回控制权,因而如果需要低层控制和高效率,就使用CasyncSock类;如果需要以便,则可使用Csocket类。 某些网络应用程序(如网络电话、多媒体会议工具)对实时性规定非常强,规定可以直接应用WinSock发送和接受数据。为了充分运用MFC 优势,首选方案应当是MFC中CAsyncSocket类或CSocket类,这两个类完全封装了WinSock API,并提供更多便利。本实例简介应用这两个类编程模型,并引出有关成员函数与某些概念解释。 CSocket类是由CAsyncSocket继承而来,事实上,在MFC中CAsyncSocket 逐个封装了WinSock API,每个CAsyncSocket对象代表一种Windows Socket对象,使用CAsyncSocket 类规定程序员对网络编程较为熟悉。相比起来,CSocket类是CAsyncSocket派生类, 继承了它封装WinSock API。 一种CSocket对象代表了一种比CAsyncSocket对象更高层次Windows Socket抽象,CSocket类与CSocketFile类和CArchive类一起工作来发送和接受数据,因而使用它更加容易使用。CSocket对象提供阻塞模式,由于阻塞功 能对于CArchive同步操作是至关重要。在这里有必要对阻塞概念作一解释: 一种socket可以处在"阻塞模式"或"非阻塞模式",当一种套接字处在阻塞模式(即同步操作)时,它阻塞函数直到操作完毕才会返回控制权,之因此称为阻塞是由于此套接字阻塞函数在完毕操作返回之前什么也不能做。如果一种socket处在非阻塞模式(即异步操作),则会被调用函数及时返回。在CAsyncSocket类中可以用GetLastError 成员函数查询最后错误,如果错误是WSAEWOULDBLOCK则阐明有阻塞,而CSocket绝不会返回WSAEWOULDBLOCK,由于它自己管理阻塞。微软建议尽量使用非阻塞模式,通过网络事件发生而告知应用程序进行相应解决。但在CSocket类中,为了运用CArchive 解决通讯中许多问题和简化编程,它某些成员函数总是具备阻塞性质,这是由于CArchive类需要同步操作。 在Win32环境下,如果要使用品有阻塞性质套接字,应当放在独立工作线程中解决,运用多线程办法使阻塞不至于干扰其她线程,也不会把CPU时间挥霍在阻塞上。多线程办法既可以使程序员享有CSocket带 来简化编程便利,也不会影响顾客界面对顾客反映。 1.1 CAsyncSocket类编程模型 在一种MFC应用程序中,要想轻松解决各种网 络合同,而又不牺牲灵活性时,可以考虑使用CAsyncSocket类,它效率比CSocket 类要高。CAsyncSocket类针对字节流型套接字编程模型简述如下: (1)构造一种CAsyncSocket对象,并用这个 对象Create成员函数产生一种Socket句柄。可以按如下两种办法构造: CAsyncSocket sock;//使用默认参数产生一种字节流套接字 Sock.Create(); 或在指定端标语产生一种数据报套接字 CAsyncSocket*pSocket=newCAsyncSocket; intnPort=27; pSocket->Create(nPort,SOCK-DGRAM); 第一种办法在栈上产生一种CAsyncSocket对象,而第二种办法在堆上产生CAsyncSocket对象;第一种办法中Create()成员函数用缺省参数产生一种字节流套接字,第二种办法中用Create()成员函数在指定端口产生一种数字报套接字。Create()函数原型为: BOOL Create( UINT nSocketPort = 0,int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL ); 该函数参数有:1)端口,UINT类型。注意:如果是服务方,则使 用一种众所周知端口供服务方连接;如果是客户方,典型做法是接受默认参数,使 套接字可以自主选取一种可用端口;2)socket 类型,可以是SOCK-STREAM(默认值,字节流)或SOCK-DGRAM(数据报);3)socket地址,例如"202.193.64.33"。 (2)如是客户方程序,用CAsyncSocket∷Connect()成员函数连接到服务方;如是服务方程序,用CAsyncSocket∷Listen()成员函数开始监听,一旦收到连接祈求,则调用CAsyncSocket∷Accept()成员函数开始接受。注意:CAsyncSocket ∷Accept()成员函数要用一种新并且是空CAsyncSocket对象作为它参数,这里所说 "空"指是这个新对象还没有调用Create()成员函数。 (3)调用其她CAsyncSocket类Receive()、ReceiveFrom()、Send()和SendTo()等成员函数进行数据通信。 (4)通讯结束后,销毁CAsyncSocket对象。如果是在栈上产生CAsyncSocket对象,则对象超过定义范畴时自动被析构;如果是在堆上产生,也就是用了new这个操作符,则必要使用delete操作符销毁CAsyncSocket 对象。 1.2 CSocket类编程模型 使用CSocket对象涉及CArchive和CSocketFile 类对象。如下简介针对字节流型套接字操作环节中,只有第3步对于客户方和服务方操作是不同,其她环节都相似。 (1)构造一种CSocket对象。 (2)使用这个对象Create()成员函数产生一种socket对象。在客户方程序中,除非需要数据报套接字,Create()函数普通状况下应当使用默认参数。而对于服务方程序,必要在调用Create时指定一种端口。需要注意是,Carchive类对象不能与数据报(UDP)套接字一起工作,因而对于数据报套接字,CAsyncSocket和CSocket 用法是同样。 (3)如果是客户方套接字,则调用CAsyncSocket ∷Connect()函数与服务方套接字连接;如果是服务方套接字,则调用CAsyncSocket∷Listen()开始监听来自客户方连接祈求,收到连接祈求后,调用CAsyncSocket∷Accept()函数接受祈求,建立连接。请注意Accept()成员函数需要一种新并且为空CSocket对象作为它参数,解释同上。 (4)产生一种CSocketFile对象,并把它与CSocket 对象关联起来。 (5)为接受和发送数据各产生一种CArchive 对象,把它们与CSocketFile对象关联起来。牢记CArchive是不能和数据报套接字一起工作。 (6)使用CArchive对象Read()、Write()等函数在客户与服务方传送数据。 (7)通讯完毕后,销毁CArchive、CSocketFile和CSocket对象。 2 PC端通讯程序设计 (1)启动Visual Studio ,创立一种基于对话框架MFC应用程序项目,将该项目命名为"Test";在MFC向导中选中Windows 套接字; (2)在对话框中按照实际需要添加控件,添加控件如表2-1; 表2-1 控件类型 控件ID Caption属性 控件变量 变量类型 按钮 IDC_CONNECTBUTTON 连接 - - 按钮 IDC_DISCONNECTBUTTON 断开 - - 按钮 IDC_SENDBUTTON 发送 - - 按钮 IDC_SENDCLEARBUTTON 清除发送 - - 按钮 IDC_RECEIVECLEARBUTTON 删除 - - 按钮 IDCANCEL 退出程序 - - 编辑框 IDC_IPADDRESS 无 m_IPAddress CString 编辑框 IDC_PORT 无 m_Port UINT 编辑框 IDC_OUTPUTEDIT 无 m_Output CString 编辑框 IDC_CONNECTEDIT 无 m_Connect CString 列表框 IDC_INPUTEDIT 无 m_Iutput CListBox 单选按钮 IDC_SERVERRADIO 服务器 m_Status int 单选按钮 IDC_CLIENTRADIO 客户端 - - 编辑框控件IDC_CONNECTEDIT属性“Read Only”值为“True”;IDC_SERVERRADIO属性“Group”值为“True”。 (3)使用Class Wizard为应用程序按钮添加鼠标单击消息响应函数; /*********************连接按钮消息解决函数******************/ void CTestDlg::OnConnect() { // TODO:Add your control notification handler code here CString msg; UpdateData(TRUE); if (m_Status==0 ) //server { if ( m_ServerSocket!=NULL) { m_Connect="请断开连接!"; UpdateData(FALSE); } else { m_Connect="等待连接..."; UpdateData(FALSE); if(!AfxSocketInit()) { MessageBox(_T("WindowsSocket初始化失败!"),_T("发送"),MB_ICONSTOP); return; } m_ServerSocket=new CNewSocket; m_ServerSocket->m_Status=m_Status; m_ServerSocket->GetDlg(this); if(!m_ServerSocket->Create(m_Port)) MessageBox(_T("SendSocket创立失败!"),_T("发送"),MB_ICONSTOP); else { m_ServerSocket->Listen(); } } } else { if (m_Status==1) //Client { if (m_ClientSocket!=NULL) { m_Connect="请断开连接!"; UpdateData(FALSE); } else { m_Connect="连接服务器..."; UpdateData(FALSE); if(!AfxSocketInit()) { MessageBox(_T("WindowsSocket初始化失败!"),_T("接受"),MB_ICONSTOP); return; } m_ClientSocket=new CNewSocket; m_ClientSocket->GetDlg(this); m_ClientSocket->m_Status=m_Status; if(!m_ClientSocket->Create()) { MessageBox(_T("ReceiveSocket创立失败!"),_T("接受"),MB_ICONSTOP); return; } else { if (!m_ClientSocket->Connect(m_IPAddress,m_Port)) { CString str=m_Connect; SocketReset(); m_Connect=str; m_Connect+="失败!"; UpdateData(FALSE); } else { m_Connect+="完毕!"; m_file=new CSocketFile(m_ClientSocket); m_arIn=new CArchive(m_file,CArchive::load); m_arOut=new CArchive(m_file,CArchive::store); } UpdateData(FALSE); } } } } if (m_Status==-1) { msg="请选取模式!"; AfxMessageBox(msg); } } /*********************断开按钮消息解决函数******************/ void CTestDlg::OnDisconnect() { // TODO:Add your control notification handler code here if (m_arOut!=NULL) { SocketReset(); m_Connect="已断开!"; UpdateData(FALSE); } } /*********************发送按钮消息解决函数******************/ void CTestDlg::OnSend() { // TODO:Add your control notification handler code here if (m_arOut) { if (m_Status==0) { UpdateData(TRUE); *m_arOut<<m_Output; m_arOut->Flush(); } else { UpdateData(TRUE); *m_arOut<<m_Output; m_arOut->Flush(); } } else AfxMessageBox(_T("无有效连接!")); } /*********************清除按钮消息解决函数******************/ void CTestDlg::OnSendclear() { // TODO:Add your control notification handler code here m_Output=""; UpdateData(FALSE); } /*********************删除按钮消息解决函数******************/ void CTestDlg::OnReceiveclear() { // TODO:Add your control notification handler code here m_Input.DeleteString(m_Input.GetCurSel()); UpdateData(FALSE); } /*********************服务器单选按钮消息解决函数******************/ void CTestDlg::OnServerradio() { // TODO:Add your control notification handler code here UpdateData(TRUE); GetDlgItem(IDC_IPADDRESS)->EnableWindow(FALSE); GetDlgItem(IDC_PORT)->EnableWindow(TRUE); UpdateData(FALSE); } /*********************客户端单选按钮消息解决函数******************/ void CTestDlg::OnClientradio() { // TODO:Add your control notification handler code here UpdateData(TRUE); GetDlgItem(IDC_IPADDRESS)->EnableWindow(TRUE); GetDlgItem(IDC_PORT)->EnableWindow(TRUE); UpdateData(FALSE); } (4)使用Class Wizard在应用程序中定义新类CNewSocket,其基类选取为CSocket;重载NewSocket类OnAccept()、OnReceive()、OnClose()函数;增长公有变量CTestDlg *m_dlg;int m_Status并添加一成员函数void GetDlg(CTestDlg *dlg); void CNewSocket::OnAccept(int nErrorCode) { // TODO:在此添加专用代码和/或调用基类 if (m_dlg->m_ClientSocket==NULL) m_dlg->OnAccept(); CSocket::OnAccept(nErrorCode); } void CNewSocket::OnReceive(int nErrorCode) { // TODO:在此添加专用代码和/或调用基类 m_dlg->OnReceive(); CSocket::OnReceive(nErrorCode); } void CNewSocket::GetDlg(CTestDlg *dlg) { m_dlg=dlg; } void CNewSocket::OnClose(int nErrorCode) { // TODO:在此添加专用代码和/或调用基类 m_dlg->OnClose(); CSocket::OnClose(nErrorCode); } (5)为窗口类TestDlg添加5个公有成员变量: CSocketFile *m_file; CArchive *m_arOut; CArchive *m_arIn; CNewSocket* m_ServerSocket; CNewSocket* m_ClientSocket; 并添加公有4个成员函数: void SocketReset(); void OnClose(); void OnReceive(); void OnAccept(); 编写公有函数代码: void CTestDlg::SocketReset() { if (m_arIn!=NULL) { delete m_arIn; m_arIn=NULL; } if (m_arOut!=NULL) { delete m_arOut; m_arOut=NULL; } if (m_file!=NULL) { delete m_file; m_file=NULL; } if (m_ClientSocket!=NULL) { delete m_ClientSocket; m_ClientSocket=NULL; } if (m_ServerSocket!=NULL) { delete m_ServerSocket; m_ServerSocket=NULL; } m_Connect=""; UpdateData(FALSE); } void CTestDlg::OnClose() { if (m_ClientSocket->m_Status==0) m_Connect="客户端"; else m_Connect="服务器"; m_Connect+="已断开!"; UpdateData(FALSE); } void CTestDlg::OnReceive() { CString str1,str2; *m_arIn>>str2; str1=_T("PC机:"); str1+=str2; m_Input.AddString(str1); m_Input.SetCurSel(m_Input.GetCount ()-1); UpdateData(FALSE); } void CTestDlg::OnAccept() { //u_long iMode = 1; m_Connect+="完毕!"; UpdateData(FALSE); m_ClientSocket=new CNewSocket; //m_ClientSocket->IOCtl(FIONBIO,&iMode); m_ClientSocket->GetDlg(this); m_ServerSocket->Accept(*m_ClientSocket); m_ClientSocket->m_Status=m_ServerSocket->m_Status; m_file=new CSocketFile(m_ClientSocket); m_arIn=new CArchive(m_file,CArchive::load); m_arOut=new CArchive(m_file,CArchive::store); } (6)编译运营程序,成果如图2-1所示。 图2-1 PC端通讯程序界面 3 ARM端通讯程序设计 对于ARM端通讯程序,其源代码与PC端源代码基本同样,在此简略论述其设计过程。 (1)启动Visual Studio ,创立一种新项目,Project types选取“Smart Device”,然后Templates选取“MFC Smart Device Application”,将该项目命名为"Test";在MFC向导中选中Windows 套接字; (2)其她环节与PC过程相似,代码编写完毕后,编译运营成果如图3-1。 图3-1 ARM端通讯程序界面 4测试 (1)系统连接 一方面将编写完毕ARM通讯程序通过USB同步软件Microsoft ActiveSync 置于Nandflash中,然后用交叉网线分别连接PC端与ARM端。连接成功后,查看双方IP如图4-1、图4-2所示。 图4-1 PC端IP 图4-2 ARM端IP (2)PC为服务器,ARM为客户端测试成果 图4-3 PC机等待客户端 图4-4 ARM设立IP,连接成功 图4-5 PC通讯成果 图4-6 ARM通讯成果 (3)ARM为服务器,PC为客户端测试成果 图4-7 PC通讯成果 图4-8 ARM通讯成果 5 结论 文中重要简介了CAsyncSocket、CSocket类,并通过使用CSocket类实现了PC-ARM网络聊天程序。ARM平台为OK6410开发板,采用WinCE操作系统。PC与ARM通讯采用客户/服务器通信模型,PC与ARM均可选取为服务器,基本完毕了简朴网络聊天功能。系统缺陷在于通讯数据较为单一,无法实现图片传播等。 参照文献: [1]马石安 魏文平.Visual C++程序设计与应用教程.北京:清华大学出版社,. [2]侯俊杰.进一步浅出MFC.第版.武汉:华中科技大学出版社,.- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机控制 新版 专业 系统 设计方案 报告 ARM
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文