基于VC的多线程串口通信程序设计

VC MFC 串口通信(多线程) VC  MFC  串口通信(多线程) 现在一般用VC写串口通信,大多数人会采取下面的三种方式: 一.直接利用VC 里面的MSComm类进行编程。 二.网上也有一个比较好的类,大多数人也喜欢采用SerialPort(此类其实也比较好用) 三.应用API函数进行串口编程。         以上三种方式编程,我都用过的。。。(当然都不是很深入)。其实前两种用起来比较简单一点。就是对串口初始 阅读详情

引言

在现代各种工业控制和长距离数据传输等通信系统中,实现计算机与单片机的串行通信是比较普遍的需求,这就需要在windows 操作系统下实现串口通信。目前对于上位机串口通信编程多采用串口控件mscomm,或者直接调用api函数的形式。其中mscomm控件使用非常简单,但由于其对串口的封装,在一些有特殊要求的情况下使用起来不够灵活。而api函数都是以独立的全局函数的形式存在,使用起来比较零散,不够系统,容易出错。因此,本文在主要研究api串口操作函数的基础上创建一个串口通信的类,并公开了所有接口,利于串口通信程序的继承和使用,具有较高的可移植性。

 windows 9x/nt是抢先式的多任务操作系统,程序对cpu的占用时间由系统决定。多任务指的是系统可以同时运行多个进程,每个进程又可以同时执行多个线程。进程是应用程序的运行实例,拥有自己的地址空间。每个进程拥有一个主线程,同时还可以建立其他的线程。线程是操作系统分配cpu时间的基本实体,每个线程占用的cpu时间由系统分配,系统不停地在线程之间切换。进程中的线程共享进程的虚拟地址空间,可以访问进程的资源,处于并行执行状态,这就是多线程的基本概念<sup style="font-family: ">[1]</sup>。在串口通信的应用中大多数情况下是要实现双工通信,操作系统在随时准备接受数据和发送数据,为了达到更高的效率和复合工业现场的实时性,本文将实现多线程的串口通信。

 多线程的程序设计

2.1 多线程的数据安全共享

 由于同一进程的所有线程共享进程的虚拟地址空间,并且线程的中断是汇编语言级的,所以可能会发生两个线程同时访问同一个对象(包括全局变量、共享资源、api函数和mfc对象等)的情况,这有可能导致程序错误。例如,如果一个线程在未完成对某一大尺寸全局变量的读操作时,另一个线程又对该变量进行了写操作,那么第一个线程读入的变量值可能是一种修改过程中的不稳定值。属于不同进程的线程在同时访问同一内存区域或共享资源时,也会存在同样的问题。因此,在多线程应用程序中,常常需要采取一些措施来同步线程的执行。线程同步是解决数据共享的有效方法。实现线程同步的方法有:原子访问、关键代码段、事件、信标、互斥量等。其中前两者是用户模式中的同步方法,后三者是利用内核对象来实现线程同步。在本设计中选用了原子访问方式。原子访问不用线程从用户模式转换到内核模式,因此可以节约大约1000个cpu周期的时间,原子访问是指线程在访问资源时确保其它线程不在同一时间内访问相同的资源。原子访问是通过api函数来实现的,本类api函数有:interlocked exchange add(plong*p,long q)此函数实现:*p=*p+q的原子操作。以及interlocked exchange(plong p,long u)完成*p=u的原子操作。可以利用互锁函数 interlocked exchange来控制工作者线程的退出。

