关于读写串口的超时设置,windows给我们提供一个专门的结构体commtimeouts,其定义如下:typedefstruct_commtimeouts{dwordreadintervaltimeout;//读间隔超时dwordreadtotaltimeoutmultiplier;//读时间系数dwordreadtotaltimeoutconstant;//读时间常量dwordwritetotaltimeoutmultiplier;//写时间系数dwordwritetotaltimeoutconstant;//写时间常量}commtimeouts,*lpcommtimeouts;
commtimeouts结构的成员都以毫秒为单位。总超时的计算公式是:
总超时=时间系数×要求读/写的字符数+时间常量
例如,要读入10个字符,那么读操作的总超时的计算公式为:
读总超时=readtotaltimeoutmultiplier×10+readtotaltimeoutconstant
通过该结构体windowsapi为我们提供两个函数:getcommtimeouts和setcommtimeouts,前者获取当前的超时设置,后者使用修改后的commtimeouts设置超时,与设置串口阐述类似。
在读写串口之前,还要用purgecomm(…)函数清空缓冲区,该函数原型:
boolpurgecomm(
handlehfile,//串口句柄
dworddwflags);//需要完成的操作
参数dwflags指定要完成的操作,可以是下列值的组合:
purge_txabort中断所有写操作并立即返回,即使写操作还没有完成。
purge_rxabort中断所有读操作并立即返回,即使读操作还没有完成。
purge_txclear清除输出缓冲区
purge_rxclear清除输入缓冲区
3、读写串口
读写串口使用readfile和writefile两个函数,其原型如下:boolreadfile(handlehfile,//串口的句柄lpvoidlpbuffer,//保存读入数据的指针,dwordnnumberofbytestoread,//要读入的数据的字节数lpdwordlpnumberofbytesread,//实际读入的字节数lpoverlappedlpoverlapped);//overlapped,同步为null
boolwritefile(
handlehfile,//串口的句柄
lpcvoidlpbuffer,//要写入数据的地址
dwordnnumberofbytestowrite,//要写入数据的字节数
lpdwordlpnumberofbyteswritten,//实际写入的字节数
lpoverlappedlpoverlapped);//overlapped,同步为null在进行同步操作时,读写函数要等到执行完才返回,而在异步操作时函数立即返回,但不保证读写操作完成,这时候就需要使用overlapped结构进行异步控制,该结构体有一个重要的成员hevent,该成员是windows事件对象的句柄在控制线程同步及异步操作时常用到,如果是异步操作,我们可以使用createevent(…)创建事件对象并将返回值赋给hevent,然后使用waitforsingleobject或getoverlappedresult等待读写操作完成,进而达到控制异步操作的目的。3.4关闭串口在不使用串口的时候应该将其关闭,以释放windows的资源供其他程序使用,关闭串口只需调用closehandle(hcomm/*串口句柄*/)即可。4串行通信在世纪星组态软件中的应用作为通用的组态软件,世纪星要与其他plc、智能仪表等设备进行通信,串行通信是主要的方式之一,基于前面所述使用api进行串行通信开发的优点,并考虑程序开发的便捷和可重用等,在世纪星中,我们将串行通信api进行封装,以类的方式对串口进行操作,其中打开串口及配置串口参数的操作我们通过可视化窗口进行设定,然后在封装类中实现,相关的操作处理读写数据外基本都已实现,因为不同的设备有不同的协议,因而读写串口的操作在驱动程序中完成,这样我们的开发人员就不必关注太多其他的相关操作,只需根据实际设备重写读写串口的成员函数即可。5结论windows是当前应用程序开发的主流平台,vc++6.0是该平台强大的开发工具,使用windowsapi开发串口通信的程序可是使我们更加清晰的了解串口通信的机制,并且开发人员可以根据需要使用api进行灵活的程序设计,在scada中串行通信是必不可少的技术,所以掌握串行通信的开发方法具有现实意义。