vc 6.0在串口通信开发方法

时间:2023-03-20来源:佚名
1 引言
在当今的工业控制领域,串口通信是计算机与其他设备进行数据通信时经常使用的方法,具有实现简单、使用灵活、数据传输可靠等几个优点,特别是在实时监控系统中得到广泛应用,在我们使用的计算机上使用的串口一般是rs232,使用rs232接口只能进行一对一的通信,然而在工业控制领域往往是一台工控机和多台智能设备进行通信,并且要求传输距离远,因为这些需求,在工控领域一般使用rs485。
在win32下,可以使用两种编程方式实现串口通信,其一是使用mscomm控件,这种方法程序简单,但欠灵活。其二是调用windows的api函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。使用控件的方法在本质上也是使用api进行串口通信,控件只不过是对api的一个封装处理,本文只介绍使用api进行串口通信编程的方法。

2 串口通信的一般步骤
2.1
打开串口
在32位windows中,串口和其他通信设备(如磁盘等)都被作为文件进行处理,在使用前必须先将其打开,为保证串口通信数据传输的可靠性,串口一般以非共享模式打开,也就是在被串口打开后,其他程序不能在去打开此设备。
2.2
配置串口
在使用串口进行数据通信前必须对其进行正确的配置,串口需要配置的主要参数有波特率、数据位、停止位、奇偶校验、收发数据缓冲区大小。除此之外还要对串口进行超时设置,以防止在串口通信时数据传输突然中断而导致读写操作进入无限期等待的状态,设置了超时,如果在指定时间内没有完成所进行的操作,则此操作被自动放弃。
2.3
读写串口
在串口被打开并设置好后,就可以使用串口进行读写数据了,读写数据可以采用同步、异步及事件驱动等多种方式。
2.4
关闭串口
在使用完串口后应该将其关闭,如果没有关闭,该串口会处于打开状态,其他的应用程序便无法打开使用该串口。