2.2 vc++对多线程的支持

 使用mfc开发是较普遍的vc++编程方法。在vc++6.0下,mfc应用程序的线程由cwinthread对象表示。vc++把线程分为两种:用户界面线程和工作者线程。用户界面线程能够提供界面和用户交互,通常用于处理用户输入并相应各种事件和消息;而工作者线程主要用来处理程序的后台任务。

   程序一般不需要直接创建cwinthread对象,而是创建一个cwinthread的指针,通过调用afxbeginthread()函数创建一个cwinthread对象,从而开始一个线程。创建上述的两种线程都利用这个函数。线程的终止取决于下列事件之一:线程函数返回、线程调用exitthread()退出、异常情况下用线程的句柄调用terminatethread()退出、线程所属的进程被终止。另外vc++还对内核同步方法进行了封装。如本文用到cevent类就是对event内核句柄的封装。

多线程串口通信类设计

3.1 串行通信的基本原理

 串行端口的本质功能是作为cpu和串行设备间的编码转换器。当数据从 cpu经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。    在windows环境(windows nt、win98、windows2000)下,串口是系统资源的一部分。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),在打开串口后还要进行一系列的配置操作。如:波特率、校验位等。还要设置串口消息、消息表等,应用程序在waitcommevent中得到消息,利用这个消息来触发读串口的操作。通信完成后必须释放资源(关闭串口)。

3.2 串口通信类实现</font>    为了能让用户方便使用串口通信类,而不必关心内部如何实现,将串口通信类做成通信库。这也同时大大地增加了该串口通信库的可移植性。该通信库包含两部分,一是库文件(lib),一是提供接口的头文件(.h),库文件用于具体功能的实现,头文件用于接口的声明。以下是库的接口,其中主要函数功能如下:portconfig进行串口的配置;

readcallback设置读回调;sendcallback设置写回调;startlisten启动线程;senddata发送数据。

3.3 多线程串口通信实现

本程序一共采用了三个线程:    

(1) 程序主线程显示线程;    

(2) 发数工作者线程;    

(3) 收数工作者线程。    

发数工作的线程和收数工作的线程均由线程在用户的命令下开启。基于研究的目的,在设计时收、发数据一次均以1k为限。在用户发出发数命令时,主线程首先判断串口是否打开。如果开启,则开启发数线程,发数线程就将缓冲区中的数据全部的发送出去。在数据发送完毕后,线程自动退出。在用户发出监测命令时,线程在串口已开启的情况下开启收数线程。收数线程进去后就开始等待串口事件。当有串口事件发生(如,有字符到达),该线程就读串口,并将数据存入缓冲区,并在窗口中显示。当用户发出停止监测命令时,线程退出

。通信流程如附图所示。

 

附图

 

 

 

 通信流程图

 

结束语

 

  本文设计编写了通用串口通信类,可适用于与计算机通信的各种工程领域。采用用vc++编写,程序简单易懂。

visual c++串口通信技术与工程实现

串行通信开发指南

mcs-51系列单片机实用接口技术

 

C#串口通信从入门到精通(26)——多个串口多个线程发送数据和接收数据 本文介绍如何在多个串口下使用多线程进行发送和接收数据,由高级工程师多年经验总结而成,绝对是串口领域的实战经验! 阅读详情

相关推荐

C#多线程实现多串口通信的数据发送和接收

SendData方法用于向指定的串口发送数据。通过上述示例代码,我们可以实现多线程下的多串口通信,实现了数据的发送和接收功能。在上面的示例中,我们创建了一个SerialPortManager对象,打开了三个串口(COM1、COM2和COM3),然后分别向每个串口发送了一条数据。在上面的示例中,我们创建了一个SerialPortManager对象,打开了三个串口(COM1、COM2和COM3),然后分别向每个串口发送了一条数据。通过上述示例代码,我们可以实现多线程下的多串口通信,实现了数据的发送和接收功能。

TechPr的博客 1630

VC6.0实现串行通信的三种方法

Windows下串行通信 与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传递。串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。与通信设备相关的结构有COMMCON

Johnny的专栏 1613

C#串口通信从入门到精通(21)——一个串口多线程发送数据

本文详细介绍了串口通信中采用多线程发送串口数据的解决方案,由多年实战经验总结,绝对干货!

qq_34059233的博客 3690

