串行通信协议软件侦测实现Word文档格式.docx
《串行通信协议软件侦测实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《串行通信协议软件侦测实现Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
xxx
日期:
2012年5月19
目录
摘要I
关键词I
AbstractII
KeywordsII
1引言1
2串行通信协议的原理分析与设计1
2.1串行通信基本概念1
2.2串口硬件设计2
2.21软件环境2
2.22硬件环境2
2.3串口应用设计流程2
2.4WINDOWS下双机的串行通信系统的分析5
2.5串行接口标准5
3串口通信的总体设计方案6
3.1面向对象的设计思想6
3.2串口使用的具体实现6
3.3使用MSComm控件编程8
3.4创建串口9
3.5接收数据处理10
4结果12
参考文献13
致谢14
摘要:
伴随着科学技术日新月异的发展,计算机设备之间通信的能力有越来越强的趋势,实现地球村之间的通信变得触手可及。
串口通信作为计算机的一种标准接口,由于信息时代的飞速发展,计算机通信技术也日趋成熟。
其中串口通信作为一种比可靠性高,灵活性强,使用方便的特点任然被广泛的使用于工业控制。
目前有许多的通信口可供使用,较高速的有并行口,比较新的有USB口,串行口作为一种相对较低速的通行口,在很多场合有被取代的趋势。
然而由于其极低的造价、较高的可信度,目前仍在很多场合下,特别是对传输速率要求不高,传输内容不是很复杂的情况下,串口通信仍然具有相对的优势。
可以在银行、电力系统、公路收费系统等方面看到串口通行的运用与存在。
通过使用串口通信,用户可以随意的设定数据位、停止位、奇偶校验位、数据传输率等。
因此当我们在不知道底层通信协议的情况下,我们想要正确的接受数据还是比较困难的,此时就要依赖较多的硬件设备,如频率计、逻辑分析仪等等来完成。
经过思考分析论证之后,我考虑了一种不依赖太多的硬件设备,只利用纯软件的方法即可侦测串口通信参数设置情况的方法,有一定值得借鉴的价值。
经过分析后我使用了RS-232作为接口线,采用Microsoft公司的VisualC++6.0作为开发工具。
在WINDOWS下实现两台PC机的串行通信系统的实现。
在设计的时候严格的按照结构化程序设计的方法,采用自顶向下,逐步细化,模块化设计,可行性研究,总体设计和结构化编码,最后调试的完整过程。
开发最主要的过程就是实现对数据字符进行自由收发,形成用户比较满意的系统。
关键词:
串口通信RS-232MSC
Serialcommunicationprotocolsoftwaredetection
Abstract:
Alongwiththedevelopmentofscienceandtechnologychangerapidly,computerequipment,communicationsbetweentheabilitytohavemoreandmorestrongtrend,therealizationoftheglobalvillagecommunicationsbetweentheaccessible.Computerserialcommunicationasastandardinterface,duetotherapiddevelopmentoftheinformationage,thecomputercommunicationtechnologyisgettingmoremature.Theserialcommunicationasaratioofhighreliability,strongflexibility,convenientuseisstillwidelyusedinindustrialcontrol.Therearemanycommunicationporttobeused,ahighspeedparallelport,comparesthenewUSBport,serialportasarelativelylow-speedtrafficopening,onmanyoccasionshavereplacedtrend.However,duetoitslowcost,highreliability,isstillpresentonmanyoccasions,especiallyforthetransmissionrateisnothigh,transmissionofthecontentisnotverycomplexcases,serialcommunicationstillhasacomparativeadvantage.Inthebank,electricpowersystem,highwaytollsystem,seeserialportaccessapplicationandexistence.Throughtheuseofserialcommunication,ausercanarbitrarilysetthedatabits,stopbits,paritybit,datatransferrate.Sowhenwedonotknowtheunderlyingcommunicationprotocol,wewanttherighttoacceptdataisrelativelydifficult,atthistimewillbedependentonmanyhardwaredevices,suchasthefrequencymeter,logicanalyzerandsoontocomplete.Afterthinkinganalysis,Iconsideradoesnotrelytoomuchonhardwaredevices,usingonlypuresoftwaremethodcandetectserialcommunicationparameterssettingmethod,hasacertainreferencevalue.AfteranalysisIuseRS-232astheinterface,usingMicrosoft'
sVisualC++6asthedevelopmenttool.InWINDOWStoachievetwoPCmachineserialcommunicationsystembasedon.Inthedesignofthetimestrictlyinaccordancewiththestructuredprogrammingdesignmethod,usingtop-down,stepwiserefinement,modulardesign,feasibilitystudy,designandstructuredcoding,debuggingthewholeprocessofthelast.Thedevelopmentofthemainprocessistoachievedatacharacterfreetransceiver,theformationofusersatisfactorysystem.
Keywords:
serialcommunicationRS-232MSC
1引言
在很多情况下,远程监控和工业自动化领域系统常见的通信编程多为串口通信编程。
计算机串口编程在通信软件中的应用十分广泛。
伴随人类社会的发展,通过计算机控制实现自动化设计大大的提高了劳动生产力和减少了许多人为的错误结果。
通过计算机辅助操作减轻了劳动压力,从而提高了工作效率,直接的减少了人力、财力、物力。
通过串口通信来实现远距离的控制,达到了统一管理的目的。
在本论文中,讨论了在VC++6.0的开发环境下实现两台PC机间的串口通信。
就是通过一个MSComm控件,用一个串口线将两台机子间的串口连接起来,从而建立物理连接进行字符仿真终端的测试。
2串行通信协议的原理分析与设计
2.1串行通信基本概念
串口做为一种在计算机上广泛使用的设备通信(不要与通用串行总线UniversalSerialBus或者说USB混淆)。
大多数计算机都包含有基于RS-232的串口,当然串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口是按位(bit)进行发送和接收字节。
尽管用串行通信比按并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;
而对于串口而言,长度可达1200米。
串口往往是用于ASCII码字符的传输。
通信使用3根线完成:
(1)地线SG,
(2)发送TX,(3)接收RD。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其余的线都用于握手,但都不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个需要进行通信的端口,这些参数必须匹配:
a,波特率:
波特率作为一个衡量通信速度的参数。
它所表示每秒钟传送的bit的个数。
通常我们设定的波特率为14400,28800和36600。
波特率可以远远大于这些值,但是波特率和距离成反比。
高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB(通用接口总线)设备的通信。
b,数据位:
数据位是表示通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。
如何设置取决于你想传送的信息。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取。
c,停止位:
用于表示单个包的最后一位。
典型的值为1,1.5和2位。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
d,奇偶校验位:
在串口通信中一种简单的检错方式。
有四种检错方式:
偶、奇、高和低。
当然没有校验位也是可以的。
对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。
例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。
如果是奇校验,校验位位1,这样就有3个逻辑高位。
高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。
这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步
2.2串口硬件设计
系统配置要求
2.21软件环境
Windows操作系统:
Win9X/ME/2000/XP。
编程环境:
VisualC++6.0英文版
2.22硬件环境
建议配置:
CPU:
奔腾II450以上
内存:
64MB以上
显卡:
标准VGA,24位真彩色
其它:
光驱、鼠标
2.3串口应用设计流程
串口应用设计过程可以简单地用框图描述,具体如下所示。
图2.1设计框图
具体流程如下:
图2.2串口应用设计流程图
举例说明,如果传输的数据是十六进制数的范围,即0~9、A~F、或者a~f,流程图和方框图如下所示。
2.4WINDOWS下双机的串行通信系统的分析
双机的串行通信系统的开发工作大致可以分为以下儿点:
a、软件具有友好的用户界面;
b、可以准确的接收和发送相应的字符数据:
c、在配置按钮窗口中,可对系统需要使用到的参数进行选择,可以选择波特率、数据位、停止位、奇偶校验位。
Windows下的串口资源
Windows下可用的串口资源可以通过设备管理器查看。
按键盘上的Win+Break组合键,调出【系统属性】对话框,单击【硬件】|【设备管理器】选项,出现如图2.3所示的【设备管理器】窗口。
图2.3中的两个框内都是串口资源,上面的是虚拟串口软件虚拟的两个直通串口COM2和COM4,下面的是机器固有的串口COM。
图2.3设备管理器
2.5串行接口标准
在进行串行通信的线路连接时,通常要解决两个问题。
一是计算机与外设之间要共同遵守的某种约定,这种约定成为物理接口标准,它包括电缆的机械特性、电器特性、信号功能及传送过程的定义。
它属于ISO’sOSI七层参考模型中的物理层,规定了传送数据位的物理硬件规则,向链路层提供透明的位流传输实体EIARS-32、RS-422及RS-485标准所包含的接口电缆及连接器均属于此类。
二是按接口标准设置计算机与外设之间串行通信的接口电路。
RS-232C接口标准简介
该标准的全称是EIA-RS-232C标准(ElectronicIndustrialAssociate-RecommendedStandard-232C)是美国EIA(电子工业联合会)与BELL等公司一起开发的1969年公布的通信协议。
它是异步串行通信中应用最广的标准。
总线,它包括了按位串行传输的电气和机械方面的规定。
适用于数据终端设备(DTE)和数据通信设备(DCE)之间的接口。
这个标准对串行通信接口的有关问题,如信号线功能、电气特性都作了明确规定。
EIA-RS-232C信号线定义
EIA-RS-232C标准规定了在串行通信时,数据终端设备DTE和数据通信设备DCE之间的接口信号。
3串口通信的总体设计方案
3.1面向对象的设计思想
面向对象的思想是把信息系统本身看成是一系列离散的对象的集合,这些对象既包括数据结构,也包括在这些数据结构的操作或行为。
若对象之间由事件触发,引起互通消息而实现互操作,这样设计出软件必然是模块化的,可从用的,可扩充的和可移植的,克服了过去由于分析与实施割裂所造成的程序编制必须到设计后期才能进行的程序沉淀现象,可重用性对于软件的维护以及通过对象剪切生产新的软件是至关重要的支持。
一般认为,面向对象方法的主要优点并不是减少了开发时间,它可能比较传统的结构化方法的开发时间还要长一些。
它的主要目标是促进未来系统的可用性,减少后继阶段的开发量,从而大大提高软件生产率和可维护性。
面向对象的程序设计方法(ObjectOrientedProgramming)它是一种试图模仿人们建立现实世界模型的程序设计方法。
面向对象的程序设计以“对象”和“数据结构”为中心,用“对象”表现事物,用“类”表示对象的抽象,用“消息传递”表现事物之间的相互联系,少用“方法”表现处理事物的过程。
3.2串口使用的具体实现
1以文件方式打开串口
这里使用WinAPI函数来实现,这里仅对32位Windows环境下的操作流程做一简单介绍。
(1)应用CreateFile()来打开串口
API函数CreateFile()定义如下:
HANDLECreateFile(
LPCTSTRlpFileName,//文件名
DWORDdwDesiredAccess,//访问模式
DWORDdwShareMode,//共享模式
LPSECURITY_ATTRIBUTESlpSecurityAttributes,//通常为NULL
DWORDdwCreationDistribution,//创建方式
DWORDdwFlagAndAttributes,//文件属性和标志
HANDLEhTemplateFile,//临时文件的句柄,通常为NULL
);
如果调用成功,那么该函数返回文件的句柄,如果调用失败,则函数返回INVALID_HANDLE_VALUE。
(2)串行口的初始化
常常需要对串行口进行一些初始化工作。
这需要通过一个DCB结构来进行。
DCB结构包含了诸如数据传输速率、每个字符的数据位数、奇偶校验和停止位数等信息。
在信息查询或配置串行口的属性时,都要用DCB结构来作为缓冲区。
调用GetCommState函数可以获得串口的配置,该函数把当前配置填充到一个DCB结构中。
一般在用CreateFile打开串口后,可以调用GetCommState函数来获取串行口的初始配置。
要修改串行口的配置,应该先修改DCB结构,然后在调用SetCommState函数用指定的DCB结构来设置串行口。
(3)利用ReadFile()和WirteFile()对串行端口进行读写操作,完成数据传输过程。
这里仅列出ReadFile()函数的说明:
BOOLReadFile(
HANDLEhFile,//文件句柄
LPVOIDlpBuffer,//读缓冲区
DWORDnNumberOfBytesToRead,//要求读入的字节数
LPDWORDlpNumberOfByteRead,//实际读入的字节数
LPOVERLAPPEDlpOverlapped,//指向一个OVERLAPPED结构
);
//若返回TRUE则表明操作成功
(4)关闭串口
3.3使用MSComm控件编程
MSComm最常用的属性
MSComm控件的大部分属性都是可读可写的。
当对其进行写入操作时,是在设置属性的新值。
当读属性时,可以读出该属性的当前设置值。
在VC++中,对控件操作的属性都是通过特定的函数来实现的,这些函数都是CMSComm类的成员函数,当声明了一个CMSComm类的实列后,就可以对该实列使用“.”操作符加成员函数的方法来访问控件的属性了。
以下属性是在每次通信中使用频率最高的属性,通常每次通信的需要进行设置。
1.CommPort属性
通过设置该属性值,可以决定串口通行使用的串口编号。
读取该属性值可获取当前程序使用的串口编号。
使用如下两个函数来操作该属性:
VoidSetCommPort(shortnNewValue);
//设置串口编号
ShortGetCommPort();
//返回正在使用的串口编号
nNewValue可以设置位1~16的任何数值(默认值位1),对应使用的串口号位COM1~COM16。
但是若设置的串口号不存在,则在打开端口时,MSComm控件会产生“设备无效“的错误。
提示:
必须在打开端口之前设置CommPort的属性。
1.Setting属性
设置或者获取串行通信的通行参数。
通常参数包括波特率、奇偶校验位、数据位数及停止位数等4个参数。
VoidSetSettings(LPCTSTRlpszNewValaue);
//设置通信参数,lpszNewValaue来表示
CStringGetSetings();
//读取当前串口通信参数
提示:
通信双方的Settings参数设置必须相同,否则无法进行通信。
2.PortOpen属性
设置该属性值可以打开或关闭串口。
VoidSetPortOpen(BOOLbNewValue);
//打开或关闭串口
BOOLGetPortOpen();
//读取端口的状态,即状态为打开还是关闭
由bNewValue决定打开还是关闭串口,其值为TRUE时打开串口,为FALSE时关闭串口。
在,使用串口之前应通过设置该属性打开串口,而当退出串口通信时,应该关闭串口,以释放程序占用的串口资源。
3.Input属性
通过操作该属性值,可以从串口通信输入缓冲区获取数据。
使用如下函数来操作该属性:
VARIANTGetInput();
执行该函数后,返回并删除接收缓冲区中的数据。
默认情况下读取缓冲区中全部的内容,若设置InputLen属性值大于0,则读取的字符数量由InputLen属性值决定。
使用GetInput函数返回的内容是VARIANT类型的数据,需要通过一定的处理后,才能转换为常见的字符串类型或数值类型
4.Output属性
通过该属性,向串口通行输出缓冲区写入数据,然后通过串口将数据发送出去。
VoidSetOutput(constVAPIANT&
newValue);
该函数表示将newValue的内容写入输出缓冲区。
使用SetOutput()函数写入输出缓冲区的内容必须是VARIANT类型的数据。
3.4创建串口
控件加载后,应该创建控件的实列,该创建操作可以在主对话框的OnCrete消息中处理。
如下是创建串口的代码:
intCTTYReceiveDlg:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{if(CDialog:
OnCreate(lpCreateStruct)==-1)
return-1;
//TODO:
Addyourspecializedcreationcodehere
DWORDstyle=WS_VISIBLE|WS_CHILD;
if(!
myComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{AfxMessageBox("
创建MSComm控件失败!
"
m_Opencom.EnableWindow(false);
m_Closecom.EnableWindow(false);
m_Setupcom.EnableWindow(false);
}
m_Para="
COM1,9600,N,8,1"
;
return0;
3.5接收数据处理
程序在MSComm控件的OnComm事件中接收数据。
首先要将控件加载到程序中。
在VC++主界面中,单击【工程】|【添加工程】|【CommponentsandControls】命令。
弹出【CommponentsandControlsGallery】对话框,打开【RegisteredActiveXControla】文件夹,单击【MicrosoftCommunicationsControl,version6.0】选项,然后单击【Inse