当前位置:首页 > 模拟 > 模拟
[导读]引言 与传统的Windows串口编程技术相比较,WinCE串口编程中不具备串口复用的功能,这给在WinCE系统中实现对串口的复杂操作增加了技术难度。本文介绍一种使用在信息平台软件中常用的C/S模型技术,模拟串口复用的

引言
    与传统的Windows串口编程技术相比较,WinCE串口编程中不具备串口复用的功能,这给在WinCE系统中实现对串口的复杂操作增加了技术难度。本文介绍一种使用在信息平台软件中常用的C/S模型技术,模拟串口复用的动作来实现WinCE操作系统串口复用的问题。
    本方法实现所使用的函数大部分都是嵌入式开发中最常使用的C/C++函数,所有的函数都具有一定的通用性,稍加改动即可应用到其他嵌入式操作系统中;并且该方法实现的思路对于解决其他嵌入式编程中资源复用的难题具有一定参考价值。

1 软件结构及工作原理
1.1 软件结构及特点
    为了使WincE操作系统的串口操作支持复用,在本方法中,采用了一种类式信息平台开发经常使用的C/S结构,利用此结构来模拟实现类似于Windows串口的复用功能,即在数据与串口硬件实际控制之间增加了一个C/S结构的中间层。系统整个结构主要包括控制协议、客户端程序和服务器端程序三部分。客户端和服务器端的程序复杂程度与串口操作的复杂程度成正比,在直观上也与控制协议的复杂程度成正比。软件结构图如图1所示。


1.2 控制协议
    控制协议的实现属于基础部分,复杂程度与串口的操作复杂程度有关,本文中提到的编程方法只是解决串口的复用部分,即同时对串口发生读写时在编程上的实现。因此在本方法中,实现串口复用的控制协议只需要两部分——串口+数据。串口指的是发生读写动作的串口(co m1,com2,…,comn),数据指的是需要用串口通信的数据。
1.3 服务器端程序流程及工作原理
    服务器端程序流程图如图2所示。


     从图2中可以看出,整个服务器端程序是由两个线程组成。一个线程用来处理由客户端发起的发送数据请求,符合控制协议的数据先存入预先定义好的发送缓冲区,同时判断对应串口的使用情况。当该串口被占用(串口正在处理上一个发送数据请求或者是正在接收数据)时,此次请求将被挂起一直到串口恢复到空闲状态;串口恢复到空闲状态后该线程将处理最先挂起的请求,将最先存入发送缓冲区的数据通过串口发走。
    同时,服务器端程序还要用一个线程来实时监视该串口,将由该串口接收到的符合控制协议的数据存入预先定义好的接收缓冲区,同时通知数据处理线程。
1.4 客户端程序流程及工作原理
    客户端程序流程图如图3所示。客户端程序只需将要发送的数据按照控制协议要求整合,将符合控制协议的数据提交给服务器端的程序即可。



2 关键技术
2.1 结构体定义
    为实现服务器端程序所有线程的管理,同时方便所有线程之间数据的共享,在创建线程时,对线程传递参数的定义就变得尤为重要。在本方法的实现中定义了一个线程传递参数,定义如下:
   
2.2 CMapStringToPtr类
    CMapStringToPtr类是MFC集合类中的一个模板类,也称为“字典”,就像一种只有曲列的表格,一列是关键字,一列是数据项,它们是一一对应的。关键字是唯一的,给出一个关键字,映射表类会很快找到对应的数据项。映射表的查找是以哈希表的方式进行的,因此在映射表中查找数值项的速度很快。该类最适用丁需要根据以CString对象为关键字进行快速检索的场合。
    为便于缓冲区和句柄的索引,在本方法的实现中使用CMapStringToPtr类的对象来管理线程和缓冲区的句柄。
2.3 CEvent类
    CEvent类的一个对象,表示一个“事件”——一个允许一个事件发生时线程通知另一个线程的同步对象。在一个线程需要了解何时执行任务时,事件是十分有用的。例如,拷贝数据到数据文档时,线程应被通知何时数据是可用的。当新数据可用时,通过运用CEvent对象来通知拷贝线程,线程才可能尽快地执行。
    另一个使用CEvent对象的方法是添加一个CEvent类型的变量,使之成为希望控制的类的一个数据成员。在控制对象被构造期间,可调用CEvent数据成员的构造函数,它指明时间是否是最初就被标记、需要的事件对象类型、事件名称(如果在进程中要使用)和所希望的安全属性。
    此外CEvent对象还可以保护控制的资源,使该资源在一个时间里只可被一个线程访问;使用时要先在资源访问成员函数中构造一个CEvent类型的变量,然后调用封锁对象的Lock成员函数。此时,线程要么等待资源释放后访问;要么等待资源释放而超时,访问资源失败。在各种情况下,资源都被以线程安全方式访问。
    总之,该方法实现的关键技术主要包含3个线程、结构体定义、CMapStringToPtr成员、CEvent成员和控制协议。

3 实现和应用
    基于上面的讲述,为了使用方便,将其所有的数据成员和方法封装成一个类。本文所有代码的实现使用的开发环境为EVC4.0,由于篇幅的关系,新建类的方法和开发环境的使用细节请详阅参考文献;对于在代码中出现的API函数的一些用法和参数说明可以详阅参考文献;想对WinCE嵌入式系统有进一步了解,可以仔细阅读参考文献。
    使用EVC4.0的Class wizrd插入一个新类,之后将上述代码加入,使用时只需在程序开始时涮用AfxGetSerMsgQ()->Open()函数来打开串口,此时即可对相应的串口数据进行实时处理,同时不影响其他线程对该串口的使用;当其他线程使用该串口时,只需调用AfxGetSerMsgQ()->WriteBuffer()函数来发送数据,调用AfxGetSerMsgQ()->ReadData()函数来读取数据即可。同时,这两个函数的调用不会影响相应串口数据的实时接收,完全实现了串口的复用功能。

结语
    本文提到的方法不但解决了WinCE操作系统不支持串口复用的问题,而且实现代码简单、通用性强,对于解决其他资源复用问题同样有效。本文提到的方法已经在实际产品中应用,解决了实际的工程问题。该方法实现的代码具有通用性,只需修改少量代码就可以应用到其他嵌入式系统软件代码设计当中。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