基于多线程技术的串口通信的设计与研究
- 格式:doc
- 大小:21.00 KB
- 文档页数:6
实验2:串行端口程序设计一、实验目的了解在linux环境下串行程序设计的基本方法。
掌握终端的主要属性及设置方法,熟悉终端I /O函数的使用。
学习使用多线程来完成串口的收发处理。
二、实验内容读懂程序源代码,学习终端I /O函数的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。
三、预备知识有C语言基础。
掌握在Linux下常用编辑器的使用。
掌握Makefile 的编写和使用。
掌握Linux下的程序编译与交叉编译过程四、实验设备及工具硬件:UP-NETARM2410-S嵌入式实验平台、PC机Pentium 500以上, 硬盘10G以上。
软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发环境五、实验原理异步串行I /O方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。
数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。
接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。
为了恢复发送的信息,双方必须协调工作。
在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。
但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
图2.3.1串行通信字符格式图2.3.1给出异步串行通信中一个字符的传送格式。
开始前,线路处于空闲状态,送出连续“1”。
传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。
每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。
后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。
也可以约定不要奇偶校验,这样就取消奇偶校验位。
最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。
一种串口通讯新模型的研究与应用摘要:该文借鉴i/o完成端口模型(iocp)的核心思想,建立了一个适用于协议性串口通讯的新模型。
该模型提出了一个协议性串口通讯的最小单位——“通讯元”,将“通讯元”提交到事件队列线程中自动处理,简化了处理过程并提高了运行效率。
同时,该文基于该模型设计出了一个协议性串口通讯模块,以封装通讯底层的细节,从而提供方便的通讯接口。
将该模块应用于工业造气炉监控组态软件设计中,实际运行表明:该模型具有简单的接口和稳定、高效的运行机制。
关键词:iocp;串口通讯;通讯元中图分类号:tn915 文献标识码:a 文章编号:1009-3044(2013)04-0689-04the research and application of a new serial communication modelchen geng(college of information science & technology, xiamen university, xiamen 361005, china)abstract: in this paper, the core idea of i/o completion port model is borrowed to build a new model, which is suitable for the serial communication based on protocol. a minimum unit called ‘communication unit’ is put forward in this model. the ‘communication unit’ is submitted to anevent-queue-thread and is dealt automatically. it will help to simplify the process and increase operational efficiency. meanwhile, in this paper, a serial communication module based on the model is designed to offer a convenient communication interface. the module is applied in the snoopware of industrial gasifier. it’s proved that this model has a simple interface and efficient operation mechanism. key words: iocp; serial communication; communication unit web服务器、网络游戏服务器等应用经常会面对海量的客户端连接请求以及数据通信,这种海量的并发的连接请求与数据通信,往往成为制约服务器正常工作的因素。
基于windows api的串口通信方式、软件设计、终端通信协议摘要:手机、gps等终端的通信已经深入人民的日常生活中,大部分通信的手段为无线传输、蓝牙、usb,终端通信的串口通信是探究终端核心和通信网络协议等的重要手段,本文主要介绍终端通信的基于windows api的串口通信方式、软件设计、终端通信协议等有关内容。
关键词串口;模块;通信;软件;设计;结构;协议;中图分类号:s611 文献标识码:a 文章编号:引言串口是常用的计算机与外部串行设备之间的数据传输通道。
为了提高串口通信的速度和资源利用率,软件采用windows api函数并基于多线程技术和异步串口通信的设计理念,实现了终端(手机终端、gps)与上位机之间的数据交换,并且将采集到的数据保存到数据库中,便于分析和处理。
软件结构及概述软件涉及的核心内容包含三部分:串口通信模块,终端设备操控模块,通信数据分析模块。
串口通信模块由三个“类”组成-串口初始化(communication_init)、数据发送(message_send)、数据接收(message_receive)。
串口初始化完成对串口关键参数配置后的初始化操作,接收和发送模块分别为单独的功能模块,调用时均会创立独立线程,线程池时刻检索端口连接及忙闲状态,保障数据收发的准确性和稳定性。
软件的组成结构如图 1 所示。
终端设备操控模块,是采用串口向终端发送at指令,以控制终端的行为,目前的at指令能够模拟几乎所有手机按键操作指令,除此以外,at指令亦能够将终端模式打开到专业版本模式下,并且可通过at指令直接获取工程模式下参数。
一般情况下,终端将直接反馈ok,error等信息作为操作执行的回应。
通信数据分析模块是针对特殊终端在非at指令下产生的通信相关数据的收集及分析,能够通过这些数据获悉通信网络的状况。
串口通信模块串口设置界面截图串口的本质功能是作为 cpu 和串行设备间的编码转换器。
基于stm32的串口通信课程设计基于STM32的串口通信课程设计可以涵盖以下方面的内容:硬件准备:选择适合的STM32微控制器开发板,如STM32F4 Discovery或STM32F103C8T6等。
连接串口调试器(如USB转串口模块)与开发板的串口接口。
连接相关外设(如传感器,显示器等)到开发板的其他GPIO引脚。
开发环境设置:下载并安装STM32CubeIDE或其他适用的开发环境。
配置开发环境以支持选定的STM32开发板。
串口通信基础:学习串口通信的基本原理和通信协议(如UART)。
了解STM32的串口模块的配置和使用方法。
串口发送和接收:学习如何在STM32上配置和初始化串口模块。
实现串口数据的发送和接收功能。
使用中断或DMA方式处理串口数据的发送和接收。
数据解析和显示:设计数据帧格式,包括起始标志、数据字段、校验等。
实现数据解析算法,将接收到的数据解析为可识别的信息。
将解析后的数据通过LCD显示或其他方式展示出来。
通信协议扩展:实现更复杂的通信协议,如帧同步、差错校验、数据压缩等。
添加数据加密、认证或其他安全性功能。
支持多设备通信,如主从通信或多点通信。
实际应用案例:根据实际需求设计和实现一个具体的应用,如传感器数据采集和监控系统、远程控制系统等。
在设计课程时,可以结合理论讲解、实验演示和实际项目实践,使学生能够全面理解串口通信的原理和应用。
此外,建议提供相应的教学资源,如开发板的用户手册、技术文档和示例代码,以便学生更好地学习和实践。
以下是一个基于STM32的串口通信课程设计的简单示例:课程目标:设计一个基于STM32的温度监测系统,通过串口将采集到的温度数据发送到计算机,并在计算机上进行实时显示。
课程内容:硬件准备:使用STM32F4 Discovery开发板和一个温度传感器(例如LM35)。
连接温度传感器到开发板的一个模拟输入引脚(如PA0)。
连接开发板的串口接口(如USART2)到计算机的串口调试器。
标题:基于STM32F103C8T6的串口通信课程设计一、概述在现代电子信息技术领域,嵌入式系统的应用越来越广泛。
而串口通信作为嵌入式系统中常用的通信方式,对于学习嵌入式系统的同学来说是一个非常重要的知识点。
本篇文章将通过STM32F103C8T6作为开发板,具体介绍基于该开发板的串口通信课程设计。
二、STM32F103C8T6开发板简介1. STM32F103C8T6是意法半导体公司推出的一款低功耗、高性能的32位MCU微控制器,采用ARM Cortex-M3内核。
2. 该开发板具有丰富的外设,包括多个通用定时器、串行外设接口、通用同步/异步接收器发射器等,非常适合用于串口通信的课程设计。
三、串口通信基础知识1. 串口通信是一种通过串行传输方式进行数据交换的通信方式,其中包括UART、SPI、I2C等不同的协议。
2. UART是一种通用的异步收发器,适用于点对点通信,其中包括一个发送引脚和一个接收引脚。
3. 在串口通信中,波特率是一个非常重要的参数,用来表示每秒钟传输的位数,常用的波特率包括9600、xxx等。
四、基于STM32F103C8T6的串口通信课程设计1. 课程设计目标:通过本课程设计,学生将掌握STM32F103C8T6开发板的串口通信原理、基本应用和实际开发能力。
2. 课程设计内容:本课程设计将包括串口通信基础知识学习、STM32F103C8T6开发环境搭建、串口通信程序设计等内容。
3. 课程设计步骤:3.1. 串口通信基础知识学习:讲解串口通信的基本原理、工作方式、数据格式等知识点。
3.2. STM32F103C8T6开发环境搭建:介绍如何搭建开发环境,包括Keil、ST-Link驱动的安装与配置。
3.3. 串口通信程序设计:通过实例演示,学生将学习如何在STM32F103C8T6上实现基本的串口通信功能。
3.4. 实际应用案例:引导学生通过实际项目案例,将串口通信运用到具体的应用中,如LED灯控制、温湿度传感器数据的采集等。
几种单片机串口处理方式1.引言1.1 概述在现代的电子技术应用中,单片机的串口通信是一种非常常见且重要的通信方式。
通过串口通信,我们可以将单片机与其他外部设备进行连接,实现数据传输和通信功能。
本文将介绍几种单片机串口处理方式,通过对比分析它们的优缺点,帮助读者选择适合自己应用场景的串口处理方式。
2.1 单片机串口处理方式1将介绍一种常见的串口通信方式,该方式较为简单,适用于一些简单的通信场景。
然而,它也存在一些局限性,例如传输速率相对较低、易受干扰等问题。
2.2 单片机串口处理方式2将介绍另一种较为复杂的串口通信方式,该方式采用了更高级的协议和技术,可以实现更高的传输速率和更可靠的通信。
然而,该方式的实现难度较大,需要更多的硬件资源和软件开发工作。
在结论部分,我们将对这几种串口处理方式进行总结,分析它们的优缺点,以及适用的应用场景。
同时,我们还将展望未来的发展方向,预测串口通信技术在物联网和工业控制等领域的应用前景。
通过阅读本文,读者将了解到不同的单片机串口处理方式,并能根据自己的需求选择合适的方式。
希望本文能为读者在实际应用中提供一些参考和帮助。
1.2 文章结构文章结构是指文章的整体组织和条理性。
在本文中,我们将会介绍几种单片机串口处理方式的相关内容。
文章主要包括三个部分:引言、正文和结论。
引言部分将会提供对本文主题的概述,为读者提供对单片机串口处理方式的基本了解。
同时,我们将会介绍本文的结构和目的,以便读者能够更好地理解本文的内容。
正文部分将会详细介绍两种单片机串口处理方式。
我们将会分别阐述单片机串口处理方式1和单片机串口处理方式2的原理、特点和应用场景。
通过对这两种不同方式的比较,读者可以更好地了解它们的优缺点和适用性,从而能够在实际应用中做出更好的选择。
结论部分将对本文进行总结,并展望未来对单片机串口处理方式的发展方向。
我们将会总结各种方式的主要特点,并探讨可能出现的新技术和应用领域。
通过本文的学习,读者将会对单片机串口处理方式有更深入的认识,并能够为未来的项目选择提供有价值的参考。
摘要随着计算机技术的发展和推广,利用串口进行数据通讯在通讯领域中占有着重要的地位。
为了方便和快速的通过 Internet 网络访问串口服务器的串口,本课题把串口通信集成到 Windows 服务,Windows 服务完成串口通信的基本操作。
由文中详细描述了串口通信服务的原理和工作流程,还列举出了相关的核心代码。
用流程图的方式来描述了各个模块的逻辑实现。
串口通信服务中采用安全队列的机制来控制多线程访问多串口。
在开发中按照软件工程的流程,从需求分析到概要设计从详细设计到编码,以及最后的测试,利用软件工程的工具管理开发代码和文档。
此外,还开发出了客户端来测试该服务工作是否正常。
经过测试服务工作正常,能通过网络连接到服务器完成串口的通信。
最后总结了开发和设计的不足之处,程序还有待进一步完善。
关键词:串口通信;Windows 服务;安全队列;多线程AbstractWith the development of computer technology and to promote theuse of serial data communication occupies an important positionin the communications field. In order to easily and quickly through the Internet network to access the serial server serial, the subjectof serialcommunication integrated intotheWindows services,Windows services to complete the basic operation of the serial communication. By the paper describes in detail theprinciplesand workflow of the serialcommunication, alsocited the corecode. Flowchart way todescribe the logic of eachmodule. Serialcommunication services usedin the security queue mechanismtocontrol the multi-thre aded access to morethan serial.Development in accordance with the softwareengineeri ngprocess,fromrequirements analysisto outlinedesign, detaileddesign to coding, and fi nal testing, the use of software engineering tools for managing the development of code and documentation. Also developed a client to test the service is working properly. After the normal work of testing services,through the network to connect to the server to complete theserial communication. Concluded the development and design ofthe inadequacies of the program remains to be further improved.Keywords:serialcommunication;Windowsservice; securityqueue; multi-thre aded目录摘要 (1)Abstract (2)第一章引言 (5)1.1 课题背景 (5)1.2 研究现状 (5)1.3 研究目的及意义 (6)第二章开发技术简介 (7)2.1串行通信简介 (7)2.2 vc++简介 (7)2.3 USB接口技术简介 (9)2.4 USB通信参考模型 (9)2.5 USB 接口的通讯原理 (10)2.5.1USB 设备的接入 (10)2.5.2 USB 设备的识别 (10)2.6功能需求 (11)2.6.1 服务器端 (11)2.6.2 串口通信 (11)2.6.3 客户端 (11)2.7设计方案 (11)2.7.1服务器端 (11)2.7.2串口通信 (12)2.7.3 客户端 (12)第三章系统程序设计 (13)3.1串口通讯的程序设计 (13)3.2 通信协议 (14)第四章系统程序的主要功能 (15)4.1 程序功能 (15)4.1.1参数设置功能 (15)4.1.2参数显示功能 (15)4.1.3打开串口功能 (15)4.1.4关闭串口功能 (15)4.1.5接收数据功能 (15)4.1.6发送数据功能 (15)4.1.7清空数据接收区功能 (15)4.1.8清空数据发送区功能 (15)4.1.9自动发送功能 (15)4.1.10十六进制显示功能 (15)4.1.11十六进制发送功能 (15)4.2 程序运行平台 (15)4.3总体设计 (16)4.4程序类的说明 (16)4.5模块分析 (18)4.5.1参数设置和显示模块 (18)4.5.2打开串口模块 (20)4.5.3发送数据模块 (21)4.5.4自动发送模块 (22)4.5.5接收数据模块 (22)4.5.6清空接收区模块 (23)4.5.7清空发送区模块 (23)4.5.8关闭串口模块 (24)第五章系统测试 (25)5.1 系统测试 (25)5.2 测试目的 (25)5.3 测试结果 (25)总结 (27)参考文献 (28)致谢 (29)第一章引言串口应用是一种常见的应用技术。
多线程在串口通信中的应用多线程在串口通信中的应用1. 多线程通信的方式(1)多线程间的同步通信:多线程间通过同步的方式实现数据的交换,主要用于在多线程并发条件下实现通信时,多个线程之间实现一致性数据同步,提高数据完整性。
(2)多线程异步通信:多线程异步通信最大的特点是可以很容易的支持大量的通信请求,而且不会因为网络延迟或分布式环境造成响应现场拖延,是构建网络应用非常有效的方式。
2. 串口多线程通信的特点(1)可以节省系统的网络资源:串口多线程通信可以减少对网络资源的占用,减少系统通信负荷,提高系统的性能。
(2)提高系统的稳定性:串口多线程通信可以有效的减少系统网络故障发生的风险,保证系统的稳定性,提高系统的可靠性。
(3)占用系统资源少:串口多线程通信占用系统资源比较少,不会因为通信时产生大量的中断等资源消耗,可以提高系统的效率。
3. 串口多线程通信的优势(1)减少网络流量:串口多线程通信采用并行通信模式,可以把信息数据发送到多个串口,减少网络流量;(2)减少资源消耗:串口多线程通信可以减少系统资源消耗,避免因大量通信内容占用系统资源影响系统性能;(3)可以支持大量客户端:串口多线程通信可以支持大量客户端并发,提高网络数据传输率,更加稳定,可以满足大多数的客户需求。
4. 串口多线程的应用(1)拨号-上网:串口多线程通信可以应用于在拨号系统上网,可以支持大量的拨号客户端同时上网;(2)通信网络:串口多线程可以应用于局域网和广域网,可以支持大量的客户端同时通信;(3)串口设备控制:采用串口多线程技术可以更好的控制网络上的设备,可以更加稳定的控制设备通信;(4)通信协议:串口通信协议支持多线程,可以支持大量的多线程通信,可以提高通信的安全性和可靠性;(5)系统控制:串口多线程可以支持系统间的控制,两个不同的系统可以通过多线程技术来实现数据交换,并可以用于控制系统的操作。
第1章绪论1.1课题研究的意义21世纪是经济竞争的时代。
串口通信的应用使得计算机对工程实现实时监控,能够在相关工业实践中帮助企业提高效率,带来更多的效益。
以串口通信应用为重点的企业要想在当前国内竞争日益激烈的环境中生存和发展,关键之一就在与注重串口调试系统的开发和管理维护,因而充分利用和发挥生产管理的优势和潜力,取得更大的社会和经济效益。
科技的发展及计算机的广泛运用,串口通信的设计与实现将管理信息化和高效化,为提高企业的核心竞争力提供了广阔的平台。
1.2本课题的发展现状与存在的问题串口通信的设计与实现,常用的开发环境有visual basic和Delphi;工具有MSComm控件、Windows API编程、SPComm控件、APRO组件等。
但是无论在开发环境还是工具的选择上,其实现数据的发送、接收功能部分都是大同小异的,也就是先对开发环境和工具组合,然后进行编程。
所进行的串口通信设计都是在开发环境和工具的组合下完成的,未来的开发如果能设计出一套系统的、简单易用的串口通信设计工具,能很好的用与后期深层次开发以及其他资源和串口外设进行交互使用,带来的经济效益和社会效益会更大。
1.3课题来源与主要研究内容随着当今串口通信技术的发展,串口开发环境和工具功能的改善,以往的串口通信设计已经不能满足当今的需求,所以急需串口通信的设计能突破以前的常规思想,做到新颖、简单、可操作性强等特点。
本次串口通信的设计与实现,主要研究在什么环境下利用什么工具开发,利用什么原理才能比较简单的进行串口通信设计,详细设计其中的每一模块,因而达到设计简单,构思独特,用户界面友好,操作方便,可移植性好等特点。
第2章相关技术介绍2.1常见接口及通信标准在通常情况下,人们是通过外部设备使用计算机的,由于外设往往不能与CPU直接相连,所以他们之间的信息交换一般需要通过接口完成。
接口包括主机提供的一组线路和接口电路以及外部设备内部的接口,它们实现规定的接口协议,使得不同外设能够与主机和CPU实现互连。
多线程通信方法在多线程编程中,线程之间的通信是非常重要的,它可以确保线程之间能够相互协调、共享信息和资源。
多线程通信的主要目的是实现线程之间的数据交换和同步操作,以保证线程能够正确地执行。
在多线程编程中,常用的线程通信方法有共享变量、信号量、消息队列、管道和套接字等。
下面将逐一介绍这些方法的特点和使用场景。
1. 共享变量:共享变量是最简单、最常用的线程通信方式之一。
多个线程可以通过读写共享变量来进行数据交换。
共享变量的优点是简单易用,但由于多个线程同时访问共享变量可能引发竞态条件和死锁等问题,需要使用锁机制来保证线程安全。
2. 信号量:信号量是一种更复杂的线程通信方法,它可以用来控制多个线程的执行顺序和并发数量。
信号量维护一个计数器,线程可以通过调用P操作来减少计数器的值,通过调用V操作来增加计数器的值。
当计数器为0时,等待线程将被阻塞,直到有其他线程释放信号量。
3. 消息队列:消息队列是一种线程安全的数据结构,用于在多个线程之间传递消息。
消息队列可以实现线程之间的解耦,发送线程将消息放入队列,接收线程从队列中获取消息进行处理。
消息队列的优点是可以实现高效的异步通信,但需要注意消息的格式和大小,以及队列的容量限制。
4. 管道:管道是一种半双工的线程通信方式,用于在父进程和子进程之间传递数据。
管道可以用于同一进程中的线程通信,也可以用于不同进程之间的线程通信。
管道可以通过文件描述符来进行读写操作,但需要注意同步问题和管道的容量限制。
5. 套接字:套接字是一种全双工的线程通信方式,用于在网络中传输数据。
套接字可以用于不同主机之间的线程通信,可以实现远程过程调用和分布式计算。
套接字需要指定IP地址和端口号,可以通过TCP或UDP协议进行数据传输,但需要考虑网络延迟和安全性等问题。
以上是常用的多线程通信方法,它们各有特点和适用场景。
在实际开发中,需要根据具体的需求和环境选择合适的线程通信方法。
同时,为了保证线程安全和避免死锁等问题,需要合理设计和使用线程通信方法,遵循良好的编程规范和原则。
qserialport多线程方法下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, our shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!现代的软件开发中,多线程技术日益被广泛应用。
基于多线程技术的串口通信的设计与研究作者:李可一朱环娟周凤华来源:《科技传播》2010年第15期摘要本文以VC++ 6.0为开发平台,讲述了如何使用32位的Windows API 串口通信函数,编程实现高效的多线程全双工串口通信,并在阐述中给出了相关函数或代码。
实验证明,该方法有着较好的灵活性、可靠性与高效性。
关键词 VC++;串口通信;多线程;重叠I/O中图分类号TP313 文献标识码A 文章编号 1674-6708(2010)24-0219-020 引言串口是常用的计算机与外部设备之间的数据传输通道,由于使用其通信方便易行,且能实现数据的长远距离传输,故应用极其广泛。
为此,根据不同的使用环境灵活地编写出串口通信处理程序是必要的工作。
在Windows上,微软专门提供了相应的文件I/O函数和通信函数,以方便我们编写出所需的串口通信程序。
目前,实现串口通信的方法有两种。
第一种,使用VC++提供的串口通信控件MSComm;第二种,使用32位的API 通信函数。
本文采用了第二种方法,且结合多线程技术,实现了更加灵活的串口通信程序设计。
1 编程实现过程1.1 初始化端口在Windows操作系统中,串行口是被作为文件来进行处理的,而不是直接对端口进行操作,为此我们使用某一个串口进行通信时,需首先调用API函数CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIB UTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL );获取一个串口通信设备句柄hCom。
其中,该函数的第一个参数szPort标识将要开启的端口号,第二个参数规定了端口读写属性,剩下的参数中较重要的是设置FILE_FLAG_OVERLAPPED标识,即开启重叠I/O的方式。
在该模式下,当我们调用读写函数时,即使操作还未完成,被调用的函数也会立即返回,这样费时的I/O操作会在后台进行,使系统在这段时间可以去干别的事情,提高了系统的执行效率,且借用多线程技术还能实现读、写的同时进行。
接下来,需要根据需求,调用SetCommTimeouts(hCom, &m_CommTimeouts);函数,设置COMMTIMEOUTS类型的结构体变量m_CommTimeouts。
更改COMMTIMEOUTS结构体里面的成员变量,可以设置串口读写超时时间,以实现系统若未在指定时间内读出或写入指定数量的字符,就不再继续,立即返回执行下一次的任务。
然后,还需要分别调用SetCommState和SetupComm函数,设置端口的速率、数据位、输入输出缓冲区大小等配置信息。
至此,就完成了串口的初始化并开启操作。
1.2 串口读写的实现1.2.1 多线程全双工通信想要编写高效率的串口通信程序,除了设置重叠I/O外,再结合多线程技术,可以起到更好的效果。
所谓多线程,就是指要计算机并行的处理不同的事情。
在VC中线程分为用户界面线程和工作者线程,其主要区别是前者能够提供界面和用户的交互,而后者没有界面,用于处理后台任务。
本文在设计通信程序时,建立了两个工作者线程,一个用于不断监视数据的接收,一个用于数据的发送。
这样,使程序实现了收发同时进行的全双工工作方式,在实际应用中更有效率。
另外,值得注意的是使用重叠I/O需要创建OVERLAPPED结构以供读写函数,即ReadFile 和WriteFile使用。
而OVERLAPPED结构中最重要的成员是hEvent。
hEvent是一个事件对象句柄,通过CreateEvent函数来创建,被用作线程的同步对象使用。
如果读写函数未完成操作就返回,那么会将hEvent置为无信号状态。
只有操作完成后(包括超时),hEvent才会置为有信号状态,这样我们就可以通过hEvent知晓当前通讯设备的读写状态。
实际程序运行时,若发现读、写函数的返回值为假,由于开启了重叠I/O方式,那么未必是指读写失败,此时需要通过GetLastError函数的返回值做进一步判断。
若返回为ERROR_IO_PENDING,说明当前读或写操作还未完成,这时就可以挂起读、写线程,等待操作完成。
而程序设计时有两种等待方法:一种是用WaitForSingleObject等待函数来等待OVERLAPPED结构体中的成员hEvent为有信号状态;另一种办法是调用GetOverlappedResult 函数等待,注意需要将该函数的bWait参数设为TRUE,那么该函数将会一直等待hEvent 事件,直到其有信号才返回。
同时,利用GetOverlappedResult还可以返回一个OVERLAPPED结构体,里面包含有实际发送、接收字节等重叠操作的结果。
下面将分别给出读、写线程的关键代码,并作适当分析。
1.2.2 串口读操作DWORD WINAPI readdata(LPVOID data)/////////////接收数据工作者线程{ CTestDlg *dlg=(CTestDlg *)data;byte *lpBuffer=NULL;DWORD dwError=0;COMSTAT ComStat ;DWORD dwLength; //存储输入缓冲区字节数DWORD dw_Length;//存储实际读到的字节数ClearCommError(dlg->hCom, &dwError, &ComStat ) ;dwLength = ComStat.cbInQue ; //获取输入缓冲区有多少字节数据if (dwLength > 0) //有数据时开始读{ lpBuffer = new byte[dwLength];//申请内存空间,用于存放读到的数据bool fReadStat;//读操作状态fReadStat = ReadFile( dlg->hCom, lpBuffer,dwLength, &dw_Length, &dlg->m_OverlappedRead);if (!fReadStat)//状态为假时{ if (GetLastError() == ERROR_IO_PENDING)//确认读操作是否还未完成{ //挂起该线程,等待数据读完GetOverlappedResult(dlg->hCom, &dlg->m_OverlappedRead, &dw_Length, TRUE ); }}CStringstr_t,str_final;for (DWORD i=0;i{str_t.Format("%c",lpBuffer[i]);str_final+=str_t;str_t.Empty();}dlg->GetDlgItem(IDC_EDIT_Receive)- >SetWindowText(str_final);//以字符串形式显示接收的数据delete []lpBuffer;}return 0;}以上给出的即是接收数据线程的主要代码,由于在实际使用中,我们想实时监控端口的数据输入情况,做到输入缓冲区一有数据传来就立即执行读取操作,故在程序中要建立一个定时器,设定一个监控的时间间隔,定点不断执行以上工作者线程的代码,以实现对端口的监控。
另外,我们在线程中需要使用ClearCommError函数获取输入缓冲区的数据状态,以判断是否该开始读取数据。
1.2.3 串口写操作DWORD WINAPI writedata(LPVOID data) /////////////发送数据工作者线程{ CTestDlg *dlg=(CTestDlg *)data;BOOL bWriteStat;DWORD dwBytesWritten,dwBytes;// dwBytesWritten记录实际发送字节数,dwBytes记录应发送字节数CString str_data;dlg->GetDlgItemText(IDC_EDIT_Send,str_data);//获取要发送的数据dwBytes=str_data.GetLength();//得到要发送的数据长度char *send_data=new char[dwBytes];send_data=str_data.GetBuffer(0);//将要发送的数据拷贝到以send_data为头指针的内存空间bWriteStat = WriteFile(dlg->hCom, send_data,dwBytes, &dwBytesWritten,&dlg->m_OverlappedWrite );if( !bWriteStat && ( GetLastError() == ERROR_IO_PENDING ) )//写操作还未完成{ if( WaitForSingleObject( dlg->m_OverlappedWrite.hEvent, 2000 ) )//挂起该线程,等待写结束 dwBytesWritten = 0; //超时了else //未超时{ GetOverlappedResult( dlg->hCom, &dlg->m_OverlappedWrite, &dwBytesWritten, FALSE ); AfxMessageBox("send ok");}}str_data.ReleaseBuffer();return 0;}以上所示的数据发送线程,我们只需在想要发送数据时创建、启动线程即可。
2 结论本文描述了在VC++上如何使用Win32 API中相关的通信函数,编程实现串口通讯程序,且采用多线程的程序设计思想,在重叠I/O的方式下,不仅提高了串口通信的效率,而且还实现了收发同时进行的全双工工作方式,为计算机与外部设备通过串口通信提供了更灵活的方案。
参考文献[1]胡春燕.基于VC的串口通信的实现[J].福建电脑, 2005(10).[2]阚能琪. VC ++ 串口通信中多线程技术的应用研究[J]. 西华大学学报:自然科学版,2005,7.[3]孙鑫,余安萍. VC++深入详解[M].北京:电子工业出版社,2006,6.[4]Microsoft Corporation. Microsoft Developer Network Library[DB/DK].Microsoft Corporation,2001.。