VC++串口通信编程详解

在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点。每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答。   在Win32下,可

L_Andy的专栏 3万+

VC2008环境下基于MSCOMM控件的串口通信指南

串口通信,即串行通信,是一种利用串行线将数据以位为单位在两个设备间传输的方式。它的出现远远早于今天的USB和网络通信,是一种成熟的物理层通信协议。串口通信简单、稳定、成本低廉,广泛应用于嵌入式系统、计算机外设和工业控制等领域。MSCOMM控件,全称为Microsoft Communications Control,是一种用于Windows应用程序的ActiveX控件,允许开发者通过编程实现串口通信。

weixin_33660045的博客 683

Visual C++ 6.0下的多线程串口通信项目:CComPort类详解

串口通信,或称串行通信,是计算机与外部设备或设备间进行数据交换的一种方式。其通过单一的信号线来传输数据位,每个设备或计算机上的串口都可以独立作为数据的发送方或接收方。在工业控制和物联网领域中,串口通信以其简单、稳定、成本低的特点,成为设备连接的重要手段。CComPort类是用于串口通信的一个实用的C++类,广泛应用于Windows平台下的串口通信编程。它提供了一套简单易用的接口,帮助开发者轻松完成串口的打开、关闭、配置以及数据的发送和接收等操作。

weixin_31938351的博客 494

Vc串口通信(1)

<br /><br />一、VC编程实现串口通信软件<br />        首先,我们来大概的回忆一下单片机的串口通信。<br />    8051单片机的串行接口由数据缓冲寄存器SBUF、移位寄存器、串行控制寄存器SCON组成。8051单片机的串行接口是一个可编程的全双工通信接口,通过软件编程可以作为通用异步接收和发送器使用,也可作为同步移位寄存器,还可实现多机通信。其帖格式有8位、10位和11位,通过T1或T2设置各种波特率。<br />1.1 串行口工作原理<br />    在发送和接收数据前,

Jack__h的专栏 2350

VC++ 串口通信类及实例程序设计

本文还有配套的精品资源,点击获取 简介:本压缩包含一个专用于VC++环境的串口通信类,以及基于该类的一个示例程序。这个类简化了串口交互,支持打开、关闭、配置参数以及数据收发等操作。通过使用这个类和示例程序,开发者可以更有效地理解和实现串口通信功能,适应硬件设备控制和数据采集等应用场景。 1. 串口通信基本概念和重要参数 1.1 串口通信简介 串口通信是...

weixin_42309599的博客 532

vc串口通信

转载:http://blog.youkuaiyun.com/zw0558/article/details/4465835 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点。每次通信都是

blackwuxin的专栏 896

VC-MFC电机控制程序设计:PLC通信与全屏多线程界面

通信协议是一组规则,用于规定设备间如何交流数据,包括数据格式、传输速率、时序等。在PLC(可编程逻辑控制器)通信中,通信协议定义了设备间交换信息的标准方法。掌握这些协议对于实现PLC与其他系统间有效且准确的通信至关重要。在实际应用中,PLC经常被用来控制制造业的生产线。例如,一条包装线需要按照预设的流程对产品进行分拣、打包和运输。这个过程中,PLC通过与传感器、执行器等设备通信,实现对生产线的精确控制。

weixin_42575505的博客 1050

深入理解串口调测工具软件在VC6中的实现

本文还有配套的精品资源,点击获取 简介:串口通信是设备间数据交换的重要方式,尤其在嵌入式系统和工业控制中广泛应用。本文深入探讨基于VC6编写的串口调测工具软件,解析其核心功能如数据捕获、发送数据包、自动发送、十六进制显示与发送、发送文件等,以及如何通过WinAPI函数实现串口操作。该工具适用于多种领域,对提升开发效率和质量有重大意义。 1. 串口通信基础概念 ...

weixin_42509513的博客 869

多线程技术在VC++串口通信程序中的应用研究

