版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要随着计算机技术的开展和推广,利用串口进行数据通讯在通讯领域中占有着重要的地位。为了方便和快速的通过Internet网络访问串口效劳器的串口,本课题把串口通信集成到Windows效劳,Windows效劳完成串口通信的根本操作。由文中详细描述了串口通信效劳的原理和工作流程,还列举出了相关的核心代码。用流程图的方式来描述了各个模块的逻辑实现。串口通信效劳中采用平安队列的机制来控制多线程访问多串口。在开发中按照软件工程的流程,从需求分析到概要设计从详细设计到编码,以及最后的测试,利用软件工程的工具管理开发代码和文档。此外,还开发出了客户端来测试该效劳工作是否正常。经过测试效劳工作正常,能通过网络连接到效劳器完成串口的通信。最后总结了开发和设计的缺乏之处,程序还有待进一步完善。关键词:串口通信;Windows效劳;平安队列;多线程Abstract
With
the
developmentofcomputertechnology
and
topromote
theuse
of
serial
datacommunication
occupies
animportantpositionin
the
communications
field.
Inorderto
easilyandquickly
throughtheInternet
network
to
access
the
serial
server
serial,thesubjectof
serialcommunication
integrated
intotheWindows
services,Windows
services
tocomplete
thebasicoperation
of
the
serialcommunication.
By
the
paper
describesindetail
theprinciplesand
workflow
of
the
serialcommunication,
alsocited
the
corecode.
Flowchart
way
todescribe
the
logic
of
eachmodule.
Serialcommunication
services
usedin
the
security
queue
mechanismtocontrol
the
multi-threaded
access
to
morethan
serial.Development
in
accordance
with
the
softwareengineeringprocess,fromrequirements
analysisto
outlinedesign,
detaileddesign
to
coding,
and
finaltesting,theuseof
softwareengineering
toolsformanaging
thedevelopmentof
codeanddocumentation.
Alsodeveloped
a
client
totest
theservice
isworkingproperly.
After
the
normal
work
of
testingservices,throughthenetwork
toconnecttothe
servertocomplete
theserial
communication.
Concluded
the
developmentanddesignoftheinadequaciesof
the
program
remainstobe
furtherimproved.Keywords:serialcommunication;Windowsservice;
securityqueue;
multi-threaded目录摘要 1Abstract 2第一章引言 51.1课题背景 51.2研究现状 51.3研究目的及意义 6第二章开发技术简介 7串行通信简介 72.2vc++简介 72.3USB接口技术简介 92.4USB通信参考模型 92.5USB接口的通讯原理 102.5.1USB设备的接入 102.5.2USB设备的识别 10功能需求 112.6.1效劳器端 112.6.2串口通信 112.6.3客户端 11设计方案 11效劳器端 11串口通信 122.7.3客户端 12第三章系统程序设计 13串口通讯的程序设计 133.2通信协议 14第四章系统程序的主要功能 154.1程序功能 15参数设置功能 15参数显示功能 15翻开串口功能 15关闭串口功能 15接收数据功能 15发送数据功能 15清空数据接收区功能 154清空数据发送区功能 15自动发送功能 15十六进制显示功能 15十六进制发送功能 154.2程序运行平台 15总体设计 16程序类的说明 16模块分析 18参数设置和显示模块 18翻开串口模块 20发送数据模块 21自动发送模块 22接收数据模块 22清空接收区模块 23清空发送区模块 23关闭串口模块 24第五章系统测试 255.1系统测试 255.2测试目的 255.3测试结果 25总结 27参考文献 28致谢 29第一章引言串口应用是一种常见的应用技术。无论是在一些工业控制领域还是其他行业,这种应用屡见不鲜。用于开发串口应用的编程语言也有很多种,在诸多编程语言中,使用VisualC++进行串口开发无疑是最好的方法。使用VisualC++进行串口应用开发有两种可选方法:一是利用Microsoft提供的CMSCOMM控件进行通讯,不过现在很多程序员都觉应该放弃这种方式,因为这种方法虽然简单快捷,但是灵活性差。二是利用WINAPI函数进行编程,这种编程的难度高,要求掌握很多的API函数,这种方法功能强大,针对不同的要求,有多种应用方式。1.1课题背景随着信息技术的迅速开展,数据采集和处理技术广泛应用于雷达、通信、遥测、遥感等领域。而在早期的计算机系统上通常使用串口或并口来发送数据,每个接口都需要占用计算机内部很多的资源,传统的接口一般采用PCI总线或RS-232串行总线。PCI总线有较高的传输速率,可达132Mbit/s,也可以即插即用,但是它们的扩充槽有限且插拔不方便;RS-232串行总线连接比拟方便,但是传输速率太慢,不易用于高速传送数据和传送大量数据。USB(通用串行总线)集中了PCI和RS-232串行总线的优点,具有方便的即插即用和热插拔特性以及较高的传输速率,因此,将USB技术应用于数据采集是非常适宜的,可以到达数据采集系统的高速度处理。目前,USB已经推出了其协议的2.0版本,速率高达480Mbit/s。计算机与外界进行信息交换称为通信。通常说的通信方式有并行通信和串行通信两种。串行通信指的是一条信息的各位数据被逐位按顺序传送的通信方式。串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线,虽然本钱低,但是传送速度慢。串行通信的距离可以从几米到几千米。1.2研究现状串口通讯目前流行的方法大概有三种:一是利用WINAPI函数进行编程,这种编程的难度高,不好掌握,要求掌握很多的API函数。二是利用Microsoft提供的CMSCOMM控件进行通讯,不过现在很多程序员都觉应该放弃这种方式。三是利用现在网络上面提供的一些串口通讯控件进行编写。这三种方法都没有同Windows效劳联系起来。1.3研究目的及意义本文研发了一套基于USB接口的数据采集系统,整个系统的设计涉及到硬件、设备固件(Firmware)、USB设备驱动程序及客户应用软件。传统的数据采集系统大都采用标准的串行口和并行口作为数据传输接口,其局限性在于数据传输速率低、使用不方便.最新推出的USB2.0总线标准可以支持高达480Mbps的数据传输速率,并且具有支持即插即用、扩展方便等优点,因此用于大数据量的数据采集系统十分适宜.提出了一个基于Cypress公司USB2.0芯片的数据采集系统的设计方案,经实验,性能良好。第二章开发技术简介不同的独立系统通过线路连接起来交换数据,就是通信,而构成整个通信的线路那么称为网络。有复杂的通信网络如互连网、电信网、卫星网,还有简单的通信网络如两台数据终端设备可通过串行接口如RS-232连接而成。RS-232C是美国电子工业协会(EIA)制定的关于数据终端通信装置(如Modem)之间相互连接的标准接口,也是目前最常用的串行接口标准。RS-232串行接口总线适用范围为通信设备之间距离不大于15m,传输速率最大为20KB/s。串行通信在发送时,把CPU送来的并行码转换成串行码,逐位依次发送出去;在接收时,把发送过来的串行码逐位接收,组装成并行码,并行地发送给CPU去处理。这种串行到并行的转换功能当然可以用软件来实现,但是这样会占用CPU,所以常用硬件电路来实现这一功能,这种硬件电路叫做串行通信接口,即串口(SerialCommunicationPort)。PC机一般都有1个或2个串口,依次为COM1、COM2。这些串口提供了外部设备与计算机进行数据传输和通信的通道。串口在系统控制的范畴中一直占有相当重要的地位,不仅没有因为时代的进步而被淘汰,反而在规格和性能上越来越向极限挑战,成为每台计算机上的必要配置之一。2.2vc++简介VC++是在Windows平台下构建32位应用程序的强大而又复杂的开发工具,是目前世界上使用最多的开发工具之一。VC++的应用非常广泛,从桌面应用程序到效劳器端软件,从系统软件到应用软件,从单机程序到分布式应用程序,从图形图像处理到游戏的开发,VC++无所不在。有一句关于VC++的话流传甚广,说“偷懒的人学VB,聪明的人学iew/3297.htm"Delphi,真正的程序员学VC〞,其一方面说明了VC应用的广泛,另一方面也说明了学习VC是有一定难度的。[1]2004年,作者推出了一套讲述VC++6.0编程的教学视频,得到了广阔学员的热烈反响,许多学员通过这套视频走上了VC++开发之路。有不少学员来信希望我能够将视频中的内容著书出版,让更多的人受益,然而由于自身琐事较多,一直未能如愿。后来在博文视点公司郭立总编的介绍下,有幸结识了余安萍,并由她执笔将视频中的内容整理出书。正是由于余安萍和郭立女士所付出的劳动,才有了本书的出版,在此向她们表示衷心的感谢。本书读者本书读者群包括:掌握了C语言,想进一步学习Windows编程的读者。学习VC++多年,但始终没有真正入门的读者。正在从事VC++开发的初级程序员。有一定VC++开发经验,想要系统地学习VC++的读者。在本书的配套光盘中,提供了一套完整的VC++教学视频,以帮助读者更快、更好地掌握VC++编程。本书的内容组织本书在内容的组织上循序渐进、由浅入深;在知识的介绍上,从内到外、从原理到实践。第1章帮助读者掌握Windows平台下程序运行的内部机制。第2章帮助读者复习C++中的重要知识,为后续知识的学习打下良好的根底。第3章重点剖析MFC框架程序的运行脉络,并与第1章的知识做对照,为读者彻底扫清学习MFC的迷雾。相信通过这章的学习,很多以前学过MFC的读者都会有一种恍然大悟的感觉。前三章可以归为根底局部,从第4章开始就是实际应用开发的讲解了,包括绘图、文本、菜单、对话框、定制程序外观、图形保存和重绘、文件和注册表例子。本书的讲解理论结合实际,选用的例子和代码具有相当的代表性和实用价值,我和我的学员曾经在实际开发工程的过程中就直接使用过很多书中的代码。本书的实例程序作者在编写本书时,使用的操作系统是Windows2000ServicePack4,开发工具是VC++6.0SP5,MSDN是2001年1月版的〔提示:与VC++6.0匹配的MSDN截止到2001年10月版,之后的版本都与.NET匹配,可能与本书使用的版本有所不同〕。本书所有的实例程序都在上述环境中运行正常。提示:由于QQ运行时占用了多个端口,可能与本书例子中的网络程序使用的端口冲突,在运行本书例子中的网络程序时,如果出错,请更换程序中的端口号,或者关闭QQ后再运行程序。学习建议配套光盘提供的视频课数与本书的章数是一一对应的,建议读者先看视频,有一个初步印象后再看相应的章节,这样能够更快、更好地掌握VC++编程。在学习本书时,建议读者多动脑〔想想为什么〕,多动手〔将知识转换为自己的〕。在理解的前提下,独立地编写出书中每章的例子程序,可以作为是否掌握本章内容的一个考核。由于作者的水平有限,错误和疏漏之处在所难免,欢送广阔技术专家和读者指正。信、ActiveX控件、动态链接库、HOOK编程等多个主题,并且每一章都有一个完整的操作、网络编程、多线程、进程间通2.3USB接口技术简介USB的全称为UniversalSearialBus,即通用串行总线。与RS-232类似,USB总线也是一种串行外围设备连接的总线形式,它是1995年由Microsoft、Compaq、IBM等公司联合制定的一种新的PC串行通信协议,从推出之日起就得到了各大厂商的广泛支持,得以不断完善和开展,目前USB协议的最新版本已经到达了2.0。USB总线作为一种新的串行总线,不仅在传输速度上得到了极大的提高,同时还具有接口简单、真正的即插即用、传输线供电、多设备级联等特性。USB总线的成功推出,对外设的接口产生了广泛的影响,目前使用USB总线接口的如键盘、鼠标、闪存、摄像头等外围设备在市场上已广泛存在。2.4USB通信参考模型实现USB设备与USB主机之间的通信主要有两种方法:一种是USB设备利用简单的点对点串行连接与主机的应用程序进行通信;另一种是USB主机上的应用程序通过驱动程序与USB设备进行通信。USB通信参考模型分为3层,如下图。最底层为总线接口层,提供主机与设备之间物理、信号和包级的连接;中间为设备层,提供USB系统软件执行通用的USB操作;最上层为功能层,通过匹配的应用软件实现设备的具体功能。一般而言,每个USB设备可以有一个或多个配置〔configuration〕,设备的每个配置中都含有一个或更多的接口〔interface〕,接口指出软件应该怎样访问硬件,另外,接口一般都有替换设置〔alternatesetting〕以适应不同的带宽要求。设备的接口又包含一个或多个端点〔endpoint〕,端点是作为通信管道〔pipe〕的一个终点。端点类型直接影响着USB数据的传输类型,它有四种:控制〔Control〕、批量〔Bulk〕、中断〔Interrupt〕和同步〔Isochronous〕,给定类型的端点总是使用对应类型的传输方式。端点和管道的区别:从用户角度看,端点是可以直接进行IO数据流操作的设备中的根本单位,它是一个USB设备唯一可以确认的局部,是主机和设备之间通信流的终点。管道是一个端点与主机客户程序进行IO操作时使用的中介,也可以说它是主机和一个设备端点之间的信息连接,是数据流动的路径。管道和端点是一一对应的。端点侧重于静态的概念,而管道那么侧重于动态的概念。USB总线接口包括USB主控制器和根集线器,其中USB主控制器负责处理主机与设备之间电气和协议层的互连,根集线器那么提供USB设备连接点。USB系统使用USB主控制器来管理主机和USB设备之间的数据传输,另外它也负责管理USB资源,如带宽等。应用软件是不能直接访问USB设备硬件的,而是通过USB系统软件和USB总线接口与USB设备进行交互。2.5USB接口的通讯原理USB设备的接入USB接口中的+5V电源不但可以为外接设置提供小电流供给,并且还起着检测功能。当USB设置插入USB接口后,主机的+5V电源就会通过USB边线与USB设备相通。USB外设的控制芯片会通过两只10K的电阻来检查USB设备是否接入了主机的USB端口。如果这两个引脚一个为高电平,一个为低电平时就表示USB外设已经正常确连入USB接口,这时外设的控制芯片开始工作,并通过DATA+,DATA-向外送出数据。这时主机接收数据后,就会提示发现新硬件,并开始安装新硬件驱动。2.5.2USB设备的识别在USB外设向外送出数据时,其中就包括设备自身的设备名及型号等相关参数,主机就是根据这些信息在显示器上显示出所发现的新硬件的名称型号的。多说一点:如果现在闪存的价格降得更低时,我们就可以把扫描仪,打印机,数码相机的驱动程序存在设备内部。当主机需要驱动程序时,直接从设备内部读取就可以了,也就不再需要驱动光盘和安装驱动等繁琐手续了。功能需求效劳器端串口效劳器上的串口通信效劳翻开一个固定的端口,监听客户端的Socket连接。假设检测到客户端的连接那么为客户端分配一个串口,供客户端发送数据。客户端同效劳器协商好串口的配置信息,那么客户端发送的数据效劳器直接发送到串口,通过串口发送除去。假设效劳器检测到串口接受到数据,者直接把接收到的数据发送到客户端。即效劳器中转串口和客户端的数据。这样一来客户端就好似直接链接到串口效劳器上的串口,与效劳器串口相连接的外设进行通信。串口效劳器具有很多个串口形成一个串口池。串口池中的串口连接着不通或相同的外设,客户通过Internet联网的方式链接到效劳器,同效劳器的外设通信。串口通信串口通信效劳管理整个串口池。效劳程序对串口池进行合理管理和分配到客户端的连接请求,效劳器会从串口池中选取一个串口供客户端使用。当客户端通信完毕,断开同效劳器的链接时,效劳器端回收这个串口,以供其他客户端使用。在分配串口的时候不能让不同用户使用同一串口,让每一个客户端独立的使用某一个串口。当客户端链接上效劳器后,效劳器为客户端分配一个串口供客户端使用。这时候串口通信需要被实现。包括串口的翻开,串口参数设置,读写数据到串口以及关闭串口。,效劳器端接收客户端客户端的需求相对简单。连接效劳器的客户端通过指定效劳器地址和端口号连接到效劳器,设置串口的通信参数,同效劳器通信。可以发送数据到效劳器和接受效劳器发送回来的数据,并显示接收到的数据。通信完毕时断开通效劳器的连接。设计方案效劳器端效劳器端使用WindowsNT效劳来提供效劳,此效劳监听某一端口,等待客户端的链接。为客户端提供效劳。使用WindowsAPI自己定义效劳的行为。效劳管理串口池,效劳启动初始化时,检测效劳器的串口,串口统一进入一个全局平安队列。当客户端发起连接请求时,效劳器开启一个线程来处理该客户的请求,直到客户端断开连接,线程退出执行。在线程中,从平安队列的队头出队列一个串口,该串口分配给该客户使用,客户端首先设置该串口的通信参数,否那么按照默认串口通信参数进行通信。如果有多个客户同时连接效劳器那么效劳器同时开启多个线程来处理多个用户的连接请求。分配给客户端使用的串口接收外设发来数据时,效劳器通过连接的Socket发送到客户端,客户端处理接收到的数据。效劳器端接收到客户端发来的数据时,把接收到的数据发送到分配给这个客户端的串口,通过串口发送到外设,外设处理接收到的数据从而做出反响,完成通信。串口通信使用WindowsAPI的串口操作函数,封装成串口类,来处理串口通信。此串口类统一操作串口池里的串口,根据不同的串口号来操作这些串口。从而到达每一个客户的使用一个串口,每个串口都是相同的操作。可以根据不同的通信设备为不同的串口设置不同的通信参数。串口通信负责处理串口的参数设置,串口的翻开和关闭,数据的读和写,即写数据到串口和从串口读数据。翻开串口时,效劳处理此客户的线程开启另一线程监听串口是否有数据接收,当发现有数据来的时候,串口读出该数据通过Socket发送到客户端。2.7.3客户端客户端使用MFC编程创立基于对话框的应用程序。该程序使用WindowsSocket建立同指定效劳器的数据连接。当建立好链接后,可设置串口的通信参数,如:波特率,数据位,奇偶校验,停止位等。设置好串口的通信参数后就可以同效劳器分配给的串口链接的外设通信了。发送数据到效劳器的串口,和接收效劳器发送回来的数据。第三章系统程序设计通信是指不同的独立系统利用线路互相交换数据,它的主要目的是将数据从一端传送到另一端,实现数据的交换。在现代工业控制中,通常采用计算机作为上位机与下层的实时控制与监测设备进行通讯。现场数据必须通过一个数据收集器传给上位机,同样上位机向现场设备发命令也必须通过数据收集器。串行通信因其结构简单、执行速度快、抗干扰能力强等优点,已被广泛应用于数据采集和过程控制等领域。在我们设计的整个系统的工作过程中,计算机要向步进电机系统发送数据和指令,这就需要通讯系统负责计算机和步进驱动系统的通信,即计算机与单片机之间的通讯。我们设计的这套通信系统包括发送端、接收端、转换数据的接口及传送数据的通道。在软件设计中,采用汇编和C++分别对单片机和计算机进行编程。汇编语言可直接应用CPU的硬件特性进行编程,它具有程序设计快、可读性好、代码转换质量高等特点,我们将其用于单片机的编程;而采用C++Builder编写上位机界面软件具有界面友好,可多任务运行的优点,并且可以有选择地单独向某下位机发送信息。串口通讯的选择串行通讯的标准接口存在多种,如RS-232,RS-485,USB接口,IEEE-1394等,它们各有特点,应用的领域也各有侧重。RS-485在传输数据时抗噪声干扰的能力比拟强,常用于工业生产领域;USB接口和IEEE-1394传输速度较快,但有些计算机和操作系统不支持这样的接口;RS-232是PC机与通信工业中应用最广泛的一种串行接口;RS-232被定义为一种在低速率串行通讯中增加通讯距离的单端标准。综合其性能、价格和实用性,对该系统而言,利用RS-232进行端口通讯最为适宜。RS-232是现代计算机必备的接口,通常含有COM1和COM2两个端口,一般计算机将COM1口以9引脚的接头接出。新一代的计算机均以9引脚的接头(DB9)接出所有的RS-232通信端口。为了实现系统的可靠实时性传输,本系统在设计的过程中采用了三线制接法,即仅采用RS-232端口的地端、接收数据和发送数据三引脚与外部相连,接线如图3.1所示。 图3.1RS-232端接口串行通信程序设计包括3方面,一方面是单片机的通信程序,另一方面为计算机的通信程序,此外为了保证通信数据的可靠性,在编写程序之前,还要为其双方制定通信协议。3.2通信协议(1)串行通信端口设置为1,波特率设置为2400bps,数据位数为8位。(2)如果单片机正在采集数据,收到数据中第一个字节为48或49,那么进行数据分配,否那么判定数据流是不是为“STOP〞,假设是那么向电机发送停止指令。(3)计算机发送给单片机的数据包大小为6个字节,第一个字节表示转向,当计算机发送“1〞时,电机正转,发送“0〞时电机反转。第二、三、四字节表示转速,输入数据范围为0~16777215。后2个字节表示旋转角度,输入数据范围为0~65535。数据格式如图3.2所示。(4)数据接收完毕,单片机退出中断,并向计算机发送字符“1〞图3.2数据传送格式第四章系统程序的主要功能4.1程序功能设置和修改串口通信参数,包括端口,波特率,奇偶校验位,数据位,停止位。 显示当前串口通信参数,包括端口号,波特率,奇偶校验位,数据位,停止位。参数设置后,才能翻开串口,实现通信。关闭串口功能关闭串口,停止通信。接收数据功能能够进行单个或多个数据的接收和显示。发送数据功能能够进行单个或多个数据的发送。删除接收区所有数据。去除发送区内所有数据。能把发送区内的数据每2s自动发送。在接收区只显示十六进制数,每两个字符一个空格。只能发送十六进制数,不能发送非十六进制数。4.2程序运行平台Visualstudio2021具体操作如下:〔1〕新建MSComm工程,选择MFC应用程序,应用程序类型选择“基于对话框〞,生成的类中选择“CMSCommDlg〞;〔2〕为MSComm工程添加新建一个Dialog设置对话框;〔3〕加载MSComm控件,添加相应的源程序,加载必要的控件;〔4〕编写程序代码,再编译,链接,调试,执行等,生成应用程序。主函数参数设置和显示翻开和关闭串口发送数据接收数据清空接收区清空发送区主函数参数设置和显示翻开和关闭串口发送数据接收数据清空接收区清空发送区classCMSCommDlg:publicCDialog{//构造public: CMSCommDlg(CWnd*pParent=NULL); //标准构造函数//对话框数据 intOnCreate(LPCREATESTRUCTlpCreateStruct); intString2Hex(CStringstr,CByteArray&senddata); charConvertHexChar(charch); enum{IDD=IDD_MSCOMM_DIALOG}; protected: virtualvoidDoDataExchange(CDataExchange*pDX); //DDX/DDV支持//实现protected: HICONm_hIcon; //生成的消息映射函数 virtualBOOLOnInitDialog(); afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam); afx_msgvoidOnPaint(); afx_msgHCURSOROnQueryDragIcon(); DECLARE_MESSAGE_MAP()public: CMSCommm_mscom; //声明m_mscomm变量为CMSComm类型 CStringm_recv; //接收区 CStringm_send; //发送区 CSetupDlgmySetupDlg; //声明设置对话框 BYTEmyCom; //串口号码 CStringmyParity; //奇偶校验类型 CStringmyBaudRate; //通信波特率 CStringmyData; //数据位 CStringmyStop; //停止位 DECLARE_EVENTSINK_MAP() voidOnCommMscomm1(); afx_msgvoidOnBnClickedSendbutton(); afx_msgvoidOnBnClickedClearsend(); afx_msgvoidOnBnClickedClearRecv(); afx_msgvoidOnBnClickedSetupcom(); afx_msgvoidOnBnClickedOpencom(); afx_msgvoidOnBnClickedClosecom(); afx_msgvoidOnTimer(UINT_PTRnIDEvent); afx_msgvoidOnBnClickedCheckAutosend(); CButtonm_Opencom; //翻开串口按钮 CButtonm_Closecom; //关闭串口按钮 CButtonm_Setupcom; //设置按钮 CStringm_Para; //通信参数显示 CButtonm_ClearRecv; //清空接收按钮 CButtonm_ClearSend; //清空发送按钮 CButtonm_SendText; //发送按钮 CButtonm_ctrlHexSend; //十六进制发送 CButtonm_ctrlHexDisplay; //十六进制显示 BOOLm_bAutoSend; //自动发送};单击主界面中的【设置】按钮,将弹出“设置〞对话框,如图7.1所示,可以在该对话框中设置串口的通信参数。该命令的代码如下:voidCMSCommDlg::OnBnClickedSetupcom(){ //TODO:在此添加控件通知处理程序代码 m_Opencom.EnableWindow(TRUE); AfxMessageBox(_T("请设置通信参数并翻开串口以实现通信!")); CStringstrStatus,strTemp; doubledblBaund; intmdata,mstop; if(mySetupDlg.DoModal()==IDOK) { myCom=mySetupDlg.m_com+1; //求取串口编号 if(mySetupDlg.m_BaudRate<8) { dblBaund=pow(2,(double)mySetupDlg.m_BaudRate); //求取波特率 dblBaund=300*dblBaund; } else { switch(mySetupDlg.m_BaudRate) { case8: dblBaund=43000; break; case9: dblBaund=56000; break; case10: dblBaund=57600; break; case11: dblBaund=115200; break; case12: dblBaund=128000; break; case13: dblBaund=256000; break; } } strStatus.Format(_T("%.0f"),dblBaund); myBaudRate=strStatus; switch(mySetupDlg.m_Parity) //求取奇偶校验位 { case0: { myParity="E"; break; } case1: { myParity="M"; break; } case2: { myParity="N"; break; } case3: { myParity="O"; break; } case4: { myParity="S"; break; } } mdata=4+mySetupDlg.m_Data; //求取数据位 strStatus.Format(_T("%d"),mdata); myData=strStatus; mstop=1+mySetupDlg.m_Stop; //求取停止位 strStatus.Format(_T("%d"),mstop); myStop=strStatus; strStatus="COM"; strTemp.Format(_T("%d"),myCom); strStatus+=strTemp; strStatus+=","; strStatus+=myBaudRate; strStatus+="bit/s,"; strStatus+=myParity; strStatus+=","; strStatus+=myData; strStatus+=","; strStatus+=myStop; m_Para=strStatus; //求取静态文本显示内容 UpdateData(false); }}单击主界面中的【翻开串口】按钮,如果参数已设置好,将翻开指定的串口,提示“串口翻开成功!〞,如图7.2所示,该命令的代码如下:voidCMSCommDlg::OnBnClickedOpencom(){ //TODO:在此添加控件通知处理程序代码 CStringstrPara; //串口参数 m_mscom.put_CommPort(myCom); //指定串口号mycom strPara=myBaudRate; strPara+=","; strPara+=myParity; strPara+=","; strPara+=myData; strPara+=","; strPara+=myStop; //AfxMessageBox(strPara); m_mscom.put_Settings(strPara); //通信参数设置 m_mscom.put_InBufferSize(1024); //指定接收缓冲区大小 m_mscom.put_InBufferCount(0); //清空接收缓冲区 m_mscom.put_InputMode(1); //设置数据获取方式 m_mscom.put_InputLen(0); //设置每次读取长度 m_mscom.put_RThreshold(1); //oncomm事件门限值 m_mscom.put_PortOpen(1); //翻开串口 m_Opencom.EnableWindow(false); //使翻开串口按钮无效 m_Closecom.EnableWindow(true); //使关闭串口按钮生效 m_SendText.EnableWindow(true); m_Setupcom.EnableWindow(false); //使设置按钮无效 AfxMessageBox(_T("串口翻开成功!"));}单击主界面中的【发送】按钮,将把发送区的内容发送到串口调试助手的接收区,如果【十六进制发送】选中,那么只能发送0~F,如图7.3(a)(b)所示,该命令的代码如下:voidCMSCommDlg::OnBnClickedSendbutton(){ //TODO:在此添加控件通知处理程序代码 UpdateData(true); if(m_ctrlHexSend.GetCheck()) { CByteArrayhexdata; intlen=String2Hex(m_send,hexdata);//此处返回的len可以用于计算发送了多少个十六进制数 m_mscom.put_Output(COleVariant(hexdata));//发送十六进制数据 } else { CByteArraysendArr; WORDwLength; wLength=m_send.GetLength(); sendArr.SetSize(wLength); for(inti=0;i<wLength;i++) { sendArr.SetAt(i,m_send.GetAt(i)); } m_mscom.put_Output(COleVariant(m_send)); }}当【自动发送】选中时,系统将自动每隔2s发送一次数据,如图7.4(a)(b)所示,程序代码如下:voidCMSCommDlg::OnTimer(UINT_PTRnIDEvent){ //TODO:在此添加消息处理程序代码和/或调用默认值 OnBnClickedSendbutton(); CDialog::OnTimer(nIDEvent);}voidCMSCommDlg::OnBnClickedCheckAutosend(){ //TODO:在此添加控件通知处理程序代码 m_bAutoSend=!m_bAutoSend; if(m_bAutoSend) { SetTimer(1,2000,NULL);//时间为毫秒 } else {KillTimer(1);//取消定时}}发送方发送数据后,在接受区显示对方的发送内容,如果【十六进制显示】选中,那么将只显示十六进制数0~F,如图7.5(a)(b)所示,该命令的代码如下:voidCMSCommDlg::OnCommMscomm1(){ //TODO:在此处添加消息处理程序代码 UpdateData(true); VARIANTvariant_inp; COleSafeArraysafearray_inp; longi=0; intlen; charrxdata[2048]; CStringtmp; switch(m_mscom.get_CommEvent()) { case2: //表示接收缓冲区内有字符 { variant_inp=m_mscom.get_Input(); safearray_inp=variant_inp; len=safearray_inp.GetOneDimSize(); for(i=0;i<len;i++) safearray_inp.GetElement(&i,&rxdata[i]);//转换为BYTE型数组 for(i=0;i<len;i++) ///将数组转换为Cstring型变量 { BYTEbt=*(char*)(rxdata+i);//字符型 if(m_ctrlHexDisplay.GetCheck()) { tmp.Format(_T("%02X"),bt);//将字符以十六进制方式送入临时变量tmp存放,注意这里参加一个空隔 m_recv+=tmp;//参加接收编辑框对应字符串 } } if(!m_ctrlHexDisplay.GetCheck()) rxdata[i]='\0'; } if(!m_ctrlHexDisplay.GetCheck())m_recv+=rxdata; UpdateData(false); break; default: break; }}单击主界面中的【清空接收区】按钮,将清空接收区内容,提示“清空接收区内容!〞如图7.6所示,该命令的代码如下:voidCMSCommDlg::OnBnClickedClearRecv(){ //TODO:在此添加控件通知处理程序代码 m_recv=""; UpdateData(FALSE); AfxMessageBox(_T("清空接收区成功!"));}单击主界面中的【清空发送区】按钮,将清空发送区内容,提示“清空发送区内容!〞如图7.7所示,该命令的代码如下:voidCMSCommDlg::OnBnClickedClearsend(){ //TODO:在此添加控件通知处理程序代码 m_send=""; UpdateData(FALSE); AfxMessageBox(_T("清空发送区成功!"));}单击主界面中的【关闭串口】按钮,将关闭串口,提示“串口关闭成功!〞,如图7.8所示,该命令的代码如下:voidCMSCommDlg::OnBnClickedClosecom(){ //TODO:在此添加控件通知处理程序代码 m_mscom.put_PortOpen(0); //关闭串口 AfxMessageBox(_T("串口关闭成功!")); m_Opencom.EnableWindow(true); //使翻开串口按钮生效 m_Closecom.EnableWindow(false); //使关闭串口按钮无效 m_Setupcom.EnableWindow(true);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 油品储运调合工岗前工作质量考核试卷含答案
- 物料输送及烟气净化工安全规程测试考核试卷含答案
- 2025年东辽县事业单位联考招聘考试历年真题附答案
- 2024年湖南九嶷职业技术学院马克思主义基本原理概论期末考试题附答案
- 2024年温州市工人业余大学马克思主义基本原理概论期末考试题附答案
- 2024年运城市特岗教师招聘考试真题汇编附答案
- 2024年莱芜市直机关遴选公务员考试真题汇编附答案
- 2025年美容美甲行业操作规范手册
- 2024年重庆化工职业学院马克思主义基本原理概论期末考试题附答案
- 2025四川省公务员考试常识判断专项练习题及答案1套
- 2025年及未来5年中国钠基膨润土市场深度评估及行业投资前景咨询报告
- 康复医学科进修汇报
- 患者身份识别管理标准WST840-2025学习解读课件
- 东航客服面试题目及答案
- 医院医疗质量分析会
- 酒吧厨房小吃承包协议书
- 项目系统测试报告模板
- 网约车分公司管理制度
- 社区文艺团队管理制度
- T/CSTE 0431-2023绿色(低碳)产品评价要求隔声型节能铝合金门窗
- 山东省2024年中考物理试题6套附解析答案
评论
0/150
提交评论