《第一节实现串口通讯的函数及串口编程简介.docx》由会员分享,可在线阅读,更多相关《第一节实现串口通讯的函数及串口编程简介.docx(24页珍藏版)》请在优知文库上搜索。
1、第一节实现串口通讯的函数及串口程简介API函数不仅提供打开和读写通讯端1的操作方法,还提供了名目繁多的函数以支持对中行通讯的各种捺作.常用函数及作用F=南数名作用CreateFiIe打开事【GetCommState检测甲门设置SetCommStateBuiIderCommDCBGetCommTImeoU1.S设冏串口用字符中中的值选填充设得控制块检测通信超时设置SetConimTimeoutsSetCommMaskWaitCommEvent设置通信依时卷故设定被监控事件等待被监控事件发生WaitForMuItipIeObjects等待多个ViIKi测对象的结果WriteFite发送数据Read
2、FiIe接收数据GetoverIappedResu1.t返网蚊后求受(并步)操作结果PurgeCommCtearCommError清空小”援冲区,退出所仃相关操作更新巾口状态结构体,并消除所书用口硬件的误CIoseHandIe关闭出行11用WindowsAPI温。中口程序本身是行巨大优点的,因为控制能力公更强,效率也会更而AP1.编写用I,过程般是这样的:1、创建串口句柄,用CreateFi1.e;2.对串1.1.的参数进行设置,其中比较垂僵的是波特率(BaUdRate),数据宽度(By1.esBits).奇偶校验(Parity),停止位SopBits),当然,我要的还有然1号(Port);3
3、,然后对串口进行相应的读写操作,这时候用到ReadFi1.e和WriteFiIe由数;4.读写结束后.要关闭小U句柄,JHCIoseFiIe下面依次讲述各个步界的过程.第二节创建串口句柄打开事口从字面上去理解.大家也可以发现CreateFIe坡际上表明Windows是把卡口当作一个文件来处理的,所以它也彳f文件那样的缓冲区、句柄、读写错误等,不同的是.这个文件名字只有固定的儿个般为四个),而且始终存在(EXSENG),而“在道用CreateFi1.e的时候请注意它的卷数,CreateFiIe的数原C如下,HAND1.ECreateFie(1.PCTSTRIpFiIeName.DWORD(IwD
4、esiredAccess,DWORDChvShareMode,1.PSECRITYATTRIBUTESIpSecurityAttribUtes.DWORDdwCfeationDisposition.DWORDdwFIagsAndAttributes,HAND1.EhTemp1.ateFite);IpFiIeName:指向一个以NU1.1.结束的字符小.该电指定了要创建.打开或极断的文件管道、通信海、磁盘设在或控制台的名字.当用CreateFiIe打开小口时,这个忿数可用“COM1”指定出U1,用C0M2-指定*口2,依此类推.dwDsirAccess:指定对文件访问的类型,该参数可以为GENE
5、R1.C_READ(指定对该文件的读访问权)或GENER1.JWRrrE(指定该文件的写访问权)曲个值之或同时为为这两个花用ENER1.C_READIGENERIC_WRITE则指定可对;RU进行读写;d/ShareMode:指定此文件可以怎样被共享.因为小行口不支持任何共享模式.所以CiwShareMode必家设为0;IPSeCurityAttnbUteS定义安全属性.一般不用,可设为NU1.1.Win9卜该参数被忽略:dwCreationDisrbuo定义文件创建方式,对巾口必须设为OPENEXISTING.我水打开已羟存在的文件;C1.wFIagsAndAttributes为该文件指定定
6、义文件属性和标志,这个程序中设为FI1.E_F1.AG_OVER1.APPED,表示异步通信方式:HTempIateFi1.e指向个模板文件的句柄,申门无模板可言,设为NU1.1.在WindOWs9x下该咨教必须为NU1.1.由口被成功打开时,返回其句柄,否则返回INVA1.ID-HAND1.E-VaIue(OXFFFFFFFF).上面说到了扑步,那什么是界步呢?井步是相对同步这个概念而言的.界步,就是说.在进行串口读写操作时,不用等到IQ操作完成后函数才返回,也就是说,异步可以更快得我应用户操作:同步,相反.响应的I/O操作必须完成后函数才返回,否则阻塞线程.对于一些很简单的通讯程序来说,可
7、以选择同步,这样可以省去很多错误检查但是对于女朵一点的应用程序,异步是依佳送挣。实例1:f*eamp1.e1.cpp/rIishaoan200906-2970inc1.deWinc1.udeinc1.udeboo1.opeport(charportnameWiJFHHIHAND1.EhComm;hComm=CreateFiIe(Ponname,中门JGENERICREADGENER1.C_WRITE,允许读目O.咐讯设的必须以独占方式打开0.无安全帽性OPEN_EXIST1.NG,/通讯设备已存在F1.1.E_F1.AGqVER1.APPED.异力IQ0);“通讯设备不能用模板打开if(hCo
8、mm=INVA1.ID_HAND1.E_VA1.UE)(C1.oseHand1.e(hComm);returnFA1.SE:Ie1.sereturntrue:voidmain。boo1.open:OPen=OPenPOrtrCOm2);if(open)pri11tf(opencomportsuccess);SyStem(pause。;)programend实例2:*exampe2.cppIishaoan20090629Winc1.udeinc1.udeWinc1.udeboo1.opeport(charportnameV开牛口(HAND1.EhComm;hComm=Crea1.eFiIe(PO
9、nname.:|:IGENERIC,READGENER1.JWR1.TE,允许读写O./7通讯设得必须以独占方式打开0.无安全屏性OPEN_EX1.ST1.NG.通讯设备已存在0,川可步IQ0);通讯设需不能用模板打开if(hComm=INVA1.ID_HAND1.E_VA1.UE)C1.oseHande(hComm);returnFA1.SE;)e1.sereturntrue;1voidmain()(boo1.open;open-openport(com2);if(ope)prntf(oencomportsuccess,);systemfpase);)program第三节设Jt串口在打开通信
10、设法句柄后,常常若要对串行口进行一些初始化工作。这需要通过个DCB结构来进行.DCB结构包含了诸加波特率、每个字符的数据位数.奇偶校验和停止位数等信息.在杳询或配置中1的磁性时,都要用DCB结构来作为缓冲区.第次打开串口时,串口设四为系统默认依,函数GetCommState和SetCOmmState可用检索和设定册口设置的DCB(设备拄制块)结构,该结构中BaudRate.ByteSZe、Stopts和Panty字段含有事口波特率、数据位数、停止他和奇偶校验控制等信息.程序中用DCB进行申口设葭时,应先调用APIjsGetCommState.来获得申口的设置信息:GetCommStateO用途
11、:取得串口当前状态1?;B1.GetCommState(HAND1.EhFie,1.PDCBIpDCB);参数说明IhF1.1.e:串口句柄-IPDCB:设备控删块(DeVICeContro1.B1.。Ck)结构培址.此注构中含有和设备相关的参数.此处是与小口相关的参数,由于参数非常多.当褥要设置巾I参数时,通常是先取得牛U的参数结构.修改部分参数后用带参数结构写入.然后在需要设汽的培力对d8进行设置.申11有很多的属性,上面也已经介绍了些收史要的参数.这里介绍数据结构DCB:typedefstruct_DCB/debDWORDDCBIength;DCB结梅体大小DWORDBaudRate;波
12、特率DWORDfBmary:1;是否是二进制.股设置为TRUEDWORD!Parity:1是否进行奇隅校验DWORDfOutxCtsFkw:1;CTS找上的硬件握手DWORDfOutxDsrF1.ow:1:/DSR城上的帙件报户DWORDfDtrContro1.:2;/DTR控制DWORDfDsrSensitivity:1;DWORDxContineO11offd;DWORDfOutX:1;是杏使用XOMXOFF协议DWORDf1.11:1;是否使用0N.XOFF桥议DWORDfErrorChar:1;发送常误协议DWORDfNu1.1.:1:DWORDfRtsCon1.ro1.2;DWORD
13、fAi)rtnErrorJ;DWORDfDummy2J7;WORDwReservd:WORDXon1.im;设网在XON字符发送之前inbuf中允许的最少字节数WORDXoffUm:在发送XOFF字符之前OutbH中允许的最字节数BYTEByteSize/数据宽度.段为8.有时候为7BYTEParity;奇偶校蛤BYTEStopBits;停止位数charXonChar;设应表示XoN字符的字符,被是采用0x11这个数值CharXOffChar;设黄表示XOFF字符的字符.强是来用0x13这个故依charErrorChar;charEofChar;charEvtChar;WORDV,ReSerV
14、eji;)DCB;我们我正在串口编程中用到的数据成员没有几个,在此仅介绍少数的几个常用的参数:DWORDBaUdRa0,串U被特率DWORD(Parity:为1的话激活奇偶校收检代DWORDParity:校验方式,值04分别对应无校验、行校验、偶校粉、校验置位、校验清零DWORDByteSize1个字节的数据位个数,范阳是58DWORDStopBits;停止位个数.02分别对应1位、1.5位、2位停止位然后再末尾调用SetCommState就可以了,还是比较方便的.这样可不必构造个完整的DCB站构.SetCommStateO用途:设置用1状态,包括常用的更改率1号、波特率、奇偶校验方式、数据位数等原他B1.SetCOEmState(HAND1.EhFi1.e.1.PDCBIpDCB);参数说明I-hFie:申【1句柄-IpDCB:设莅控制块(DeViCeContrO1.BIOCk)结构地址。要更改的小口参数包含在此结构中。然后调用Se1.cOmmMaSK用来指定程序接收特定的*11Mf1.闺用SetupComm函数,设置*1.1.缓冲区大小:SetCommMask()说明:用途