资源描述:
《VC串行信接口编程.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、基于WindowsAPI的串行通信程序设计在Windows下编写串行通信程序方法有:使用串行通信程序控件MSCOMM.OCX;使用Windows系统提供的有关串行通信API函数;使用其他第三方提供的串行通信控件;……使用API函数实现串行通信,具有通用、灵活、无须第三方控件支持等优点。一、串行通信API函数简介1、打开串口要使用串口,必须先打开串口。在VC++中,打开串口与打开文件使用相同的函数,其原型为:HANDLECreateFile(LPCTSTRlpFileName,//指向串口名称字符串,如“COM1”DWORDdwDesiredAcces
2、s,//访问模式,读、写DWORDdwShareMode,//共享模式,0=独占LPSECURITY_ATTRIBUTESlpSecurityAttributes,//安全属性,NULLDWORDdwCreationDisposition,//创建方式,OPEN_EXISTINGDWORDdwFlagsAndAttributes,//文件属性,0HANDLEhTemplateFile//临时文件句柄,NULL);创建成功,返回串口的句柄。应保存好该句柄,接下来的操作中要用到。2、对串口进行初始设置打开串口后,应设置其工作参数和工作环境。主要为:(1)
3、设置通信的参数串口的参数用一个DCB结构描述。该结构有28个成员,这里仅列出4个关键成员:typedefstruct_DCB{……DWORDBaudRate;//波特率BYTEByteSize;//每个字符的位数BYTEParity;//0=无校验,1=奇校验,2=偶校验BYTEStopBits;//停止位数。0,1,2=1,1.5,2……);一般情况下,未列出的成员可采用系统指定的值。因此,应先得到系统对DCB结构的配置,再按自己的要求修改上述4个成员。下面的程序段是对DCB结构的配置代码样例:DCBMyDcb;//定义DCB结构GetCommSt
4、ate(MyHand,&MyDcb);//得到系统的配置MyDcb.BaudRate=2400;//将波特率改为2400bpsMyDcb.ByteSize=8;//8位数据MyDcb.Parity=0;//无校验位MyDcb.StopBits=1;//1停止位SetCommState(MyHand,&MyDcb);//按新参数配置串口在得到系统的配置值后,也可以用如下函数来修改DCB结构的4个成员:BuildCommDCB("COM1:2400,n,8,1",&MyDcb);其中,字符串中的各字符含义为:COM1:表示串口1;2400:表示波特率为2
5、400bps;n:表示无校验位;8:表示8位数据;1:表示1停止位。(2)设置接收和发送缓冲区的大小在Windows下,用户接收和发送数据的操作形式如下:接收数据系统会自动地将串口接收到的数据存放到内存中的一个接收缓冲区。用户程序只需从该缓冲区得到数据,不必直接访问芯片的数据接收缓冲器。发送数据用户程序只需将要发送的数据写入一个发送缓冲区即可。一旦写入,系统会自动发送出去。因此,用户程序应根据需要设置接收和发送缓冲区的大小。至于接收和发送缓冲区的位置在何处,用户程序不必关心。函数原型:BOOLSetupComm(HANDLEhFile,//串口的句柄
6、DWORDdwInQueue,//接收缓冲区的大小,字节数DWORDdwOutQueue//发送缓冲区的大小,字节数);(3)设置读写超时时间读超时用户程序从接收缓冲区读取数据时,若在指定的时间内未读到数据,称为读超时。写超时用户程序将要发送的数据写入发送缓冲区后。若在指定的时间内未将写入的数据全部发送出去,称为写超时。因此,用户程序应根据实际情况设置读超时和写超时。读/写超时由一个结构来描述,其定义为:typedefstruct_COMMTIMEOUTS{DWORDReadIntervalTimeout;//读间隔DWORDReadTotalTim
7、eoutMultiplier;//读时间系数DWORDReadTotalTimeoutConstant;//读时间常数DWORDWriteTotalTimeoutMultiplier;//写时间系数DWORDWriteTotalTimeoutConstant;//写时间常数}COMMTIMEOUTS,*LPCOMMTIMEOUTS;读超时时间=读时间系数×要读取(接收)的字节数+读时间常数;写超时时间=写时间系数×要发送(写入)的字节数+写时间常数;读操作除了要符合读超时时间外,还应符合:读取的两个字节之间的间隔不能超过读间隔。设置超时的函数为:Se
8、tCommTimeouts(hCom,&TimeOuts);参数为:hCom串口句柄;TimeOuts超时结