3 利用api函数实现串口通信
3.1 打开串口
win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用api函数createfile来打开或创建的。该函数的原型为:
handle createfile( lpctstr lpfilename,
dword dwdesiredaccess,
dword dwsharemode,
lpsecurity_attributes lpsecurityattributes,
dword dwcreationdistribution,
dword dwflagsandattributes,
handle htemplatefile);
各个参数说明如下:
lpfilename:将要打开的串口逻辑名,如“com1”;
dwdesiredaccess:指定串口访问的类型,可以是读取、写入或二者并列;
dwsharemode:指定共享属性,由于串口不能共享,该参数必须置为0;
lpsecurityattributes:引用安全性属性结构,缺省值为null;
dwcreationdistribution:创建标志,对串口操作该参数必须置为open_existing;
dwflagsandattributes:属性描述,用于指定该串口是否进行异步操作,该值为file_flag_overlapped,表示使用异步的i/o;该值为0,表示同步i/o操作;
htemplatefile:对串口而言该参数必须置为null;
3.2 配置串口
在打开通讯设备句柄后,常常需要对串口进行一些初始化配置工作。这需要通过一个dcb结构来进行。dcb结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息。在查询或配置串口的属性时,都要用dcb结构来作为缓冲区。在打开串口后,可以调用getcommstate函数来获取串口的默认配置,该函数获取一个dcb结构体,只要在该结构内对应该先修改dcb结构,然后再调用setcommstate函数以修改后的dcb结构设置串口。dcb主要有以下几个重要的成员:byte bytesize; // 通信字节位数byte parity; //指定奇偶校验方法。此成员可以有下列值://evenparity 偶校验 noparity 无校验//markparity 标记校验 oddparity 奇校验byte stopbits; //指定停止位的位数。此成员可以有下列值://onestopbit 1位停止位 //twostopbits 2位停止位//one5stopbits 1.5位停止位
除了使用bcd设置串口的一些基本参数外,一般还需要设置串口收发数据缓冲区的大小和超时,超时的作用是在指定的时间内没有读入或发送指定数量的字符,读写操作仍然会结束。windows用i/o缓冲区来暂存串口输入和输出的数据,如果通信的速率较高,则应该设置较大的缓冲区。我们可以使用api函数setupcomm设置串口的输入和输出缓冲区的大小,其原型如下:bool setupcomm( handle hfile, // 串口句柄 dword dwinqueue, // 输入缓冲区的大小(字节数) dword dwoutqueue ); // 输出缓冲区的大小(字节数)
关于读写串口的超时设置,windows给我们提供一个专门的结构体commtimeouts,其定义如下:typedef struct _commtimeouts { dword readintervaltimeout; //读间隔超时 dword readtotaltimeoutmultiplier; //读时间系数 dword readtotaltimeoutconstant; //读时间常量 dword writetotaltimeoutmultiplier; // 写时间系数 dword writetotaltimeoutconstant; //写时间常量} commtimeouts,*lpcommtimeouts;
commtimeouts结构的成员都以毫秒为单位。总超时的计算公式是:
总超时=时间系数×要求读/写的字符数+时间常量
例如,要读入10个字符,那么读操作的总超时的计算公式为:
读总超时=readtotaltimeoutmultiplier×10+readtotaltimeoutconstant
通过该结构体windowsapi为我们提供两个函数:getcommtimeouts和setcommtimeouts,前者获取当前的超时设置,后者使用修改后的commtimeouts设置超时,与设置串口阐述类似。
在读写串口之前,还要用purgecomm(…)函数清空缓冲区,该函数原型:
bool purgecomm(
handle hfile, //串口句柄
dword dwflags ); // 需要完成的操作
参数dwflags指定要完成的操作,可以是下列值的组合:
purge_txabort 中断所有写操作并立即返回,即使写操作还没有完成。
purge_rxabort 中断所有读操作并立即返回,即使读操作还没有完成。
purge_txclear 清除输出缓冲区
purge_rxclear 清除输入缓冲区
3.3 读写串口
读写串口使用readfile和writefile两个函数,其原型如下:bool readfile( handle hfile, //串口的句柄 lpvoid lpbuffer, // 保存读入数据的指针, dword nnumberofbytestoread, // 要读入的数据的字节数lpdword lpnumberofbytesread, //实际读入的字节数 lpoverlapped lpoverlapped ); // overlapped,同步为null
bool writefile(
handle hfile, //串口的句柄
lpcvoid lpbuffer, // 要写入数据的地址
dword nnumberofbytestowrite, // 要写入数据的字节数
lpdword lpnumberofbyteswritten, //实际写入的字节数
lpoverlapped lpoverlapped); // 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中串行通信是必不可少的技术,所以掌握串行通信的开发方法具有现实意义。

    相关阅读

    软启动器12个故障代码

    软启动器常见故障问题的故障代码,参考如下: 1、故障代码Err01 故障类容:→断相;说明:主电路任意一相断相。 2、故障代码Err02 故障类容:→过电流;说明:超过额定电流12倍。 3、故...
    2022-11-26

    电动车电池看参数的三种方法,轻松查看电动车电池型号

    新买的电动车电池是什么型号的,很多人并不是很清楚,而在需要换电池时搞不清楚型号就会很麻烦,那么电动车电池规格怎么,怎么来识别电动车电池的型号,与电工天下小编一起来...
    2022-11-30

    电焊机电流调到多少合适,根据焊条大小及焊接对象做调整

    2.5焊条电焊机电流大小应根据焊条的种类来定: 1、一般碳钢焊条焊接电流调到100A左右,不锈钢焊条稍低点。 2、焊方管2.5焊条电流: 60-80A电焊机利用正负两极在瞬间短路时产生的高温电...
    2023-01-09
    电焊机电流调到多少合适,根据焊条大小及焊接对象做调整

    电动机的启动电流如何计算,电动机启动电流计算公式

    有关电动机启动电流的计算方法,三相电机启动电流瞬时是正常的多少倍,电动机的启动电流是额定电流 的多少,电动机 启动电流计算公式与实例,感兴趣的朋友参考下。 电动机启动...
    2022-11-22
    电动机的启动电流如何计算,电动机启动电流计算公式

    【电力用户怎么分级,电力用户分类标准】

    【电力用户怎么分级,电力用户分类标准】 有网友咨询,电力用户怎么分级,针对分级的问题,电力用户分为一级用户至三级用户,那么电力用户分类标准是怎么样的,电力客户分级和...
    2022-12-10
    【电力用户怎么分级,电力用户分类标准】

    插座发出滋滋滋的声音是什么原因

    首先最有可能的原因就是电源线与插座接线端子接触不牢固,而造成的虚接,进而产生电弧也就是我们俗称的电火花,就会发出的滋滋声音。 插座内由于质量问题,电源接线柱与插头触...
    2022-11-10
    插座发出滋滋滋的声音是什么原因

    安装西门子软件时提示重启电脑的解决办法

    在 西门子软件安装 时,比如:WinCC、Step7、SIMATIC NET SQL Server for WINCC等软件,有时候并不是很顺利,经常提示要重启,而且重启之后还是提示重启,一直循环提示,这个问题可以通过下面...
    2023-03-09
    安装西门子软件时提示重启电脑的解决办法

    异步电动机正反转控制plc接线图及梯形图(图文)

    【 异步电动机 正反转控制plc 接线图及梯形图 】 用plc实现异步电动机的正反转控制,如何设计控制线路图,如何分配i/o,都是绘制plc接线图的关键,另外异步电动机正反转控制设计 过...
    2022-12-11
    异步电动机正反转控制plc接线图及梯形图(图文)

    网站栏目