关于读写串口的超时设置,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中串行通信是必不可少的技术,所以掌握串行通信的开发方法具有现实意义。

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查