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

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

2024-07-17 20:50460建材之家
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
电气施工图纸会审工作要点
1、要审查设计图纸是否符合相关规范或有关技术质量标准,设计是否合理,考虑经济承受能力和投资取得的回报,设计和选用的产品应是开放型的,便于有条件时系统扩展、互联和信息共享。 2、要根据工程的特点和使用功能,明确业主对其项目的定位和需求。应提供意见和建议与业主,及早协调明确要设置哪些系统,以便所设系统与主体工程同步进行,避免主体完工后再上系统,难于施工,造成对建筑主体结构的破坏,加大返工

0评论2024-11-03305

电流互感器误差计算流程图
按书上的排版方式讲电流互感器误差计算感觉不简洁、不清晰,就做了这个流程图出来,自我感觉不错。欢迎同行指正。

0评论2024-11-03243

PLC编程学习的好处
一、可以提高电脑水平。  学习PLC编程,首先要学会各种PLC、触摸屏软件安装和卸载,打字当然也是必不可少的要求,软件中的菜单的应用相当于把电脑的基础知识好好的学习了一番,一些人用电脑只会用鼠标点击,久而久之,这其实还是电脑盲,而学好PLC编程,键盘鼠标都要配合使用。在电脑硬件方面,电脑配置要求,串口以及外置接口在学习中自然而然学好了。  二、自然而然也学好了英语。  PLC软件里面的指令L

0评论2024-11-03324

发电机定子转子一点接地现象及处理方法
发电机定子一点接地:现象:1) 警铃响,发电机“定子一点接地”光字牌亮;2) 定子绝缘检查,接地的一相电压为零或降低,其余相为线电压或升高。处理:1) 据表计判明是真接地还是假接地;2) 如定子接地保护投了“跳闸”但保护拒动,应立即手动解列发电机;3) 定子接地保护投信号时,如发信应立即查找接地点,接地光字牌设法予以消除;4) 若为真接地,且外部回路设备无明显接地点,应迅速汇报值长、中调,然

0评论2024-11-03271

电梯在维修时的用电安全规定
1.在电梯进行维修或定期检修试车时,必须断开总电源。电梯轿厢内不可载客或装货,同时应在层门口、轿内操纵箱、机房控制柜等处,悬挂“检修停用”、“不许合闸”、“正在修理,不可开动”等内容的警告牌,试车时应有专人统一指挥,根据指挥人员所发的指令,才能摘去警告牌或开动电梯。  2.电梯进行检查、试验、修理、清洁工作时应将机房电源开关断开,以保证安全。  3.电梯检查维修时,必须使用36V以下的安全电

0评论2024-11-03368

高压配电网对于无功补偿的具体应用分析
无功补偿在维持电网运行所需要的足够无功功率之外,能够通过将多余部分的无功功率去除,从而达到对于电网运行环境的优化,目前我国正在大力地推动无功补偿在全面合理的规划及布局基础上的分散补偿的实施,力求推动整个电网的就地平衡。本文下面就针对无功补偿在高压电网中的应用进行一下分析:1)配电网的自动跟踪补偿目前,高压配电网的管理人员主要利用固定及可变阻抗型,这样两种自动补偿的装置来进行无功补偿,其中固定

0评论2024-11-03333

51单片机的上拉电阻一般多大
1、51单片机的p0口为了实现准3态,采用了oc输出,也就是集电极悬空输出,也有叫图腾柱输出的。这种电路结构,只有下拉能力,高电平输出没有电流,在高电平时表现为高阻态;加上上拉电阻,就会失去高阻态,变成 1、0 两态。2、p0口上拉电阻的选择,应遵循基本的电路设计原则,不能盲目套用,要看后级情况而定:例如,后级驱动的是1只npn三极管,这个三极管的放大倍数(β)=100倍,三极管的负载电流(

0评论2024-11-03318

高压负荷开关的灭弧原理和使用注意事项
灭弧原理   (FN3-10R)---利用分闸时主轴带动活塞压缩空气,使压缩了的空气由喷嘴中高速喷出而吹灭电弧的;FN5-10D---有整套灭弧装置的灭弧管构成。(真空管) 特点   A、可以隔离电源,有明显的断开点,多用于固定式高压设备。   B、具有灭弧装置和一定的分合闸速度,在合闸状态下可以通过正常工作电流和规定的短路电路。   C、严禁带负荷接通和断开电路,常与高压熔断器串连使用。(

0评论2024-11-03368

伺服驱动器的高速脉冲指令输入
如果上位机是一高速脉冲指令方式输出,伺服驱动器只能通过差分驱动方式接收脉冲指令。如图:这里务必保证差分输入的电压为5V,否则伺服驱动器的输入脉冲不稳定,会导致脉冲输入丢失现象,或出现脉冲指令取反现象。上位机的5V地必须与驱动器的GND地相连接,以降低噪声干扰。  差分输入方式就是采用差动放大器,如同RS422,RS485通信线路一样。差分驱动器具有较高的操作频率,因此上位机可以传送较高频率的

0评论2024-11-03175

电动机运行中的检查项目
通常,电动机运行时,要监控如下几方面内容:  (1)电动机电流是否超过允许值。  (2)轴承的温度及润滑是否正常。电动机轴承的最高允许温度,应遵守制造厂的规定。无制造厂的规定时,可按照如下标准:①滑动轴承不得超过80摄氏度;②滚动轴承不得超过100摄氏度。  (3)电动机有无异常音响。  (4)对直流电动机和电刷经常压在滑环上运行的绕线式转子电动机,应注意电刷是否有冒火或其他异常现象。  (

0评论2024-11-03214