<br />1 概述<br /><br />  在现代的各种实时监控系统和通信系统中,在Windows 9X/NT下利用VC++对RS-232串口编程是常用的手段。Windows 9X/NT是抢先式的多任务操作系统,程序对CPU的占用时间由系统决定。多任务指的是系统可以同时运行多个进程,每个进程又可以同时执行多个线程。进程是应用程序的运行实例,拥有自己的地址空间。每个进程拥有一个主线程, 同时还可以建立其他的线程。线程是操作系统分配CPU时间的基本实体,每个线程占用的CPU时间由系统分配,系统不停的在线程之

czq850114的专栏 684

VC6.0多线程串口通信示例:支持多COM口并行收发、完整参数配置与MSComm封装

这是一个基于VC6.0和MFC开发的串口通信演示工程,专为Windows平台设计,采用多线程机制实现多个COM端口同时打开、独立收发数据。程序能自动扫描识别本机所有可用串口,支持灵活设置波特率、数据位(5~8)、停止位(1/1.5/2)、校验方式(无/奇/偶/标记/空格)以及硬件/软件流控。每个串口拥有专属工作线程,互不干扰,主线程专注界面响应,彻底避免UI卡顿。发送界面支持ASCII文本和十六进制两种输入格式;接收区实时显示数据内容,附带时间戳和字节计数,并可一键切换十六进制与文本双模式查看。源码结构清晰

fire9的博客 266

【VC串口】VC串口通信的3种常见方法

本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++ 设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控。 在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。依据不同的条件实现对串口的灵活编程控制是我们所需要的。 在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以

天 下 1万+

TP4054芯片实战:手把手教你设计USB锂电充电电路(附PCB散热优化技巧)

本文以TP4054芯片为核心,手把手教你设计稳定可靠的USB锂电池充电电路。文章详细解析了芯片的恒流恒压工作模式、关键外围元件选型计算,并重点分享了PCB布局与散热优化的实战技巧,帮助工程师从“能工作”提升到“工作得好”,确保充电效率与系统稳定性。

1a2s3d4f5g的博客 468

人工智能AI在软件测试和质量效能中的实际应用

人工智能在软件测试中应用,介绍chatGPT在测试中的应用,还有多个AI驱动的测试工具。

lindafang72的博客 1万+

VC串口通信(Windows API)

本文转载自基于Windows API的VC++串口通信详解,以下附上大白的理解。 简介 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文我们只介绍API串口通信部分。串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作...

Ghu的博客 1万+

gnuradio+b210实现FM收音机

gnuradio+b210实现FM收音机环境介绍FM接收1 Flow Graph2 变量参数FM发射1 Flow Graph 环境介绍 Name Version gnuradio 3.7.14.0 uhd 3.15.0.0 ubuntu 18.04 usrp b210 参考 https://www.ijedr.org/papers/IJEDR1702038.pdf Audio File Transmission using GNURADIO and USRP FM接

u011745228的博客 5127

VC_MFC串口通信编程详解

在工业控制中,工控机(一般都基于 Windows 平台)经常需要与智能仪表通过串口 进行通信.串口通信方便易行,应用广泛.   一般情况下,工控机和各智能仪表通过 RS485 总线进行通信.RS485 的通信方式是 半双工的,只能由作为主节点的工控 PC 机依次轮询网络上的各智能控制单元子节点. 每次通信都是由 PC 机通过串口向智能控制单元发布命令,智能控制单元在接收到正 确的命令后作

贝壳紫铃专栏 6719

海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)

https://www.hikrobotics.com/machinevision/service/download?module=0

weixin_41965898的博客 2万+

补丁1.0:使用Eviews做ADF检验

补丁1.0:使用Eviews做ADF检验

Jet4505的博客 1961
上一篇: DBA command
下一篇: C#串口通信时丢失数据的一种解决方法
ynigeng
博客等级 码龄20年 19粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值