基于API的串口通信的编程实现
- 格式:pdf
- 大小:63.26 KB
- 文档页数:2
多线程在 Windows 编程中是一个比较重要的 概 念 。 所 谓 多线程, 即在同一个程序中可以同时执行多个任务。这意味着, 编程者可以将整个任务分成几个线程, 然后让操作系统同时执 行, 从而提高程序的执行效率。一般线程被分为两种: 用户界面 线程和工作线程( 又称为后台线程) 。
3 Windows API程序设计基础
首先, 一个程序一定要有进入点, Win32 App 的进入点函 数 的 名 称 是 WinMain, 接 下 来 是 注 册 一 个 窗 口 类 , 注 册 窗 口 类 时 使 用 RegisterClass( )函 数 , 然 后 使 用 CreateWindow( )函 数 创 建 窗 口 , 然 后 显 示 窗 口 , 调 用 函 数 ShowWindow( )和 Up- dateWindow(hwnd)程 序 通 过 执 行 一 块 被 称 为“ 消 息 循 环 ”的 代 码从消息队列中取出消息, 解释消息, 分发消息。而实际的消息 处理工作发生在窗口函数 WndProc( )中, 该函数中主要的部分 是一个分支选择结构: switch(message)用来处理 Windows 中的 各种消息。
2008 年 1 月 第 1 期( 总第 110 期)
广西轻工业
GUANGXI JOURNAL OF LIGHT INDUST编程实现
王海文 1, 宫岚 2, 赵加 3
( 1 .大连工业大学信息科学与工程学院, 辽宁 大连 1 1 6034; 2.大连市民航大连空中交通管理站, 辽宁 大连 1 00081 ; 3.凤城市农电局, 辽宁 凤城 1 1 81 00)
【摘 要】 介绍了开发 W indows 应用程序的多线程技术、开发串口通信的一般流程、以及开发 W indows API 程序的主要
技术, 然后在前面关键技术的基础上, 采用 VC + + 6.0 为开发平台, 实现了一个基于 API 的串口通信的程序。
【关 键 词】 串口通信; API; 编程; VC + + 6.0
1.1 创建线程与终止线程 创建线程的过程可以分成两大步骤, 首先编写线程函数, 然后
创建线程, 并将其参数线程函数地址指向刚刚编写的线程函数。 线程函数的退出, 除了使用退出函数处理外, 大都是随着
程序的结束而退出。 1.2 线程同步
多线程提高了程序执行的效率, 提高了编程的灵活性, 但 同时也引入了新的问题。线程之间经常要同时访问一些资源, 因此对共享资源进行访问引起冲突是不可避免的。另外, 在 Windwos 的 消 息 驱 动 方 式 下 , 必 须 某 个 事 件 的 发 生 了 , 才 可 以 执行某个线程, 为了解决上述问题, 必须引入线程同步的概念。 Win32 API 提供了多种同步控制对象, 包括临界区、互斥对象、 信 号 量(旗 语)和 事 件 。 在 这 里 , 重 点 介 绍 临 界 区( Critical Sec- tion) 和事件( Event) 。 1.2.1 使用临界区( C ritical Section)
MTTTYWndProc( ) 主 要 处 理 菜 单 响 应 和 按 钮 操 作 , 它 负 责打开各种工具栏, 关闭程序时的处理, 窗口大小变化的处理, 以及在子窗口中显示字符等, 这里最重要的是 CmdDispatch( ) 函数, 该函数完成菜单响应命令的全部功能, 包括串口连接, 串 口断开, 发送文件等。
使 用 临 界 区 主 要 有 以 下 几 个 步 骤 :( 1) 声 明 CRITI- CAL_SECTION 对象;( 2) 初始化 CRITICAL_SECTION 对 象 ; ( 3) 进入临界区;( 4) 离开临界区。 1.2.2 使用事件( Event)
用于使一个线程通知其他线程某一事件的发生, 所以也可 以用来封锁对某一资源的访问, 直到线程释放资源使其成为有 信号状态。适用于某一线程等待某事件发生才能执行的场合。 使用事件对象主要有如下几个步骤 : 声明事 件 对 象 : HANDLE hEvent; 建立并初始化事件对象: hEvent=CreateEvent( NULL, FALSE, TRUE, NULL ); 等待事件对象: WaitForSingleObject (hEvent, INFINITE); 设置事件为有信号: SetEvent(hEvent)等。
【作 者 简 介】王海文(1971- ), 男, 辽宁人, 讲师, 主要研究方向: 人工智能、软件工程。
88
程 序 可 以 使 用 Win32 API ReadFile( )函 数 从 串 口 中 读 取 数据, 使用 WriteFile( )函数向串口中写数据。在串行接口通信 中 发 生 错 误 , 如 发 生 终 端 出 错 、奇 偶 校 验 错 误 等 , I/O 操 作 将 会 终止。此时, 如果程序要进一步执行串行接口的 I/O 操作, 必须 调 用 ClearCommErro ( ) 函 数 对 串 行 接 口 进 行 恢 复 。 ClearCommError( )函数有两个作用: 第一个作用是清除错误条 件; 第二个作用是确定串行接口通信状态。
( 上接第 81 页)
复 杂 度 为)O(n2), 解 法 2 的 复 杂 度 为)O(n3/2), 本 例 子 中 问 题 规 模 较 大 ( n=1000) 。 而 计 算 机 执 行 指 令 次 数 大 约 为 2* ! 2 +3* ! 3 +……+10000* !10000 =3975502509( 约 39 亿) 次。笔 者在赛扬 1G 的 PC 机上运行时间大概为 0.56 秒钟。比解法 1 中的 2.69 秒快了 2 秒多。如果在一个拦截导弹系统里面, 系统 算法快 2 秒钟与慢 2 秒钟意味着什么呢?
通信会话以调用 CreateFile( )开始。CreateFile( )为读访问、 写访问或读写访问“打开”串行接口。按照 Windows 的通常做法, CreateFile () 返回一个句柄, 随后在打开的端口的操作中使用。 CreateFile( )函数非常复杂, 复杂性的原因之一是它是通用的。 2.3 读 / 写串口
首先给串行接口分配一个发送数据缓冲区和接收数据缓 冲 区 , 这 一 操 作 通 过 调 用 SetupComm( )实 现 。 当 不 使 用 Se- tupComm( )函数显示为串行接口分配缓冲区时, Windows 系统 也会分配默认大小的发送数据缓冲区和接收数据缓冲区。
配置 DCB 结构, DCB 结构包含了串行接口通信协议中诸如 波特率、每个字符的数据位数、奇偶校验和停止位数等配置信息。 同时 Windows 提供了 GetCommState( )函数获取串行接口的当 前配置, 使用 SetCommState()重新配置串行接口的各个参数。 2.2 打开串口
信端口、波特率、数据位数、停止位数、校验方式等) 。配置时要 求两台计算机上的参数保持一致。
完成两台计算机上述配置后, 发送数据端计算机首先操 作, 打开某个串口, 使其进入发送数据等待; 然后接收数据端计 算机操作, 打开对应的某个串口, 使其进入接收数据等待。
发送端操作过程如下: 在菜单中选择 Transfer, 接着选择 Send File(Text), 进入发送处理。选中所要发 送 的 文 件 , 按 回 车 键, 程序控制将文件数据从磁盘读出并通过串行通接口发送给 接收计算机。接收端计算机收到串行通信接口的数据, 并将它 显示在文本框中。 4.2 程序主要部分设计
4 程序设计实例
在 准 备 好 两 台 调 试 用 的 微 型 计 算 机 和 一 条 RS- 232 串 行 接口通信电缆, 并完成硬件连接的基础上, 要求将一台计算机 上选中的一个文件内容正确地传送到相连接的另一台计算机 上, 并显示该文件的内容。 4.1 程序运行示例
在两台计算机中安装好实例程序。启运运行该程序, 操作 员根据实际情况配置串行通信接口参数( 包括 RS- 232 串行通
【中 图 分 类 号】 TP393 【文 献 标 识 码】 A
【文 章 编 号】 1003- 2673(2008)01- 0088- 02
引言
串 行 通 信 具 有 连 接 简 单 、使 用 灵 活 方 便 、数 据 传 递 可 靠 等 优 点 , 在 工 业 监 控 、数 据 采 集 和 实 时 控 制 系 统 中 得 到 了 广 泛 应 用。同时 Visual C++ 对 Windwos 线程和消息的多任务机制提 供了强有力的支持, 并封装了大量的串口通信函数。这样, 当前 的 串 口 通 信 编 程 方 法 主 要 有 四 种 : 使 用 VC++ 提 供 的 MSComm 控件实现串口 通 信 、 基 于 MFC 框 架 实 现 串 口 通 信 、 基于某个串口通信 C++ 类、基于 API 的串口通信。前三种实现 起来相对容易, 但封装了很多串口通信信息, 使得不容易深入 进去 ; 最 后 一 种 基 于 API 的 串 口 通 信 实 现 起 来 较 难 , 但 可 以 比 较彻底的理解串口通信的原理与方法。
程序有三个线程。第一个是管理用户界面线程, 即主线程。第 二个是写串口线程, 第三个是监测串口事件并进行读串口线程。
WinMain( ) 为应用系统程序入口点。WinMain( ) 调用版本检 测函数 VersionCheck( ) , 然后用函数 InitializeApp( ) 初始化程 序( 确定窗口函数, 注册窗口类, 创建主窗口) , 最后把 Windows 消息发送给主窗口, 由窗口函数 MTTTYWndProc( ) 处理。
5 结论
该程序运行良好, 实现了基本的串口通信的功能, 同时提 供 了 编 写 一 个 串 口 通 信 程 序 的 框 架 与 方 法 。但 由 于 时 间 与 作 者 水平有限, 该程序还有待扩展, 读者可以在该程序的基础上, 编 写具有实际需求的串口通信程序。
参考文献 [1] 张筠,刘书智. Visual C + + 实践与提高 - - 串口通信与工程应用篇 [M].北京: 中国铁道出版社, 2006. [2] 龚建伟, 熊光 明.Visual C + + / T urbo C 串 口 通 信 编 程 实 践 [M].北 京: 电子工业出版社, 2004. [3] 刘鎏. 用 Visual C + + 实现计算机串行通信的几种方法[J].舰船电子 工程,2006,(1):94- 97.