




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、深入Windows通信编程一、Windows通信机制Windows与 DOS程的重要差别在于Windows程序是消息驱动和设备统一管 理。体现在通信方面,DOS中的寄存器直接读写、BIOS调用和通信中断程序等编 程方法都不能或不宜采用。Windows通过通信驱动程序COMM.DRV硬件接口, 向程序员提供了多达 17个标准函数,功能强大,但也增加了理解和编程的难度。 Windows3.1通信函数主要有:OpenComm 打开一通信设备BuildCimmDCB各一设备定义字符串转变为 DCB数据结构EnableCommNotification 使能或禁止传送 WM_COMMNOTFY息SetCo
2、mmState设置通信设备状态SetCommEve ntMas设置通信事件掩码 ReadCom从通信设备读字符 WriteComm向通信设备写字符 FlushComnt青除一发送或接收队列 GetCommEve ntMas返回通信事件掩码 GetCommState返回设备控制块(DCB) GetCommErro恢复通信设备状态 CloseComn关闭一通信设备DCB数据结构、其它通信函数及各函数的具体用法请参见有关资料。一般Windows通信编程应包括两部分:设备初始化及WM_COMMNOTIF丫消息处理。 设备初始化典型流程如图 1 。图1WM_COMMNOTIF息处理典型流程如图 2。图2
3、 对于大多数实际通信来说 , 可能只需要处理流程图中的一部分。设备初始化及WMCOMMNOT1F息处理两部分密切相关。所有类型 WM_COMMNOT消息的传送都是因为在初始化函数中进行了相应的设置。换言之,可以根据通信的实际情况有选择地设置,控制Windows向应用程序发送 的WM_COMMNOT1F息的数量和类型,以期达到高效、可靠的通信。例如,对于 固定长度消息型的通信可以在 EnableCommNotification 函数中设置 cbWriteNotify 和cbOutQueue参数为消息长度;对于以固定字符结尾的消息型 通信可以在事件掩码中包括EV_RXFLAG, DCB数据结构中的
4、EvtChar变量置为 结尾字符,然后调用SetCommState和 SetCommEventMas函数;对于遵循 V.25bis 之类协议的通信 , 由于用到了大量信号线来作握手信号 , 则事件掩码中 要包含EV_CTS EV_DSR EV_RSL及 EV_RING等;而对于文件传送型的通信,则 宜将 Ope nComi函数中的 cb In Que 和 cbOutQue 变量、En ablecCommNotificati on 中的cbWriteNotify 和cbOutQueue变量设置为较大值,以加快文件传送速度。二、Windows通信疑难探讨 现将笔者在实际编程中遇到的疑难和解决办法描
5、述如下 , 希望对遇到类似 问题的 朋友有所启发。1. 怎样用Windows未提供的波特率通信?Windows提供了由110bps至256000bps共十三种波特率,一般情况下已足够使 用。但在某种特定情况下,例如通信对方使用150bps、又无法要求对方改变波 特率时 ,Windows 通信就比较困难了。首先想到的解决方法是直接调用 BIOS中断14H来设置波特率(DOS提供了 150bps的波特率)。结果是Windows屏蔽了该中断,尝试失败。最后的是采用蒙混过关的办法解决问题的:首先,以任一 Windows支持的波特 率(例如300bps)构造通信参数字符串,调用BuildCommDC产生
6、DCB数据结构; 然后调用SetCommState设置通信参数;最后再调用自编函数直接修改串口通信 寄存器的值。经实验,设置成功,且对Windows程序运行无任何不良 影响。2. 接收数据为何 丢失 ?通过设置 EnableCommNotification 函数中的 cbWriteNotify 参数 ( 在发送WM_COMMNOTF息之前,通信设备驱动程序必须向应用程序出入队列中写入的 字节数),可以使系统每收到固定个字符发出一 WM_COMMNOTW息,这对于固定 长度消息型的通信是很方便的。但实际应用时有时会发生接收数据 丢失 现象 ,即收到WM_COMMNOTIF息后从接收队列读出cbN
7、otify个数据时,发现只有前 面部分数据正确。经检查 , 丢失 现象是由于接收数据超时引起的 , 当通信对方时钟频率较低时 , 规 定时间内收不到 cbWriteNotify 指定的数据量 , 即所谓 超时 ,Windows 照样向 应用程序发送带 CN_RECElVE志的 WM_COMMNOTIFY消息。然后,在应用程序输入队列数据读出之前,Windows不再发送该类消 息。解决的方法是减小 cbWriteNotify 的设定值直到不再发生 超时 现象。 发送数据时同样应正确设定cbOutQue值,以免产生超时现象。如果将 cbWriteNotify 或 cbOutQue设为-1,则 Wi
8、ndows不传送带 CN_RECEIV或 CN_TRANSM标志的 WM_COMMNOTIF息。3. 怎样合理使用FlushComm与GetCommError函数?FlushComm函数的功能是清除指定设备接收或发送队列。 GetCommError函数的 功能是返回指定设备最近错误码和当前状态 , 更重要的是 解锁 功能 : 当出现通 信错误时 ,Windows 会锁死通信端口直到调用 GetCommError。调用FlushComm的时机很重要,如果通信端口发生错误,不调用该函数就有可能 会使接收队列包含不期望的数据 ; 若随便调用该函数 , 也有可能造成尚未读入或 发出的数据丢失。总之 ,
9、 调用该函数要做到 心中有数 。为了合理调用FlushComm和GetCommError函数,建议在事件掩码中包含 EV_ERR 与 EV_BREAK4. Windows 多串口通信Windows最多可支持四个串口的通信,但对于ISA总线的PC,由于其COM与COM3 COM与 COM分别共用IRQ3和IRQ4,所以只能同时使用两个串口。 MCAEISA总线系统没有此限制。如果需要使用的端口不止四个,可以在PC护展槽中加插多用户卡,如美国的 Comtrol、台湾的Moxa(摩莎)等,就可以支持几个到几十个串口 ,加上随卡提供 的Windows驱动程序,就可以进行多串口通信。具体用法请参阅扩展卡
10、说明书。三、Windows通信实例实例的通信环境为:本方COMPAQ 4/5微机,安装中文 Windows3.2;对方为8031 单片机。通信参数设置 : 波特率 150bps, 数据位 8, 停止位 1, 无校验。通信协议 是:对方发FF,本方收到后回0F,对方收到0F后发一条十字节的消息,本方回0F, 结束一次通信。编程环境为中文 Windows32、 Borland C+3.1 OWL。#include#include#include#includeint COM=1;/ 串口号unsigned char ReceiveBuff 11;/ 接收数据缓存_CLASSDEF(TCommApp
11、)class TCommApp: public Tapplicationpublic:TCommApp(LPSTR AName, HINSTANCE hInstance, HINSTANCEHPrevInstance, LPSTR 1pCmdLine, int nCmdshow):TApplication(AName, hInstance, hPrevInstance, 1pCmdLine, nCmdShow);virtual void InitMain Window();_CLASSDEF(TCommWin主窗 口类class TComm Win: public TWindowpublic:
12、TComm Win(PTWindowsObject AParent, LPSTR ATitle):TWindow(AParent, Atitle)int InitCom();void SetBaud();设置Windows不支持的波特率virtual BOOL WMCommNotify(TMessage & Mg)= WM_FIRST+WM_COMMNOTIF; Yvirtual void Setup Window();/该函数设置串口 2的波特率为150bps,若用Windows提/供的波特率通信,则 无须该函数Void TCommWin:SetBaud()asm cli;asm mov d
13、x,2fbh;asm mov al,80h;asm out dx,al;asm mov dx,2f8h;asm mov al,00h;asm out dx,al;asm mov dx,2f9h;asm mov al,3;asm out dx,al;asm mov dx,2fbh;asm mov al,03;asm out dx,al;asm mov dx,2fch;asm mov al,0bh;asm out dx,al;asm mov dx,2f9h;asm mov al,0fh;asm out dx,al;asm mov al,20h;asm out 21h,al;asm sti;int
14、TComm Win:InitCom()char str 20 ,s 2;int COMid,err;DCB dcb;/ 设备控制块UINT Mask=EV_BREAK|EV_ERR|EV_RXFLA事件掩码 strcpy(str,COM);strcat(str,itoa(COM+1,s,10); COMid=OpenComm(str,128,1);if(COMid0) return err;FlushComm(COMid,1); if(!EnableComunNotification(COMid,HWindow,10,-1) return -1;SetCommEventMask(COMid,M
15、ask);return COMid;void TCommWin:SetupWindow()TWindow:SetupWindow();InitCom();BOOL TCommWin:WMCommNotify(TMessage &Mg) UINT flag=0;int id;COMSTAT stat; unsigned char SendChar; static unsigned char *p=ReceiveBuff; static num=0;int ret; id=Mg.WParam; switch(Mg.LP.Lo) case CN_EVENT:有事件掩码中定义的事件发生 flag=Ge
16、tCommEventMask(id,EV_BREAK);if(flag & EV_BREAK) FlushComm(id,1); flag=GetCommEventMask(id,EV_RXFLAG);if(flag & EV_ERR) FlushComm(id,1); flag=GetCommEventMask(id,EV_RXFLAG);if(flag & EV_RXFLAG)/ 收到了事件字符 0xff SendChar=0x0f;WriteComm(id,& SendChar,1);/ 向对方回 0x0f break;case CN_RECEIVE:接收到了规定个字符或超时 do ret=ReadComm(id,p,1); if(ret0)p+; num+; while(ret0)&(num=10)接收完一条消息num=0;/此处处理接收到的消息p=ReceiveBuff;Sen dChar=0x0f;WriteComm(id,& SendChar,1);向对方回 0x0fFlushComm(id,1);break;flag=GetCommError(id,&stat);消除错误(若有)return 1;void TCommApp:l ni tM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 贵州国企招聘2024贵州省水利水电工程咨询有限责任公司招聘16人笔试参考题库附带答案详解
- 软件开发就业报告范文
- IC产业现况与趋势
- 二零二五年度高端个人专利授权合同
- 二零二五年度汽车租赁合伙人入股协议
- 2025年度电力线路维修维保合同
- 农村宅基地互换与农业科技推广协议书
- 二零二五年家庭房产析产分配与财产继承合同
- 2025年度矿山股权转让及矿山矿产资源开发与环境保护合同
- 二零二五年度木质防火门市场拓展与品牌建设合同
- 下肢骨关节损伤课件
- 2023发电企业防汛工作管理办法
- 食品安全风险评估的课件
- 医疗机构资产评估报告
- 复方板蓝根颗粒工艺验证方案大全
- 信息技术拓展模块高职PPT完整全套教学课件
- 《动物王国开大会》说课PPT
- 春玉米套种秋黄瓜技术
- QC成果提高工业厂房基础预埋地脚螺栓的精确度
- 四年级下册劳动技术教案
- 城市轨道交通服务礼仪和意识基本知识
评论
0/150
提交评论