您的当前位置:首页正文

基于API函数的模拟终端串行通信设计

来源:画鸵萌宠网
维普资讯 http://www.cqvip.com

研究与开发 困 第lVO 51.1卷第1 5 N0O.期 10 文章编 :1005—8451(2006)10_0004_03 基于API函数的模拟终端串行通信设计 丁 函,张海明,安永祥 (兰州交通大学 机电工程学院,兰,It1 730070) 摘 要:通过对模拟终端串口通信设计的介绍,阐述在Windows 9X/NT ̄作系统中,API函数和多线 程技术在串行通信中的应用。该方法能更加灵活、高效地控制串口操作。 父键浏:模拟终端;串行通信;多线程技术;API函数 I}|图分类 :TP274+.2:TP3I1.1 文献标识码:A Designing ofanalog terminal serial—port communication based on} Ifunction DINGHart,ZHANGHai・ming,ANYong・xiang (School ofMechatronic Engineering,Lanzhou Jiaotong University,Lanzhou 730070,China) Abstract:By nitroducing the design of analog terminal serial-communication,it was elabor-ated hte application ofthe API ufnction and multithread technology in serial-port communication in Windows 9X/NT.This method could control the operation of seria1.port more lfexibly and efficiently. Key Words:analog terminal;serial communication;multithread technology;API function 本文介绍的串口通信按照RS.232标准串行通信 函数和多线程思想进行模拟终端通信程序设计的方 协议与外围设备进行数据通信。 法,该程序可以实现从外部设备读写数据功能。 VC++6.0是Windows环境下功能强大的可视化 应用程序开发工具,在这种环境下编写的程序具有 1 系统整体结构 设备无关性和可移植性的优点。因此,本文将介绍 基于VC++6.0中Windows API(Windows Application 控制计算机为整个系统重要组成部分,应用程 Programming Interface,Windows应用程序编程接口) 序通过API函数像通常访问文件一样进行通信,利 用串口采集外围设备中数据。系统结构如图1所示。 收稿日期:2006—04—14 作者简介:丁函,在读硕士研究生;张海明,副教授。 1.1 f Win32API函数的 口创建 一 UART 一 图6高速串口的应用 参考史献: 5结束语 【1】林容益.cpu/soc及外围电路应用设计(基于fpga/cpld)【M】. 北京:北京航空航天大学出版社,2004. 设计中的逻辑功能模块完全采用VHDL语言进 [2】潘松,黄继业.eda技术实用教程[M】.北京:科学出版社, 行描述,在ALTERA公司生产的Cyclone系列的 2002.10. EP1C12Q24017芯片上实现了下载测试,并制作了用 【3】姚燕南,薛钧义.微型计算机原理【M】.(第3版)西安:西 光纤连接两块电路板,在电路板上测试了FPGA和 安电子科技大学,l994. AVR单片机之间9 600 Hz的串口通信以及两块电路 【4】ALTERA.a825 1 programmable communication interface 板间利用FPGA和光纤收发模块设计的5 M和10 M datasheet[A】.www.altera.com.cn.2004/2005.9. 2006.1 0总第11 5期圆 维普资讯 http://www.cqvip.com

第1 5卷第10期 于A P J函数的模拟终端串行通信设计 研究与开发 控 制 计 算 机 图1 系统整体结构图 使用Windows API函数创建串口的步骤如下: (1)串口的打开:使用串口打开函数CreateFile ()。把dwShareMode设为0,即以不共享的方式占用 一个端口。同时,将访问模式设置为GENERICREAD —J GENERIC WRITE,可以对端口进行读写操作。对 于文件的安全特性,通常指定成NULL。由于由设备 提出的文件必须存在,所以创建方式设置成OPEN— EXISTING,另外,使用了I/O重叠操作,因此把 FILE ATTRIBUTE MORMAL的属性设为FILE FLAGOVERLAPPED。 _(2)设置缓冲区:通过使用缓冲区分配函数 SetupComm(),指定输入输出缓冲区大小。 (3)初始化串口:调用GetComrnState 0函数获 取串行口的配置,然后通过修改DCB(Device Concrol Block)结构来修改串口配置,包括波特率、奇偶校 验、停止位数和流控制等信息。最后用SetCommState ()函数重新配置串口。 (4)读写串口、收发数据:使用ReadCom()、 WriteCom 0函数对串口进行读写操作,即进行数据 的接收和发送。在读写的时候,设置超时结构COMM— TIMEoUTS。把时间间隔Time0ut S.ReadInter— valTimeout设为MAxDw0RD,并且把读时间常数 和读时间系数TimeOuts.ReadTotal Timeout-Multiplier, TimeOuts.ReadTotalTime.outConstant均设成0,将使 ReadFil e立即返回并完成其他操作。通过设定 TimeOuts、WriteTotalTimeoutMultiplier,TimeOuts. WriteTotalTimeoutConstant的值指定WriteComm函 数的Get0verlappedResult函数的等待时间。最后调 用SetCommTimeouts函数设置超时。 在设置串口时,除了设置超时结构COMMTI— MEOUTS和DCB结构以外,也用到了通讯错误、通 信状态以及通讯事件这类信息…。 当读写串口数据时,采用了重叠异步执行。异 步执行时,当某~操作还没完成,系统又提出另一 请求时,系统会及时响应,不会产生阻塞,大大优 于同步执行的一次只能执行一个操作。在异步设置 时,会用到OVERLAPPED异步I/O重叠操作。 (5)关闭端口:在关闭其他线程后,用CloseHandle 关闭端口。在该串口通讯程序设计中,考虑大部分 情况需要从外界设备读取大量的数据并要进行准确 和实时的存储,还要求不能耽误用户的其他使用任 务以充分利用CPU时间,为了使二者能够协调、完 善的进行,提高数据传递的可靠性,采用基于多线 程和多任务的技术可以有效地解决这个问题。 1.2 多线程技术 }}{行通信中的应用 Windows32位的系统平台中,每个Win 32是基 于线程的抢先式多任务操作系统,各个程序在独立 的进程空间上运行【21,提高了程序与系统的稳定性。 开发多线程应用程序利用了VC++中提供的 MFC类库进行开发。MFC中包括工作线程(Work Thread)和用户接口线程(User Interface Thread)。 用户接口线程作为系统的主线程,用来处理接收到 的用户的输入、响应并处理事件和消息。主线程可 创建的多个附加线程即工作线程,用于执行后台任 务,但是不会影响到用户使用其他应用程序。这就 是基于多线程的多任务。 基于多线程的串口通讯设计结构如图2所示。 厂、 \ —/ 翌 主 信息 人 计算机 数据f附加线程l 线 机 审口资源  —l(读线程)r—一 程 交 互 \ / 厂丽甄 图2 串口通讯设计结构图 2应用实例 本串行通讯程序设计运用了多线程的编程思 想,该程序代码经过串I:1调试助手V2.2调试成功, 可供大家参考。部分主要程序如下: (1)由于串口通信主要是从外部设备中读入大 量的数据,而通过串口写入的数据量不太大,可以 在主线程中完成,因此要创建一个附加线程专门负 责读数据,减少主线程的负担。通过调用AfxBegin— Thread()函数创建,即自动创建一个CWinThread 对象。 BOOL CSerilDoc::OpenC onnection() {…………//打开并配置串口 if(Con gConnection())//如果串口连接成功 {m ̄Threead=AfxBeginThread(ExtrProc,this, THREAD PRIORITY NORMAL, 圆2006—0总象11 5期 维普资讯 http://www.cqvip.com

研究与开发 0,CREATE—第15卷第10期 SUSPENDED,NULL);//创建 重叠操作等待串口发生事件 并挂起附加线程,监视串口 if(m__pThread NULL) {CloseHandle(m-hCom); retum FALSE; } else {m_bConnected TRUE; m_pThread一>ResumeThread();//恢复线程的 运行 } ) ) (2)创建一个ExtrThread 0全局函数从外部设 备读人数据,该附加线程监视事件的发生,并通过 发送消息通知视图有通信事件发生。由于每个串口 对象在进行数据的发送和接收时,只用到一个缓冲 区,即进程中的所有线程共享进程的同一个地址空 间,它们都可以访问进程的各种资源和全局变量, 因而在共享资源方面很容易发生冲突[41。所以,在 此要考虑进程的同步问题。这里用到了串口通讯事 件EV.RXCHAR。 UNIT ExtrThread(LPVOID pParam) f…………… while(true) {if((dwMask&EV_RXCHAR) EV_RXCHAR) //缓冲区中有数据到达 {ClearCommError(m—hCom,&dwErrorFlags, &ComStat);//查看缓冲区的状态,是否有待输入的 内容 if(ComStat。cblnQue>0)//如果缓冲区内有须 读入的数据 {BOOL ReadCont; ReadCont ReadFile(m_hCom,buf,dwLength, &dwLength,&m—osRead); //通知试图接受到数据 PostMessage(pDoc一>m—hComWnd, WMCOMMNOTIFY,EV__RXCHAR,0); continue; ) ) if(!WaitCommEvent(m_hCom,&dwMask,&os))// 2006.10总第11 5期 {if(GetLastError 0一ERROR—10一PENDING) //无限等待重叠操作结果(如果将收到的数 据放入输入缓冲区,函数就结束等待) GetOVerIapppedResuIt(m—hCom,&os, &dwTrans,TRUE);//返回结果 ) (3)建立读函数和写函数ReadCom0和WriteCom (),以读函数为例。 DWORD CComDoc::ReadCom rchar bur,DWORD dwLength)//从输入缓冲区内读入指定数量的数据 {DWORD dwErrorFlags; COMSTAT ComStat; ClearCommError(m—hCm,&dwErrorFlags, &ComStat);//清除错误标记,获得状态信息,确定 缓冲区中处于等待的字节数 ReadFile(mhCom,buf,dwLength,&dwLength, _&mosRead); Return dwLength; ) (4)建立CloseConnection 0函数关闭连接以及 附加线程,程序略。 3结束语 该模拟终端串行通讯程序设计采用了多线程的 编程思想,弥补了单线程中同时只能执行一项任务 的不足,提高了整个系统的利用率。介于多线程技术 使用上的各种优越性,它受到广大控制监测人员的 青睐。但是,随着科学技术水平的不断提高,多线程 的复杂性逐步提高,也给大家提出了更高的要求。 参考文献: 【l】龚建伟,熊光明.Visual C++/Turbo C串口通信蝙程实践【MI. 北京:电子工业出版社,2004,l0. 【2】徐晓梅,高 丽.Visual c++程序设计【MI.北京希望电子出 版社.北京:科学出版社,2003. 【3】苏岳龙,李贻斌,宋 锐.基于VC++6.0的高速串口通信数 据采集系统【J].微计算机信息,2005(21):5. f4】唐金祥,何为,苏维军.Windows 98/NT/2000环境下多 线程方法在串口通信中的应用【J1.SCI/TECH INFORMA TJ0N DEVELOPMENT&ECONOMY,2003(1):8. 

因篇幅问题不能全部显示,请点此查看更多更全内容

Top