分享好友 水电电工首页 水电电工分类 切换频道

vc++6.0在串口通信开发方法

2024-07-17 20:50850建材之家
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中串行通信是必不可少的技术,所以掌握串行通信的开发方法具有现实意义。
举报
收藏 0
打赏 0
评论 0
停送电操作指导书
一、 停送电倒闸操作必须听从调度指挥,并与用户取得联系后方可进行。二、 严格执行“电业安全规程”及“两票”制度执行一人操作,一人监护。三、 送电必须按母线侧刀闸、线路刀闸、油开关顺序操作,停电顺序相反,严禁带负荷拉闸。四、 停电后应立即挂好停电标志牌,严防挂错。五、 停电操作必须戴绝缘手套、穿绝缘鞋,站在绝缘垫上。六、 高压设备均为双回路供电,一回使用一回备用,严格执行双回路送电有

0评论2024-10-0448

DCS控制系统和PLC控制系统的区别
1. DCS是一种“分散式控制系统”,而PLC只是一种(可编程控制器)控制“装置”,两者是“系统”与“装置”的区别。系统可以实现任何装置的功能与协调,PLC装置只实现本单元所具备的功能。  2. 在网络方面,DCS网络是整个系统的中枢神经,和利时公司的MACS系统中的系统网采用的是双冗余的100Mbps的工业以太网,采用的国际标准协议TCP/IP。它是安全可靠双冗余的高速通讯网络,系统的拓展

0评论2024-10-0473

Modbus以及Modbus Plus有什么区别?
Modbus是一种通讯结构,广泛应用在智能设备之间进行主-从方式通讯。一个Modbus信息桢包括从机地址、功能码、数据区和数据校验码。正因为 Modbus仅仅定义了通讯结构,所以可以使用RS232、RS422和RS485端口,可以使用光纤、无线等媒质实现通讯。而 Modbus Plus则是一种典型的令牌环网,完整定义了通讯协议、网络结构、连接电缆(或者光缆)以及安装工具等方面的性能指标。

0评论2024-10-0441

继电保护安全措施票
近几年的继电保护事故通报中,由于漏拆、误拆有关连线或漏退、误投有关压板,造成运行开关误掉闸的现象时有发生。从各起事故中总结出,大部分原因是未认真执行现场继电保护安全措施票。下面对某发电厂具体执行继电保护安全措施票的情况作一介绍。 1 继电保护安全措施票的格式 继电保护安 全措施票的格式是参照《继电保护和电网安全自动装置现场工作保安规定》中的格式,并稍加改动 而形成,主要在内容格式上和审批格式

0评论2024-10-0436

双电源供电配电图
双电源供电配电图

0评论2024-10-0452

51单片机CPU的内部结构及工作原理
从上图中我们可以看到,在虚线框内的就是CPU的内部结构了,8位的MCS-51单片机的CPU内部有数术逻辑单元ALU(Arithmetic Logic Unit)、累加器A(8位)、寄存器B(8位)、程序状态字PSW(8位)、程序计数器PC(有时也称为指令指针,即IP,16位)、地址寄存器AR(16位)、数据寄存器DR(8位)、指令寄存器IR(8位)、指令译码器ID、控制器等部件组成。1、运

0评论2024-10-0480

电功率计算公式的灵活变通
现有一个碳膜电阻,其额定电功率为P=1W(瓦),额定电阻为R=100Ω(欧);知道这两个数值后需要计算出这个电阻的额定电流I以及额定电压U。解题:我们知道电功率公式是P=UI,现在我们知道电功率和电阻,所以电功率公式要转换一下,转换计算公式为:P=I²R;但是我们需要计算的是电流,所以I²=P/R,然后把I开方就计算出了电流:电流:然后我们代入上面的公式中,I=1/10

0评论2024-10-0495

电功率计算公式的一些转换公式
为了巩固大家对学习点的理解,这里出一道电功率计算题大家一起做做,题目如标题所示:计算额定电压为220V、额定电功率为45瓦(W)的电灯泡和额定电压220V、电功率为200瓦(W)的电灯泡的额定电流以及灯丝电阻。解题上题中已经给出了两个额定量:电压和电功率,我们只要代入电功率计算公式中即可:45瓦灯泡的额定电流:P=UI,那么I=P/U=45/220=0.204(A)45瓦灯泡灯丝电阻

0评论2024-10-0476

二极管的选用原则
二极管又称晶体二极管,简称二极管(diode),另外,还有早期的真空电子二极管;它是一种具有单向传导电流的电子器件。在半导体二极管内部有一个PN结两个引线端子,这种电子器件按照外加电压的方向,具备单向电流的转导性。一般来讲,晶体二极管是一个由p型半导体和n型半导体烧结形成的p-n结界面。在其界面的两侧形成空间电荷层,构成自建电场。当外加电压等于零时,由于p-n 结两边载流子的浓度差引起扩散电

0评论2024-10-0449

学习单片机的捷径
本人从事单片机相关工作多年,首先是从51系列单片机开始学习的。自己想把学习经验写下来,与大家共同探讨学习单片机的捷径。具体如下:1、学习电子技术基础知识,如电路、模拟电路和数字电路。这是学习电类相关专业的基础。2、学习计算机硬件知识,如计算机的简单组成原理(只需要了解),当然要知道CPU是什么?总线是什么?一些相关概念。3、程序编写的相关知识,主要是汇编语言和C语言。了解结构化语言的程序设计

0评论2024-10-0443