H2003032069_王宇栋_一个Windows下基于电话线路的数据通信程序的设计与实现_第1页
H2003032069_王宇栋_一个Windows下基于电话线路的数据通信程序的设计与实现_第2页
H2003032069_王宇栋_一个Windows下基于电话线路的数据通信程序的设计与实现_第3页
H2003032069_王宇栋_一个Windows下基于电话线路的数据通信程序的设计与实现_第4页
H2003032069_王宇栋_一个Windows下基于电话线路的数据通信程序的设计与实现_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

分类号 分类号 TP311 1TP311 1 U U D D C C D10621 408 2007 5992 0D10621 408 2007 5992 0 密密 级 公级 公 开开 编编 号 号 20030320692003032069 成成 都都 信信 息息 工工 程程 学学 院院 学学 位位 论论 文文 一个一个 WindowsWindows 下基于电话线路的数据通信程序的设计与实现下基于电话线路的数据通信程序的设计与实现 论文作者姓名 论文作者姓名 王宇栋王宇栋 申请学位专业 申请学位专业 网络工程网络工程 申请学位类别 申请学位类别 工学学士工学学士 指指导导教教师师姓姓名名 职职称称 刘云本刘云本 论文提交日期 论文提交日期 20072007 年年 6 6 月月 9 9 日日 一个一个 WindowsWindows 下基于电话线路的数据通信程序下基于电话线路的数据通信程序 的设计与实现的设计与实现 摘摘 要要 电话网络是最大的通信网络 但是我们通常只是用来进行语音传输 为了 更好的发掘电话网络的潜力 以及解决一些在没有互联网地区的数据的传输需 要 开发一种可以通过电话线路进行数据传输的软件是很有必要的 微软的电话应用程序接口 TAPI 是一种标准的应用程序接口 API 使 得个人电脑能够通过运行微软的 Windows 系统来使用电话服务 TAPI 里面封装 了所有的对 MODEM 进行操作的 AT 指令 从而我们只需要调用 TAPI 的函数而不 需要知道底层的具体操作就可以执行一个呼叫和应答一个呼叫 以及其他的线 路操作 从而快速开发出一个基于 Windows 平台的通过电话线路进行数据传输 的程序 本文介绍了开发次程序需要的理论基础包括 Windows 平台软件开发的基础 TAPI 的概述 TAPI 的基本概念 详细的介绍了软件开发的的思路和流程 阐述 了整个呼叫的生命周期内的线路上所产生的状态消息 以及依据这些消息而应 该进行的具体操作 根据软件开发的思路的指导以及整个线路消息为程序开发 的脉络 本文最后介绍了一个可以在 Windows 下面拨打对方的电话号码 当双 方连通后可以通过电话线路进行数据传输的程序的编码开发过程 并且最后程序 进行了测试 关键词 关键词 Windows 电话线路 数据通信 TAPI The Design and Implementation of a Telephone Line Based Communication Program in Windows Operating System Abstract The telephony network is the largest communications network and it s generally used for voice transmission To better utilize the advantages of the telephony network and meet the need of data transmission in places where Internet is inaccessible it is definitely necessary to develop a software which could transmit data over existing telephone lines Microsoft s telephone Application Program Interface TAPI a standard application program interface API can help personal computers running Microsoft s Windows system to take use of telephone services TAPI has encapsulated all AT commands for MODEM operation which will only need users to call the TAPI function to initiate and answer a call rather than to know the detail operation on the implementation nor other operations on the lines This would largely help to develop a program through telephone lines for data transmission on a Windows based platform The paper firstly describes the theoretical basis for the development of sub programs including the software development basis on Windows platform TAPI overview and its basic concepts The paper then describes the detail ideas and processes on the software implementation The paper also represents an entire call life cycle with its possible state messages and the corresponding operations needed Finally on the one below in the Windows Call each other s phone numbers when the two sides can connect through telephone lines for data transmission procedures for the development of the coding process and in the final process of the test Key words Windows telephone lines data Communications TAPI 目目 录录 论文总页数 17 页 1前言 1 2设计开发的基础理论 1 2 1WINDOWS SDK 简介 1 2 2WINDOWS 程序的基本结构 1 2 2 1概述 1 2 2 2消息处理函数 1 2 2 3窗口的建立 2 2 2 4消息循环 2 2 3MODEM 的控制 3 2 4TAPI 通信编程 3 2 4 1TAPI 的含义 3 2 4 2TAPI 的体系结构 4 2 5TAPI 的基本概念 4 3程序设计思想与流程 6 3 1使用 TAPI 开发的基本思路 6 3 2各功能模块的设计 8 3 2 1TAPI 的配置阶段 8 3 2 2TAPI 的连接阶段 8 3 2 3数据传送阶段 9 3 2 4关闭连接阶段 10 4编码实现 10 4 1程序主类的的定义 10 4 2线路操作的实现 11 4 3呼叫的发起和应答的实现 12 4 4数据操作的实现 13 5软件测试 14 结 论 14 参考文献 14 致 谢 16 声 明 17 第 1 页 共 17 页 1 1前言前言 当今计算机网络十分普及 但仍有不少地区无法安装网络 相比之下电话 线网比 internet 发达很多 我们用的宽带也是在电话线网的基础上建立起来的 因此在网络不发达地区 在无网络的情况下能用电话线进行数据通讯就十分有 意义了 用电话线进行数据通讯不仅可以方便的接收和发送数据 比起 internet 数据通讯 安全性也是非常可靠的 MODEM 曾经被广泛用于拨号上网 通过几年的迅速发展 已经取得了极大的成功 随着技术的发展和认识的提高 人们拓宽了 MODEM 的应用领域 把它用于远程数据通信 MODEM 能从计算机接 收串行数据 通过 PSTN 电话网传送给另一端的 MODEM 所以使用 MODEM 可以 实现两台远程计算机的互联 就像组成一个广域网络系统一样 当两台计算机 通过 MODEM 拨号连接成功后 它们之间的通信就像串行通信一样方便 2 2设计开发的基础理论设计开发的基础理论 2 12 1 Windows SDK 简介简介 SDK 即 software develope kit 软件开发工具包 它包含了进行 Windows 软件开发的文档和 API 函数的输入库 头文件 因为 API 在动态链接 库中 这些动态链接库是系统的组成部分因此不用再提供 而输入库和头文件 则必须 这样才能在你的程序中使用 API 函数 早期 SDK 是一个单独发放的包 现在在 Visual C 和其他一些开发环境中已经包含了它 SDK 编程就是直接调 用 Windows 的 API 进行编程 API 由上千个 API 函数组成 2 22 2 WindowsWindows 程序的基本结构程序的基本结构 2 2 12 2 1 概述概述 Windows 程序具有相对固定的结构 对编写者而言 不需要书写整个过程 大部分过程由系统完成 程序中只要按一定的格式填写系统留给客户的那一小 部分 所需要完成的有 窗口类的定义 窗口的建立 消息函数的书写 消息 循环 2 2 22 2 2 消息处理函数消息处理函数 Windows 程序是事件驱动的 对于一个窗口 它的大部分例行维护是由系 统维护的 每个窗口都有一个消息处理函数 在消息处理函数中 对传入的消 息进行处理 系统内还有它自己的缺省消息处理函数 客户写一个消息处理函数 在窗口建立前 将消息处理函数与窗口关联 这样 每当有消息产生时 就会去调用这个消息处理函数 通常情况下 客户都不会处理全部的消息 而是只处理自己感兴趣的消息 其他的 则送回到系统的缺省消息处理函数中去 第 2 页 共 17 页 消息处理函数的原型如下 参数 窗口句柄 消息 消息参数 消息参数 LRESULT CALLBACK WndProc HWND hwnd UINT message WPARAM wParam LPARAM lParam 处理感兴趣的消息 switch message case case 其他消息交给由系统提供的缺省处理函数 return DefWindowProc hwnd message wParam lParam 2 2 32 2 3 窗口的建立窗口的建立 客户需要自己建立窗口 建立后会得到系统返回的窗口句柄 HWND 后继的 针对窗口的操作都针对句柄进行 1 注册窗口类 建立窗口前 需要制定好这个窗口的相关属性 最主要的就是将自己定义 的消息处理函数与窗口关联 其他的属性还包括 菜单 图标等等 这个属性 指定步骤是通过指定 窗口类 来完成的 对于自己建立的窗口 这个 窗口类 需要自己制定 也即自己填充一个 WNDCLASS 结构 然后向系统注册 对于一些 特殊窗口 如按钮等控件 他们的行为是系统制定好了的 所以不需要自己注 册 直接使用对应的 窗口类 名称就行了 2 建立窗口 建立窗口时 注册的 窗口类 名称作为参数传入 这样 当有针对该窗口 的消息时 将调用 窗口类 中指定的消息处理函数 在其中得到处理 2 2 42 2 4 消息循环消息循环 系统会将针对这个程序的消息依次放到程序的 消息队列 中 由程序自 己依次取出消息 在分发到对应的窗口中去 因此 建立窗口后 将进入一个 循环 在循环中 取出消息 派发消息 循环往复 直到取得的消息是退出消 第 3 页 共 17 页 息 循环退出后 程序即结束 2 32 3 MODEMMODEM 的控制的控制 目前模拟电话线路被广泛用于数据传输 调制解调器 MODEM 被用来实现数 字信号到模拟信号和模拟信号到数字信号的相互转换 MODEM 通过 PSTN public switched telephone network 公用交换式电话网 来传输数据 目前 计算机控制调制解调器有两种方法 一种方法是向 MODEM 发送 AT 指令 另一 种方法是使用 TAPI telephony application programming 即电话应用程序接 口 AT 指令集是由 Hays 公司首先推出的用于控制自己开发的 smart modem 系 列产品的命令集合 AT 命令集推出后得到广泛的应用 很快其它生产调制解调 器的公司也都使用与 Hays 公司 AT 指令集兼容的 AT 指令集 开发者利用串行 通信 API 再加上基本的 Hays 兼容的 AT 命令 就可以实现对 MODEM 的控制 但这种方法在 windows 中用起来很不方便 原因如下 许多 MODEM 制造商已向 标准的 AT 指令集中添加了许多变种 这就使应用程序与市售的所有 MODEM 保 持完全兼容很困难 而 Windows 维护了一个数据库 其中包含了商用调制解调 器以及每个 MODEM 支持的 AT 命令集变种 使用 TAPI 则可以访问该数据库 所以使用标准 TAPI 函数生成呼叫和控制 MODEM 的应用程序不需要知道 AT 命令 集的详细内容 2 42 4 TAPITAPI 通信编程通信编程 2 4 12 4 1 TAPITAPI 的含义的含义 计算机电话集成 Computer Telephony Integration 缩写 CTI 是计算机 技术和电信技术相结合的产物 电子通信行业配备了各种各样的硬件系统 仅 仅收集这些系统的标准 文档和接口规范就是很复杂的任务 要设计一个考虑 所有情况的任务就更加困难 为了减轻开发者的负担 Microsoft 公司和 Intel 公司联合起来创建了 Windows Telephony API TAPI 给应用程序编程者提供一 个接口 并且允许应用程序无需改变就可以适应多种多样的电信系统 TAPI 是 Microsoft 公司的 Windows 开放式服务结构中的一部分 它包括 两个接口 开发人员使用的应用程序接口和用于连接某种电话网络的接口 TAPI 为通信应用程序提供控制通信的功能 包括数据 传真 语音 以及处理 计算机与电话网之间的信号灯 TAPI 服务为通信应用程序提供了一种与设备无关的方法 避免了使用 AT 指令直接访问硬件可能造成的冲突 并且让应用程序可以与包括数字综合服务 网 Intergrated Services Digital Network 在内的各种通信网络通信 同 时还提供了访问通信端口和设备的通用机制 这样 多个应用程序就可以共享 这些设备 TAPI 管理对各个设备的访问 让通用程序协调使用这些设备 TAPI 第 4 页 共 17 页 的设计本身是可以扩展的 从而可以满足未来通信网络多方面的需求 2 4 22 4 2 TAPITAPI 的体系结构的体系结构 图 1 是 TAPI 体系结构示意图 作为中间层的 TAPI DLL 提供对服务提供者 的管理 并在服务提供者与应用程序之间进行信息传递 TAPI 可以保证多个服 务者和应用程序能够同时存在 并且不会发生相互冲突 图 1 TAPI 的体系结构 在底层将 TAPI 和实际的电话硬件连接是 TAPI 服务提供者 TAPI Service Provider 缩写为 TSP TSP 一般都由硬件生产厂商提供 2 52 5 TAPITAPI 的基本概念的基本概念 1 设备 ID 设备 ID 是从零开始按顺序分配给每个设备的 ID 也就是说 如果安装了 4 个线路设备 这些线路没备的设备 ID 相应为 0 1 2 3 2 长度变化的数据结构 TAPI 使用的大多数的复杂数据结构是变长的数据结构 这些结构的组织如 图二所示 最前面 l 的 3 个域分别是 dwTotalsize dwNeededsize 和 dwUsedSize 在这三个域后面是固定长度的域 对每个给定的结构类型固定长 度的域都具有同样的长度 一般而言 长度范围从 0 到 300 个字节或者更长字 节的结构 存储在结构中的可变部分的信息总是通过相对于结构定长部分的一 个偏移量来引用 以字节为单位的偏移量指出变长数据的起点的位置 信息量 大小就是变长数据所占用的字节数 其大小包括字符串末尾的空字符 这些结构的内存总是由应用程序分配 但是数据结构需要多大的内存空间 应用程序并不总是知道 这就是设置前三个域的原因 将结构传送给 TAPI 之 前 应用程序可使用缓冲区的大小填充 dwTotalsize 域 TAPI 首先证实该结 构有足够大空间容纳其定长部分 然后填充定长域 接着填入变长项 TAPI 填入变长项直到没有空间为止 最后 TAPI 用为获得所有数据所需的空间量来填 充 dwNeededsize 域 而 dwUsedsize 域用 TAPI 实际使用的空间量来填充 第 5 页 共 17 页 当应用程序得到该结构时 它首先应该检查 dwNeededsize 助和 dwUsedSize 域 如果两者相等 TAPI 就能够找出用于所有变长数据的控件 如果 dwusedsize 小于 dwNeededsize 应用程序可以检查相应的偏移量和域大小看是否有需要 的变长数据 如果这些数据域都被设置为零 那么应用程序必须分配一个更大 的缓冲区并且重试上述过程 图 2 TAPI 所用到的数据结构 3 逻辑线路设备 线路 Line 指的是物理电话线路 线的终端位置一般称为站 station 线路设备 Line device 是任何连接计算机到电话线或者线路的物理设备 如 调制解调器或 ISDN 卡等 线路设备不必位于应用程序运行的计算机上 逻辑线路设备 logical line device 代表一根电话线 逻辑线路设备的 性能取决于它所代表的实际电话线的性能 典型的电话线路称为 POTS Plain old Telephone service 普通老式电话服务 在 Windows 中 POTS 线通过单 一逻辑线路设备表示 一些数字电话线 例如 ISDN 包含了多个 信道 或 者信息通路 可用来同时传送不同类型的数据 这些多信道数字线路通常由多 逻辑线路设备表示 一个逻辑线路设备代表一个信道 逻辑电话 Logical phone 表示电话 一部典型的电话包括叉簧和转换器组成 叉簧是可以将电话 与线路连接或挂断的开关 转换器是一种由扬声器和话筒组成的设备 话筒可 以将声能转换为电能 或将电能转换为声能 4 地址 第 6 页 共 17 页 地址 Address 是字母 数字和控制字符组成的字符串 它们定义到电话 调制解调器或计算机的路径 线路 电话和地址是静态的 他们有一定程度的 持久性 线路或与计算机连接的电话不经常改变 线路的电话号码也一样 5 呼叫 呼叫 call 是当两个线路设备由电话网络连接在一起时存在的一种交互状 态 呼叫方 calling party 是发起呼叫的一方 而被呼叫方 called party 则 是应答呼叫的一方 对呼叫可以进行连接 置于保持状态以及传送 召开会议 暂停 恢复等操作 每个呼叫在期生存期都会经历许多状态 在呼叫改变状态时 Windows 会 通知控制应用程序 呼叫状态包括 DAILTONE RINGING 和 CONNECTED 等 在这 几个状态中 CONNECTED 状态尤为重要 因为一旦呼叫转换到这种状态 数据 就可以通过线路发送出去 到达信宿方 已经拆接的呼叫和还没有开始的呼叫 所处的状态都是 IDLE 3 3 程序设计思想与流程程序设计思想与流程 3 13 1 使用使用 TAPITAPI 开发的基本思路开发的基本思路 使用 TAPI 能够比较方便地发出一个呼叫和应答一个呼叫 它对呼叫的操 作简单方便 给开发者带来了很大的方便 总的来说使用 TAPI 开发 MODEM 呼 叫控制通信程序流程如下所示 1 初始化 TAPI 通过调用 linelnitialize 函数来完成 TAPI 通 过调用这两个函数来加载 Tapi32 dll 和有关的电话设备驱动程序 并且指定 检测线路设备的状态和事件的回调函数 2 协商 TAPI 版本 IineNegotiateAPIVersion 函数将找出对应于用 户的应用程序及线路设备服务者通用的 TAPI 的最高版本 3 获取线路设备的性能 应用程序通过调用 lineGetDevCaps 函数来 确定所使用的 TAPI 版本提供的线路设备能力 4 打开线路设备 应用程序调用 lineOpen 函数打开一条线路设备并 返回一个线路设备的句柄 这个句柄用于完成以后对这个设备的各种操作 5 转换电话号码 使用 lineTranslateAddress 将要拨打的号码转换 成可以直接在计算机上拨打的号码格式 6 开始呼叫或是应答 应用程序调用 lineMakeCall 函数进行呼叫 调用完成后它将返回带有拥有者特权的呼叫句柄 此句柄可用在对该次呼叫所 进行的进一步操作 应用程序通过调用 lineAnswer 函数来自动应答呼叫 7 挂断呼叫 在呼叫完成后 lineDrop 函数将用来挂断呼叫 但是 在上一步中得到的拥有者的呼叫句柄并不会因此释放 因为在呼叫被挂断以后 第 7 页 共 17 页 呼叫的句柄还有可能被用在一些后续的操作中 可以通过 lineDeallocate 来释放呼叫句柄 8 关闭线路设备 应用程序调用 lineClose 函数来关闭被 lineOpen 函数打开的线路设备 如果一条线路被应用程序打开后始终没有 被关闭 那么其它的应用程序将无法访问该线路 9 结束 TAPI 的使用 在一切有关 TAPI 的操作完成之后 调用 lineShutdown 函数来终止 TAPI 的使用 它会隐含地关闭所以打开的线路设 备 根据 TAPI 的开发基本思路整个程序的设计思路流程如图 3 图 3 程序流程图 第 8 页 共 17 页 3 23 2 各功能模块的设计各功能模块的设计 3 2 13 2 1 TAPITAPI 的配置阶段的配置阶段 TAPI 的置阶段配置阶段包括对线路的配置和对 MODEM 的配置 只有正确 地配置并打开线路设备之后 才能对 MODEM 进行配置 以下函数完成对 TAPI 的配置 TAPI 类成员函数 telephonylnitialize 分配支持逻辑线路设备的使用所 必须的某些内部资源 并返回应用程序一个 TAPI 句柄 同时传递了一个回调函 数的地址作为参数 此函数处理对整个线路状态进行处理 然后使用 TAPI 的类 成员函数 lineNegotiateAPIVersion 与 Windows 协商 TAPI 版本 TAPI 类成员 函数 mylineGetDevCaps 获得有关逻辑线路的性能的信息 Windows 把这些信息 填充到一个名为 LINEDEVCAPS 的只读结构中 应用程序检查这个结构就可以了 解哪些设置是驱动程序所允许的 TAPI 类成员函数 lineOpen 打开线路 3 2 23 2 2 TAPITAPI 的连接阶段的连接阶段 TPAI 在连接阶段 MODEN 会产生很多消息 消息的处理 TAPI 由回调函数进 行消息处理 回调函数在初始化 TAPI 时创建 消息的处理在 TAPI 的使用过程 中是至关重要的 以下是一些主要的消息 1 LINECALLSTATE IDLE 没有呼叫 为空 此时应断接 释放掉占用的资 源 2 LINECALLSTATE DIALING 拨号中 正在拨号 3 LINECALLSTATE BUSY 线路忙或设备忙 此时应断接 释放掉占用的资 源 4 LINECALLSTATE SPECIALINFO 特别的消息 此时应断接 释放掉占用的 资源 5 LINECALLSTATE OFFERING 应答方已收到呼叫方信号 此时应进行应答 调用 lineAnswer 函数 6 LINECALLSTATE CONNECTED 已连接成功 此时可进行数据的传输 但必 须先得到 MODEM 的句柄 7 LINECALLSTATE DISCONNECTED 已断接 此时应释放掉占用的资源 TAPI 类成员函数 MakeCall 被用于发起呼叫 产生呼叫后依次进入图 4 状 态 第 9 页 共 17 页 图 4 状态流程图 新生成的呼叫处于 IDLE 状态 随后依次进入 PROCEDING OFFERING CONNECTED 和 DISCONNECTED 最后 回到 IDLE 状态 这些状态都通过在调 telephonylnitialize 函数初始化 TAPIDLL 的时候传递的回调函数来处理 3 2 33 2 3 数据传送阶段数据传送阶段 TAPI 并不提供数据传输的函数 因为 MODEM 通过控制计算机串口来进行 通信 所以 MODEM 的数据通信与串口数据通信的方法一样 采用 ReadFile 和 writeFile 函数来接收数据和发送数据 传送数据的时候要用到 MODEM 的句柄 此时调用 TAPI 的类成员函数 lineGetID 得到 MODEN 的句柄后就可以通过 ReadFile 和 WriteFile 函数来进行数据传输 ReadFile 与 WriteFile 有两种模 式 一种是等待模式 一种是非等待模式 等待模式下必须完成了所有读写操 作函数才会返回 最后一个参数必须为 NULL 非等待模式下要先定义一个 OVERLAPPED 变量 并且作为函数的最后一个参数传递进去 非等待模式下函 数会马上返回 OVERLAPPED 变量在初始化的时候会调 CreateEvent 函数产生一 个事件 当函数返回后我们调用 WaiForSingObject Event 函数让线程阻塞 当数据传送完以后操作系统会给应用程序发出一消息 当应用程序得到此消息 以后程序继续往下运行 一旦呼叫进入 CONNECTED 数据链路连通状态 则表明连接已经建立 此时 第 10 页 共 17 页 我们就可以进行数据传输了 不过在传送数据之前我们要得到 MODEN 的句柄 此时调用 TAPI 的类成员函数 lineGetID 此函数会把 MODEN 的名称和句柄保存 到一个 VARSTRING 类型的变量里面 通过次句柄我们就可以利用 WriteFile 和 ReadFile 来读写数据了 3 2 43 2 4 关闭连接阶段关闭连接阶段 当我们数据传送完成后需要退出程序的时候 我们会对线路进行挂断操作 TAPI 的类成员函数 LineDrop 来断开连接 然后调用 LineClose 来关闭一条打 开的线路 同时释放前面阶段操作所用到的一些缓存以及复位一些信号型变量 4 4 编码实现编码实现 4 1 程序主类的的定义程序主类的的定义 为了使程序的结构更为清晰和易于维护和升级 我把程序所要使用的数据 结构封装成一个类 类的定义如下 class CTapiLine protected HLINEAPP m hLineApp TPAIDLL 的句柄 HLINEm hLine 线路的句柄 HCALLm hCall 呼叫的句柄 intm nDevID 设备号 HANDLEm hLineEvent 线路改变事件 DWORDm dwLineMsg 线路消息 boolm bConnected 是否连接 HANDLEm hEventFromThread HANDLEm hLineMsgThread TAPI 事件监听线程 boolm bStopLineEventThread static DWORD WINAPI LineEventThread LPVOID lpVoid longm lEventThreadResult public HANDLE GetHandle const char szClassType long lError int PickupIncomingCall void GetErrorString int nError char int MakeOutgoingCall const char szAddress 第 11 页 共 17 页 int GetIncomingCall int Close int Open int nMode 0 CTapiLine virtual CTapiLine 类里面定义了整个程序运行所需要用到的变量 在进行线路操作时调用 TAPI 的类成员函数需要同时取得设备和线路的状态 所以我对 TAPI 的类成员 函数进行了封装 使这些操作都模块化 4 2 线路操作的实现线路操作的实现 线路的操作定义为 Open 和 Close 两个类成员函数 里面封装了 TAPI 的 lineInitializeEx TAPI 初始化 lineNegotiateAPIVersion 版本协调 lineOpen 打开一条线路 lineDrop 挂断呼叫 lineClose 关闭一条线路 四个类成员函数进行线路操作 同时封装了在线路操作时需要用到的设备性能 的取得函数 lineGetDevCaps 取得设备性能 int CTapiLine Open int nMode 初始化 TAPI lRet lineInitializeEx m hLineEvent stInitParams Handles hEvent 得到事件的句柄 m nDevID 1 通过循环取得可以传送数据的设备号 for int i 0 idwMediaModes m nDevID i break free lpDevCaps if m nDevID 0 0 lRet 第 13 页 共 17 页 int CTapiLine GetIncomingCall 应答 lRet lineSetNumRings m hLine 0 5 设置响铃次数 lRet lineAnswer m hCall NULL 0 4 4 数据操作的实现数据操作的实现 在程序中数据的读取单独创建一个线程 定义了一个回调函数 ReadThread 封装了 WriteFile 和 ReadFile 来实现数据的发送 DWORD WINAPI CMyTapiDlg ReadThread LPVOID lpVoid 接收数据 OVERLAPPED ov ov 的初始化设置 for pcDlg m bStopReadThread ReadFile pcDlg m hSerialHandle szBuff 512 读数据 错误处理 switch WaitForSingleObject ov hEvent INFINITE case WAIT OBJECT 0 GetOverlappedResult pcDlg m hSerialHandle return 0 void CMyTapiDlg OnBtnWrite 发送数据 要使用到的变量的定义 OVERLAPPED ov ov 的初始化设置 GetDlgItemText IDC EDTWRITE szBuff 512 nRet WriteFile m hSerialHandle szBuff strlen szBuff 写 数据 错误处理 第 14 页 共 17 页 switch WaitForSingleObject ov hEvent INFINITE case WAIT OBJECT 0 GetOverlappedResult m hSerialHandle break default break 5 5 软件测试软件测试 模块编程完结之后 设计测试用例 对 GUI 界面外观和功能等

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论