第11章+串口编程.ppt_第1页
第11章+串口编程.ppt_第2页
第11章+串口编程.ppt_第3页
第11章+串口编程.ppt_第4页
第11章+串口编程.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章串口编程,11.1串行通信的基本原理11.2基于Win32API串口编程11.3基于控件串口编程11.4第三方类串口编程,11.1串行通信的基本原理,在PC机的主板上,有一种类型的接口可能为我们所忽视,那就是RS-232C串行接口,在微软的Windows系统中称其为COM。,11.1串行通信的基本原理,串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。在Windows环境(WindowsNT、Win98、Windows2000)下,串口是系统资源的一部分。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。,11.1串行通信的基本原理,串口信号线的接法一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。25芯和9芯的主要信号线相同。主要信号线定义:2脚:发送数据TXD;3脚:接收数据RXD;4脚:请求发送RTS;5脚:清除发送CTS;6脚:数据设备就绪DSR;20脚:数据终端就绪DTR;8脚:数据载波检测DCD;1脚:保护地;7脚:信号地。,11.1串行通信的基本原理,电气特性:数据传输速率最大可到20Kbps,最大距离仅15m.注:看了微软的MSDN6.0,其WindowsAPI中关于串行通讯设备(不一定都是串口RS-232C或RS-422或RS-449)速率的设置,最大可支持到RS_256000,即256Kbps!也不知道到底是什么串行通讯设备?但不管怎样,一般主机和单片机的串口通讯大多都在9600bps,可以满足通讯需求。,11.1串行通信的基本原理,接口的典型应用:大多数计算机应用系统与智能单元之间只需使用3到5根信号线即可工作。这时,除了TXD、RXD以外,还需使用RTS、CTS、DCD、DTR、DSR等信号线。(当然,在程序中也需要对相应的信号线进行设置。),最简单的RS232-C信号线接法,11.2基于Win32API串口编程,1、API描述在WIN32API中,串口使用文件方式进行访问,其操作的API基本上与文件操作的API一致。打开串口配置串口超时设置事件设置读串口写串口关闭串口,11.2基于Win32API串口编程,打开串口Win32中用于打开串口的API函数为CreateFile,其原型为:HANDLECreateFile(LPCTSTRlpFileName,/将要打开的串口逻辑名,如COM1或COM2DWORDdwAccess,/指定串口访问的类型,可以是读取、写入或两者并列DWORDdwShareMode,/指定共享属性,由于串口不能共享,该参数必须置为0LPSECURITY_ATTRIBUTESlpsa,/引用安全性属性结构,缺省值为NULLDWORDdwCreate,/创建标志,对串口操作该参数必须置为OPENEXISTINGDWORDdwAttrsAndFlags,/属性描述,用于指定该串口是否可进行异步操作,/FILE_FLAG_OVERLAPPED:可使用异步的I/OHANDLEhTemplateFile/指向模板文件的句柄,对串口而言该参数必须置为NULL);,11.2基于Win32API串口编程,例如,以下程序用于以同步读写方式打开串口COM1:HANDLEhCom;DWORDdwError;hCon=CreateFile(COM1,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);if(hCom=(HANDLE)0 xFFFFFFFF)dwError=GetLastError();MessageBox(dwError);,11.2基于Win32API串口编程,配置串口配置串口是通过改变设备控制块DCB(DeviceControlBlock)的成员变量值来实现的,接收缓冲区和发送缓冲区的大小可通过SetupComm函数来设置。DCB结构体定义为:typedefstruct_DCB/dcbDWORDDCBlength;/sizeof(DCB)DWORDBaudRate;/currentbaudrateDWORDfBinary:1;/binarymode,noEOFcheckDWORDfParity:1;/enableparitycheckingDWORDfOutxCtsFlow:1;/CTSoutputflowcontrolDWORDfOutxDsrFlow:1;/DSRoutputflowcontrolDWORDfDtrControl:2;/DTRflowcontroltypeDWORDfDsrSensitivity:1;/DSRsensitivityDWORDfTXContinueOnXoff:1;/XOFFcontinuesTxDWORDfOutX:1;/XON/XOFFoutflowcontrolDWORDfInX:1;/XON/XOFFinflowcontrolDWORDfErrorChar:1;/enableerrorreplacementDWORDfNull:1;/enablenullstrippingDWORDfRtsControl:2;/RTSflowcontrolDWORDfAbortOnError:1;/abortreads/writesonerrorDWORDfDummy2:17;/reservedWORDwReserved;/notcurrentlyusedWORDXonLim;/transmitXONthresholdWORDXoffLim;/transmitXOFFthresholdBYTEByteSize;/numberofbits/byte,4-8BYTEParity;/0-4=no,odd,even,mark,spaceBYTEStopBits;/0,1,2=1,1.5,2charXonChar;/TxandRxXONcharactercharXoffChar;/TxandRxXOFFcharactercharErrorChar;/errorreplacementcharactercharEofChar;/endofinputcharactercharEvtChar;/receivedeventcharacterWORDwReserved1;/reserved;donotuseDCB;而SetupComm函数的原型则为:BOOLSetupComm(HANDLEhFile,/handletocommunicationsdeviceDWORDdwInQueue,/sizeofinputbufferDWORDdwOutQueue/sizeofoutputbuffer);,11.2基于Win32API串口编程,DCBdcb;dcb.BaudRate=9600;/波特率为9600dcb.ByteSize=7;/数据位数为7位dcb.Parity=EVENPARITY;/偶校验dcb.StopBits=2;/两个停止位dcb.fBinary=TRUE;dcb.fParity=TRUE;if(!SetCommState(hCom,波特率为9600,数据位数为7位,停止位为2位,偶校验,接收缓冲区和发送缓冲区大小均为1024个字节,最后用PurgeComm函数终止所有的后台读写操作并清空接收缓冲区和发送缓冲区,11.2基于Win32API串口编程,超时设置超时设置是通过改变COMMTIMEOUTS结构体的成员变量值来实现的,COMMTIMEOUTS的原型为:typedefstruct_COMMTIMEOUTSDWORDReadIntervalTimeout;/定义两个字符到达的最大时间间隔,单位:毫秒/当读取完一个字符后,超过了ReadIntervalTimeout,仍未读取到下一个字符,就会/发生超时DWORDReadTotalTimeoutMultiplier;DWORDReadTotalTimeoutConstant;/其中各时间所满足的关系如下:/ReadTotalTimeout=ReadTotalTimeOutMultiplier*BytesToRead+ReadTotalTimeoutConstantDWORDWriteTotalTimeoutMultiplier;DWORDWriteTotalTimeoutConstant;COMMTIMEOUTS,*LPCOMMTIMEOUTS;,11.2基于Win32API串口编程,设置超时的函数为SetCommTimeouts,其原型中接收COMMTIMEOUTS的指针为参数:BOOLSetCommTimeouts(HANDLEhFile,/handletocommunicationsdeviceLPCOMMTIMEOUTSlpCommTimeouts/pointertocommtime-outstructure);以下程序将串口读操作的超时设定为10毫秒:COMMTIMEOUTSto;memset(,11.2基于Win32API串口编程,事件设置在读写串口之前,需要用SetCommMask()函数设置事件掩模来监视指定通信端口上的事件,其原型为:BOOLSetCommMask(HANDLEhFile,/标识通信端口的句柄DWORDdwEvtMask/能够使能的通信事件);与SetCommMask对应的GetCommMask()函数的原型为:BOOLGetCommMask(HANDLEhFile,/标识通信端口的句柄LPDWORDlpEvtMask/addressofvariabletogeteventmask);,11.2基于Win32API串口编程,用WaitCommEvent()函数来等待串口上我们利用SetCommMask()函数设置的事件:BOOLWaitCommEvent(HANDLEhFile,/标识通信端口的句柄LPDWORDlpEvtMask,/addressofvariableforeventthatoccurredLPOVERLAPPEDlpOverlapped,/addressofoverlappedstructure);WaitCommEvent()函数一直阻塞,直到串口上发生我们用所SetCommMask()函数设置的通信事件为止。一般而言,当WaitCommEvent()返回时,程序员可以由分析*lpEvtMask而获得发生事件的类别,再进行相应的处理。,11.2基于Win32API串口编程,读串口对串口进行读取所用的函数和对文件进行读取所用的函数相同,读函数原型如下:BOOLReadFile(HANDLEhFile,/handleoffiletoreadLPVOIDlpBuffer,/pointertobufferthatreceivesdataDWORDnNumberOfBytesToRead,/numberofbytestoreadLPDWORDlpNumberOfBytesRead,/pointertonumberofbytesreadLPOVERLAPPEDlpOverlapped/pointertostructureforoverlappedI/O);,11.2基于Win32API串口编程,写串口对串口进行写入所用的函数和对文件进行写入所用的函数相同,写函数原型如下:BOOLWriteFile(HANDLEhFile,/handletofiletowritetoLPCVOIDlpBuffer,/pointertodatatowritetofileDWORDnNumberOfBytesToWrite,/numberofbytestowriteLPDWORDlpNumberOfBytesWritten,/pointertonumberofbyteswrittenLPOVERLAPPEDlpOverlapped/pointertostructureforoverlappedI/O);,11.2基于Win32API串口编程,关闭串口利用API函数实现串口通信时关闭串口非常简单,只需使用CreateFile函数返回的句柄作为参数调用CloseHandle即可:BOOLCloseHandle(HANDLEhObject/handletoobjecttoclose);,11.3基于控件串口编程,MSComm控件要使用ActiveX控件MSComm,程序员必须将其添加入工程,其方法是:(1)单击主菜单project的子菜单AddToproject的ComponentsandControls选项;(2)在弹出的ComponentsandControlsGallery对话框中选择RegisteredActiveXControls文件夹中的MicrosoftCommunicationsControl,version6.0选项,如下图:,11.3基于控件串口编程,单击其中的Insert按钮,MSComm控件就被增加到工程中了。与此同时,类CMSComm的相关文件mscomm.h和mscomm.cpp也一并被加入Project的HeaderFiles和SourceFiles中。当然,程序员可以自己修改文件名,如下图:,11.3基于控件串口编程,MSComm的诸多接口可以分为如下几类:(1)打开与设置串口接口函数;(2)获得串口设置和串口状态接口函数;(3)设置串口发送数据方式、缓冲区接口及发送数据接口函数;(4)设置串口接收数据方式、缓冲区接口及接收数据接口函数;(5)设置与获取串口上发生的事件接口函数。,11.3基于控件串口编程,classCMSComm:publicCWndprotected:DECLARE_DYNCREATE(CMSComm)public:CLSIDconst/Attributespublic:,11.3基于控件串口编程,public:voidSetCDHolding(BOOLbNewValue);BOOLGetCDHolding();voidSetCommID(longnNewValue);longGetCommID();voidSetCommPort(shortnNewValue);/设置端口号,如nNewValue=1表示COM1shortGetCommPort();voidSetCTSHolding(BOOLbNewValue);BOOLGetCTSHolding();voidSetDSRHolding(BOOLbNewValue);BOOLGetDSRHolding();voidSetDTREnable(BOOLbNewValue);BOOLGetDTREnable();voidSetHandshaking(longnNewValue);longGetHandshaking();voidSetInBufferSize(shortnNewValue);shortGetInBufferSize();voidSetInBufferCount(shortnNewValue);shortGetInBufferCount();voidSetBreak(BOOLbNewValue);BOOLGetBreak();,11.2基于Win32API串口编程,voidSetInputLen(shortnNewValue);shortGetInputLen();voidSetNullDiscard(BOOLbNewValue);BOOLGetNullDiscard();voidSetOutBufferSize(shortnNewValue);shortGetOutBufferSize();voidSetOutBufferCount(shortnNewValue);shortGetOutBufferCount();voidSetParityReplace(LPCTSTRlpszNewValue);CStringGetParityReplace();voidSetPortOpen(BOOLbNewValue);/打开或关闭串口,TRUE:打开,FALSE:关闭BOOLGetPortOpen();/串口是否已打开,TRUE:打开,FALSE:关闭voidSetRThreshold(shortnNewValue);/如果设置为1,表示一接收到字符就发送2号事件shortGetRThreshold();voidSetRTSEnable(BOOLbNewValue);/硬件握手使能BOOLGetRTSEnable();voidSetSettings(LPCTSTRlpszNewValue);/Settings由4部分组成,其格式为:BBBB,P,D,S,即波特率,是否奇偶校验,数据位/个数,停止位,如设置为:9600,n,8,1,11.2基于Win32API串口编程,CStringGetSettings();voidSetSThreshold(shortnNewValue);/如果保持缺省值0不变,则表示发送数据的过程中串口上不发生事件shortGetSThreshold();voidSetOutput(constVARIANT,11.3基于控件串口编程,例程,11.2基于Win32API串口编程,为控件添加一个对应的成员变量m_mscom,其对应的变量类型为CMSComm,,11.3基于控件串口编程,BOOLCSerialPortActivexDlg:OnInitDialog()m_mscom.SetCommPort(1);/串口1m_mscom.SetInBufferSize(1024);/设置输入缓冲区的大小,Bytesm_mscom.SetOutBufferSize(512);/设置输入缓冲区的大小,Bytesif(!m_mscom.GetPortOpen()/打开串口m_mscom.SetPortOpen(true);m_mscom.SetInputMode(1);/设置输入方式为二进制方式m_mscom.SetSettings(9600,n,8,1);/设置波特率等参数m_mscom.SetRThreshold(1);/为1表示有一个字符即引发事件m_mscom.SetInputLen(0);,11.3基于控件串口编程,voidCSerialPortActivexDlg:OnSendButton()/TODO:AddyourcontrolnotificationhandlercodehereUpdateData(true);CByteArraysendArr;WORDwLength;wLength=m_send.GetLength();sendArr.SetSize(wLength);for(inti=0;iwLength;i+)sendArr.SetAt(i,m_send.GetAt(i);m_mscom.SetOutput(COleVariant(sendArr);,11.3基于控件串口编程,voidCSerialPortActivexDlg:OnCommMscomm1()/TODO:AddyourcontrolnotificationhandlercodehereUpdateData(true);VARIANTvariant_inp;COleSafeArraysafearra

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论