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号、波特率、奇偶校验方式、数据位
15、数等原他B1.SetCOEmState(HAND1.EhFi1.e.1.PDCBIpDCB);参数说明I-hFie:申【1句柄-IpDCB:设莅控制块(DeViCeContrO1.BIOCk)结构地址。要更改的小口参数包含在此结构中。然后调用Se1.cOmmMaSK用来指定程序接收特定的*11Mf1.闺用SetupComm函数,设置*1.1.缓冲区大小:SetCommMask()说明:用途I设置串口海信事件.像型:BOo1.SetCOmmMaSk(HAND1.EhF1.,DWORDAvEvtMask);参数说明:-hFi1.e:申11句柄wE5Mask:准备监视的串口事件掩妈该参数行如下信息掩
16、同位(ft:EV_BREAK:收到BREAK信号EVCTSrCTS(ceartoSend)线路发生变化EV_DSR:DST(DataSetReady)线路发生变化EV_ERR:线路状态错误,包拈了CE_FRAMECE_OVERRUN.CE_RXPARITY3钟错误.EV-R1.NG:检泅到振铃信号,EV_R1.SDcD(CarrierDe1.eCt)线路怡号发生变化,EV_RXCHAR:输入援冲区中已收到数据.EVRXF1.AG:使用SetCOmmStateO函数设置的DCB结构中的等待字符己被传入输入/冲区中.EV_TXEMPTY:输出缓冲区中的数抠已被完全送出.还有,串门因为是Vo操作,可
17、能会产生错误,这时候需要用SetCOmmTimeouts()设过超时限制,以诲免M塞现象设置超时设度需要个结构体COMMTIMEOUTS,SetCommTimGouis()BOO1.SetCOmmTimeouts(hCommDev.Ipctmo):1.pctmo指向包含新的超时参数的commtimeouts结构“commtimeouts结构定义如下:Iypedefstruct_COMMTIMEOUTSDWORDReadIntervaITimeout;DWORDReadTotarrimeoutMuItipIier;DWORDReadTota1.Tmeoutsiant;DWORDWriteTota
18、1.TimeoutMuItipIier;DWORDWriteTotaITimeoutconstant;COMMTIMEOUTS.1.PCOMMTIMEOUTS;ReadIntervaITimeout:以京秒为单位指支通信找上两个字符到达之向的最大时间,在ReadFiIe操作其间,收到第一个字符时开始计算时间.若仃意两个字符到达之间的间晶超过这个最大(ftReadFi1.e悌作完成,返回缓冲数据.Otft衣示不用间隔限时.若该成员为MAxDvvoRD-I1.ReadTotarrimeoutconstantf1.iReadTotarTimeoUtMUItiP1.ier成员为零,则指出该操作要立即返
19、回已接收到的字符,即使未收到字符,读操作也瞿返回。ReadToia1.TimeoutMuItipIier:以举秒为单位指定个乘数.该乘数用来计算读操作的总限时时间.每个谈操作的总限时时间等于读悚作所需的字节数与该位的乘枳.ReadTotaITimeoutConstant:以先秒为单位指定一个常数,用于计算读操作的总限时时间.年个操作的总限时时间等于ReadTotarrimeoUtMuItip1.例成员乘以读探作所需字节数再加上该位的和.ReadTota1.TimeoutMuItipIierfnReatfTotaITimeoUtCOnStant成员的仅为0次示议掾作不使用限时时间。WriteTo
20、ta1.TimeoutMuI1.ipIierfWriteTota1.Timeoutconstan1.的意义和作用分别与ReadTota1.TimeoutMu1.tipIier和ReadTotaITimeoutConstant相似,不再,M复.举例:commtimeoutstimeouts;Iimeouts.Read1.nterva1.Timeout=MAXDWORD;IimeoutsReadTota1.TimeoutConsJant=O;timeoutsReadTOtaITimeoutMuftip1.ier-O;timeouts.WriteTotaITimeoutConstant=SO:tim
21、eouts.WrtTota1.TimoutMu1.tip1.er=2000:SetCommTimeouts(mhCom.Stimeouts);这里将Read1.ntervaITimeout设置为鼓火字节数.ReadToiammeoutConstan1.和ReadToja1.TimeoutMuItipIier都设置为0.衣示不设置谈操作由时,也就是说谎操作蝌间完成,不进行等待.谓用PUrgeCOmm械数可以终止正在进行的读写操作,该函数还会消除输入或输出缓冲区中的内容.PurgeComm()说明:功能:终止目的正在进行的诙或写的动作函数览型:BOO1.PurgeComm(HAND1.EhFie,
22、Hhand1.eofcommunicationsresourceDWORDOwF1.agsHactiontoperform);叁数说明;HAND1.EhFi1.eU名称字符;I;dwF1.ags共有四种Hag$:PURGETXABORT:终止目前正在进行的(背景)可入动作PURGE_RXABORr绻正目前正在进行的(背景)读取动作PURGE_TXC1.EAR:f1.ush写入的bufterPURGETC1.EAR:f1.ush读取的buffer实例3:examp1.e3.cp/Iishaoan2009-06-29#inc1.udedows.hWinc1.udeinc1.udeboo1.open
23、port(charportname)”打开小口(HAND1.EhComm;hComm-CreateFie(portname,Vi1114GENERIC_READGENER1.JWRITE,允许读写0.通讯设备必须以独占方式打开0.无安全IS性OPEN_EXISTING,例讯设备己存在0.同步IQ0);通讯设备不能用模板打开if(hComm=三INVA1.ID_HAND1.E_VA1.UE)(CIoseHandIefhComm);returnFA1.SE;)e1.sereturntrue;)boo1.setupdcb(intrate_arg)设置DCB(DCBdeb;injrate=rate_a
24、rg;memset(dcb,O,sizeof(dcb);1.f(!G创COmmSIate(hComm.&dcb)W获取当前DCB配葭returnFA1.SE;HsetDCBtonfiguretheseria1.portdcb.DCBIength=SiZeOf(JCb);Seria1.PortCon1.g7dcb.BaudRate=rate:dcb.Parity-NOPARITY;dcb.fParity=O;dcb.StopBits-ONESTOPBIT:dcb.ByteSize-8;dcb.fOu1.xCtsFkv=0;dcb.fOu1.xDsrFow=0;dcb.fDtrContro-DTR
25、CONTRO1.DISAB1.E;dcb.fDsrSensitivity=0;dcb.fRtsContro=RTS_CONTRO1.DISAB1.E;dcb.fut-O;dcb.f1.X=0:1miscparameters7dcb.fErrorChar三O;dcb.fBinary=1:dcb.fNu1.1.=0:dcb.IAbortOnError三O;dcb.wReserved=O;dcb.Xon1.im=2;dcb.of11.im-4;Jcb.onChar=0x13;dcb.XoHChar=0x19;dcb.EvtChar-O;HsetDCBif(!SetCommState(hComm.&d
26、cb)returnfa1.se;e1.sereturntrue;boo1.setptimeot(DWORDReadIntervaI1DWORDReadTOtaIMuItipIier,DWORDReadTota1.nsant.DWORDWriteTota1.MuItipIier1DWORDWriteTotaIconstant)(COMMTIMEOUTStimeouts;timeou!s.Read1.nterva1.Tmut=Read1.nterva:IimeoutsReadTota1.TimeoutConsJant=ReadTOta1.constant;HmeOUSReadTota1.Timeo
27、u1.Mu1.tip1.ier=ReadTotaIMuItipIier;timeou!s.WrtTota1.TmeoutConstant=WritTota1.constant:timeouts.WriteTotaTimeoutM1.tip1.ier=WriteTotaMu1.tipier;if(ISetCommTimeouts(hCo11m,timeouts)returnfa1.se;e1.sereturntrue;)voidmain()(boo1.open:open-openport(com2);if(ope)PrinHCOPencomportsuccess);i1(setupdct9600
28、)PrintfCsetupDCBsuccess);tf(setuptmeout(0.0.0.0,0)PrinticsetuptimeouJsuccessn*);SetCommMaSk(hComm,EV_RXCHAR);当彳字符在inbuf中时产生这个乎件清除申门的所有操作PurgeComm(hComm,PURGE_RXC1.EAR|PURGE_TXC1.EAR|PURGE_RXABORT|PURGE_TXABORT);SyStem(ause);*programend7第四节读写申口数及关闭申口Win32API函数ReadFiIe和WnteFiIe支持对中行口的读写操作.在调用ReadFiIe和
29、WriteFiIe之时,戏程应该调用C1.earCommError响数清?情设标志,该函数负价报告指定的惜误和设得的当前状态.C1.earCommEor()用途:消除出门错误或者读取申”现在的状态原型:B1.C1.earCommError(HAND1.EhFite,1.PDWORDIpErrors.1.pcomatatpstat);参数说明:-hFi1.e:申口句柄-IpErrors:返回错i关数值,错误常数如下:1CE_BREAK:检测到中断信号.意思是说检测到某个字节数据缺少合法的停止位.2-CE_FRAME:硬件粒测到帧错误.3-CEJOE:通信设备发生输入/输出情说。4CE.M0DE:
30、设置模式筋误,或是hFi1.e假忸误,5CE_OVERRUN:渣出错误.缓冲区容艮不足.数抠将丢失.6-CERXOVER:溢出错误。7CE_RXPARITY:幔件怜杳到校验位忸误.8C&JXFU1.1.:发送缓冲区已满.-IPStat:指向通俗沸门状态的结构变址,原里如F:typedefstruct_COMSTAT!DWORDCb1.nQUe:输入爆冲IX中的字节数DWORDCbOUIQUey/输出锻冲区D的字节数)COMSTAT.1.PCOMSTAT;该结构中对我们很爪要的只有上面两个参数,其他的我归可以不用管,假如当前中口中有5个字节数据的话.那么执行完CIearCOmmError()的数
31、后,ComStat结构中的ComStat.CbInQue将被加充为5.比位在ReadFiIe函数中,U被直接利用.例如:COMSTATComStat;DWORDdwError=0;C1.earCommError(hComm,&chvError,&ConiStat);上式执行完后,ComStat.CbInQue就是李U中当前含有的数据字节个数.我暂利用此数位就可以用ReadFi1.e。函数去诙串口中的数据.函数ReadFi1.e和WriteFiIe的行为还受是否使用异步I。OVer1.apped)及通信超时设W的再耽fUj1.i读写的同步、异步方式是在打开端I的同时给dwG1.agsAndAtt
32、ributes参数传入适的供而设定的.WhteFi1.eO用途I向用口写数据除型:Boo1.MiteFi1.e(HAND1.EhFg1.PCVOIDIpBuffer.DWORDnNmberOfBytesToWrite,1.PDWORDIpNumberOfBytesWrinen,1.pover1.appedIpOVerIaPPd):参数说明:hFMr串口旬柄-IpBuifer:待写入数据的苜地址FNumberOfBytesToWrite:待。入数据的字节数尺度-IPNUmbeQByteSWntten:函数返回的实际写入I的数据个数的地址,利用此变玻可判断实际写入的字节数和准备写入的字节数是否相I
33、n1.-IpOver1.appedjftI1O结构的指针ReadFiIeO用途:读中口数据原型:Boo1.ReadFiIefHAND1.EhFi1.e,1.PVOIDIpBuffer,DWORDNumberOfBytesToRead,IpNumberOfBy1.esRead.IpOverIapped);参数说明:-hFi1.e:中11句柄-IpBuHer:存储被读出数据的首地址nNumberOfBytesToRead:准备读出的字节个数-NumberOfBytesRead:实际读出的字节个数-IpOver1.apped:步I/O结构在同小方式下,调用ReadFiIe或WriteFi1.e后,当
34、实际读后操作完成或发牛:超时时才返回调用程序.而用步方式函数在扇动接收或发送过程后立即返可,程序继续向卜执行,程序在调用ReadFi1.e和WriteFiie时必须提供一个OVer1.aPPed数据结构指计,该结构中包含一个手动力件同步对象,其后的程序必须借助于该事件同生对象,完成数据的接收和发送过程.通信端口的超时设置对读写的处理方式也会产生影响.如果谓用读写函数时发生福口超时.W1.读号函数立即返回并返回己传粕的数据字节数,ReadFiIe函数只要在中行1.1.输入馔冲区中读入指定数盘的字符.就算完成操作.而WrgFiIe函数不但要把指定数*的字符拷入到输出缓冲中,而I1.要等这些字符从中
35、行口送出去后才W完成操作.如果不再使用某-SffiU.须将该稿U关闭,以使其他程序可以怏用该端口。如果不显式关闭某筛口,当程序退出时打开的端口也将被自动关闭.但为了安全起见,以好足显式的关闭它.关闭申口的语句为CIoseHand1.eO.C1.oseHand1.eO用途:关闭串口原胎B1.CIoseHandIefHAND1.Ehbjedt)说明:-hObjedt:串口句柄拣作说明:成功关闭申门时返回true,否则返RHaISe当ReadFiIe和WriteFiIe返回FA1.SE时,不定就是操作失败,战程应该谢刖Get1.astError函数分析返回的结果,例如.在重役操作时如果操作还未完成函
36、数就返回.那么函数就返回FA1.SE.而HGet1.aStErrOr函数返W1.ERRORJO_PENDING,如果Get1.aStEgr函数返网ERRoRIOPEND1.NG,则说明近林操作还未完成,设程可以等待操作完成,有两种等恃办法:一种办法是用嵌WaitFOrSing1.eObjeCt这样的等待函数来等价OVER1.APPED结构的hEvent成员,可以规定等待的时间,在等件函数返回后.调用GetoVenaPPedReS3t.另种办法是调用Getover1.appedResuII函数等待,如果指定该帧数的bWat参数为TRUE.那么该函数将等价OVER1.APPED结构的hEvent小
37、件,GetgerIappedResuIt可以返回一个OVER1.APPED结构求报告包括实际传输字节在内的*花操作结果.如果规定了读/写操作的Si时,那么当超过规定时间后,hEvent成员会变成有信号的.因此,在必时发生后,WaitForSingIeObjcct和GetoverIappedResuIt郴会结束等待,WaitForSingIeObject的dwMMSeCOndS参数会规定一个等待超时.该函数实际等待的时间是两个超时的鼓小值.注理GetoVerIaPPedReS川不能设血等待的时限.因此如果hEvent成员无信号,则该函数珞A等待下去GetoverIappedResuIt函数调用方
38、法如下:BOO1.GetOver1.appdRsu1.1.(HAND1.EhFi1.e./H1.CreateFite获得的文件句柄1.pover1.appedIPoVedaPPed.指向个在启动IH兆操作时指定的OVER1.APPED结构(即读写函数中指定的Over1.apped结构)1.PDW0RDIPNUmberOfByteSTranSferred,交际传输的字15数B1.bWai1.,是否等将悬挂的陋价操作完成,若为TRUE.则此函数直到操作完成后才返回.);OVER1.APPED结构定义如下:typedefstructOVER1.APPED(DWORDInterna1.:DWORDIn
39、terna1.High;DWORDOffset;DWORDOffsetHigh;HAND1.EhEvnt;OVER1.APPED;如果采用异步方式,则在调用ReadFne或WriteFiIe函数时必需指定一个OVerIaPPGd结构.调用后程序可淮续执行其它操作.在合适的施方再调用函数GetoverIappedResuIt判断井步点登操作是否完成(判断OVER1.APPED结构中的hEvent是否被靴位).WaitCommEventO用途:用来判断用SetCommMaSkO函数设置的用11通俗事件是否已发生.原型;Boo1.vVaitCOmmEVent(HAND1.EhFHe,1.PDW0RD
40、IpEvtMask11.pover1.appedIpOVer1.aPPed);参数说明IhF1.1.e:串口句柄-IPEVtMaSk:函数执行完兀如果检测到率I1.通f;i事件的话就将其写入该参数中.-IpOver1.apped:异步结构,用来保存异步操作结果,当由Se1.CommMaSk函数所指定的事件产生时这个函数将返回TRUE.注:在用api函数抵写串【I通信函数时大体上有两种方法,种是直寻法,另外种是装件通知法.这两种方法的区别在于收即口数据时.前一种方法是主动的冏期性的杳词串口中当前有没有数据:后种方法是事先设过好能要监视的HM1.通俗事件,然后依叔取独开设的辅助战程进行监视该事件是
41、否已发生,如果没有发生的话该战程就一直不停的等恃直到该事件发生后,将该串口事件以消息的方式却知主窗体,然后主窗体收到该消宓后依据不同的事件性质进行处理.比如说当主窗体收到监视找程发来的RX-CHAR(串”中行数据)的消息后,就可以用ReadFiieo函数去读串口.实例4:广eamp1.e4.cpp*/IiShaoan2009-07-107/inc1.udeinc1.udeWinc1.udeHAND1.EhComm;OVER1.APPEDmov:COMSTATcomstat;DWORDm-dwCommEvents;boo1.opeport(char,portnameWiJF个申(IhComm-C
42、reateFiIefportname,GENERIC_READGENER1.JWRITE.O,O.OPEN_EXISTING,F1.1.JF1.AG.OVER1.APPED,0):if(hComm=INVA1.ID_HAND1.E_VA1.UE)returnFA1.SE:e1.sereturntrue:)boo1.setpdcb(intrate_arg)DCBdeb;i11trate-ratearg;memseH&dcb.O,StZeOf(dcb);if(!GetCommState(hComm,&dcb)W获取当前DCB配置(returnFA1.SE:/setDCBtoconfigurethe
43、seria1.portdcb.DCBIeng1.h=SiZeOf(deb):Seria1.PortConfig7(Jcb.BaudRate=rate;dcb.Parity=NOPARITY:dcb.fParity=O;dcb.StopBits=ONESTOPBIT;dcb.ByteSze=8;dcb.fOuJxCtsFow=0;dcb,KutxDsrF1.ov/-0:dcb.fDtrContro1.=DTR_CoNTRo1.DISAB1.E;dcb.fDsrSesitivity=O;debJRtsControI-RTSCONTRO1.DISAB1.E;dcb.fOutX=0:dcb.1.1.n
44、X三O;miscparameters7dcb.fErrorChar=O;dcb.!Binary=1;dcb.fNu1.1.-O;deb.fAbortOnError=0:dcb.wReservd=O;dcb.Xon1.im三2;dcb.Xoff1.im=4;dcb.XoChar=0x13;dcb.offChar三0x19;Jcb.EvtChar=0:HsetDCBif(SetCommState(hComm.dcb)(returnfa1.se;e1.sereturntrue;)b1.setuptmeot(DWORDReadIntervaI1DWORDReadTOtaIMuItipIier.DWORDReadTota1.nstant,DWORDWriteTota1.MuItipIier1DWORDWriteTota1.constant)(COMMTIMEOUTStimeouts:timeouts.ReadntervaTimeout=Readnterva:timeouts.ReadTota1.TimeoutCostant=ReadTota!constant;Iishaoan29O7-1O/*/inc1.udeWinc1.udeinc1.udeVWirXjOWs.h/inc1.udeHAND1.EhComm;OVER