嵌入式系统串口全双工通信软件分层设计
eeskill 2021-09-24

1S3C2410硬件平台简介

S3C2410是韩国三星公司生产的新一代高性能微处理器,它是基于ARM920T内核的16/32位RISC处理器.主要应用于嵌入式系统中。

S3C2410拥有强大的数据处理能力.又有着低成本.低功耗等优点.在各种手持及移动设备上的应用越来越广泛,基于其平台的程序功能也越来越复杂。于是,在其平台上架构多线程的操作系统已成为越来越多系统设计者的诉求,本文介绍多线程在S3C2410上的具体实现过程。

2 系统结构分析

串行端口的本质功能足作为CPU和串行设备问的编码转换器,一般微机内都配有通信适配器,使计算机能够与其他具有RS232C串口的计算机或设备进行通信。本系统主要目的是实现宿主机与目标机之间的近距离串行通信,采用的宿主机是Intel X86架构的Red HatLinux9.03环境PC机,而目标机是ARM架构的开发板。

本系统中目标机开发板的内核采用的是三星的S3C2410,该开发板采用核心板加底板的模式.核心板接口采用DIMM200标准连接器.工作非常可靠,可稳定运行在203 MHz的时钟频率下。其外设非常丰富.功能强大.完全可以满足设计需要。串口线采用常用的RS 232C型接口模式。能实现计算机与开发板间的数据传输与控制。

3 系统硬件结构原理

串行通信可以在DOS或Windows环境下进行。可以用汇编或高级语言编写通信程序,本文介绍如何在Linux操作系统下来实现串口间的通信。

在串口通信的实现过程中。要保证数据传输的可靠性和稳定性.其硬件设计是必不可少的,本文中选用S3C2410芯片作为核心器件。S3C2410芯片是SAMSUNG公司16/32位的RISC处理器。采用ARM920T内核,内部具有2个独立的UART控制器以及分开的16 kB的指令Cache和16 kB数据Cache,每个控制器支持的最高波特率可达到230.4 kb/s。S3C2410芯片的这些特点,为实现在“nux操作系统下计算机与开发板问的串口通信提供了可靠的保证。基于S3C2410的嵌入式串口通信的硬件结构原理如图1所示。

宿主机计算机系统中,在Linux操作系统下编写好串口通信的程序.通过JTAG接口模块下载至目标机即开发板中,在相应的软件控制命令下.通过串行接口线即町实现宿主机与目标机问数据的发送和接收。目标机中电源模块提供了开发板系统工作所需的正常电压。各种数据信息町以通过液晶显示模块及时显示出来.还可以通过键盘控制模块来实现对日标机操作的控制,外扩存储器模块町以由FLASH或SDRAM构成,当然作为一个完整的系统.还必须配有其他外围电路,以保证系统的正常工作。

4 软件实现

串口通信软件的设计是系统成功运行的关键,如何保证通信的效率、可靠性、实时性以及节约系统的资源足设计者关心的问题,因此通信协议的定义、软件外发的结构设计、程序开发工具的选择在系统设计中极其重要。PC端串口通信程序的开发是基于Windows环境面向对象的设计方法,开发环境选用vc++,实现的方法有多种,对此作介绍的文献也较多。在此不详述。对于单片机端的串口通信程序,有文献介绍基于汇编语言的程序框架,但基于分层结构的C语苦实现却少有介绍。下面将具体介绍在KeilC51中,分层结构框架下串口全双工通信程序的设计与实现。

4.1 通信协议口波特率

基于串I=1的通信模式有间步通信和异步通信两种,这取采用的是异步串行通信。在通信过程中,单片机应处理以下问题: (1)识别命令。PC机将命令传送给单片机,单片机能够识别不同的命令而且根据不同的命令内容完成不同的操作。(2)识别数据。单片机能识别附加在命令后的数据。传送数据的最大位数由设置的缓冲区大小决定。(3)出错处理。包括识别无效命令和处理通信错误。当啦片机接收到系统没有定义过的命令.或者收到的命令不符合预先定义的格式时。它应该做出响应.向系统报错并能进行错误处理,错误类型编号应事先定义。(4)正确应答。当单片机系统接收到一条没有通信错误且符合通信协议的信息时,应根据所接收的命令进行相应操作,并把操作结果返回PC机.如发一个“OK”信息以示确认。

PC机应处理的问题:(1)采集单片机发送的数据,如某设备模块的状态信息;(2)接收单片机的正常响应和错误响应信息,若足错误响应信息,应根据错误类型,以处理。由于控制的设备模块可能有多个,通过对设备模块统一编址,给不同的设备设置唯一的16位地址加以区分。这样在PC机和单片机进行数据传送时,双方能够识别数据的来源及需控制的对象。如表1所乐为通信协议格式示例.由PC机传输命令协议和单片机响应协议组成。

4.2 单片机通信软件的分层设计

单片机系统的软件开发环境为Keil C51。与汇编语言相比.C语言在结构性、可读性、可维护性上有明显的优势.更利于程序移植和扩展。串口通信程序采用分层结构。即将程序按层次分为物理层、驱动层,应用层,分层设计有以下优点:(1)与主机通信的串口程序支持接收和发送并发处理(主动发送和被动查询设备并存),利于提高通信效率及数据处珲的实时性。(2)当单片

机只有一个串口而以串口通信方式控制的设备模块有多个时。必需对串口扩展,为了简化硬件则需用软件实现模拟的串口。因此系统内部应有支持I/O口模拟串口操作的软件实现。标准串I/O和模拟串口在物理实现上有区别,但采用统一的对外封装,以提高程序的封装性和模块化祥度。(3)防止由于串口操作向在流程中独占CPU资源.避免漏检状态信息等现象发生。

三层程序的主要功能及C语言实现如下所述:

(1)驱动层:也称抽象层,在该层定义串口基本操作结构。基于此结构实现不同方式下的串口设计,包括中断方式下的串口实现和I/O口模拟方式下的串口实现。虽然两种方式的底层实现有所区别。但足驱动层屏蔽不同串口操作的物理细节,简化应用层对串口的操作。串口的结构定义如下:

typedef struct Serial

{ void (* pfSetBaudRate)(unsigned long baud_rate);//设置串口波特率

void (*pfOpen)(void); //串口打开

void (*pfClose)(void); //串口关闭

unsigned (*pfGetChar)(unsigned char *c); //从接收缓存中取一个数

void (*pfPutChar)(unsigned char c); //发送一个字节

void (*pfPutStr)(unsigned char *tmp_str, unsigned char tmp_len); //发送一串数

}Cserial;

(2)物理层:在该层针对不同的串口实体.完成不同的物理操作.如单片机串口初始化、I/O模拟串口方式下的定时器初始化、I/O中断初始化等。其作用是给不同的串口操作模式提供支撑。针对标准全双工串口和模拟串口两类不同的物理实现方式.设计不同的串口实体(包含内部执行每类串口的底层操作及相关基本的外部初始化等操作),不同的实现方式,绑定不同的操作函数指针.指针指向不同的操作。两种串口实体封装成统一的串口基础类,使程序具有更强的通用性和扩展性。在物理层采用循环FIFO双缓冲队列对接收和发送的数据进行缓存、读取,缓冲区循环FIFO操作方式与中断方式下接收和发送数据的结合使用,保证了数据处理的可靠性、实时性。,由于篇幅所限.下面只给出了缓冲区结构和相关指针的声明程序示例代码:

typedef struct Fifo

{ unsigned char *m_buf;//定义缓冲区首地址

unsigned int m_bufsize;//定义缓冲区大小

unsigned int m_wp; //写入数据

unsigned int m_rp; //读出数据

)CFifo;

unsigned char(fFifoPush)(CFifo *me, unsigned char c);//数据入队

unsigned char(fFifoPop)(CFifo *me);//数据出队

void fFifolnit(CFifo *me, unsigned char * tmp_buf,unsigned int tmp_size);//初始化

(3)应用层:完成对单片机系统初始化。包括串口驱动结构实体的初始化。然后按统一的串口驱动层接口对串口操作而不关心其物理实现方式,如波特率设置、串口开关、收发数据等,循环接收、处理串口的命令和数据.处理单片机的I/O 口操作等。以下为主应用程序基本架构.本尔例为系统接收串口数据后。直接返回主机。

extern CSerial xdata mSerial; //在物理层,已声明该串口实体

void main(void)

{ EA=0;//禁止中断

Uart_Init(); //串口初始化

mSerial.pfSetBaudRate(9600);//设置波特率为9600bps

mSerial.pfOpen(); //打开串口

//⋯其它初始化程序,

EA=l: //开放中断

while(1){

if(mSefial.pfGetchar(&i))mSerial.pfPutchar(i)

}

//⋯其它循环检测、处理程序

}

5 小结

本文作者创新点足详细地说明了基于S3C2410的嵌入式系统串口全双工通信软件分层设计的实现,描述了单片机与PC机仝双工串口通信的通信协议,以及存keil C51下的程序实现。应用征明.该方法可以极大地提高程序的封装性和模块化程度.增强了串口传送数据时系统收发、处理数据的并发性和实时性.同时也提高了编程效率。该方法已成功应用于安防监控系统、I/O检测模块、安全模块等系统.运行结果良好。对于其它基于串口通信的智能设备控制.具有参考意义。

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
热门推荐
  • 相关技术文库
  • C语言
  • 编程
  • 软件开发
  • 程序
  • 10种排序算法C语言展示

    以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要。 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象稳定性 冒泡排序 O(n2) O(n2) O(1) 稳定 选择排序 O(n2) O(n2) O(1) 数

    05-11
  • 嵌入式驱动开发四个方向

    嵌入式大体分为以下四个方向: 一、嵌入式硬件开发:熟悉电路等知识,非常熟悉各种常用元器件,掌握模拟电路和数字电路设计的开发能力。熟练掌握嵌入式硬件知识,熟悉硬件开发模式和设计模式,熟悉ARM32位处理器嵌入式硬件平台开发、并具备产品开发经验。精通

    05-06
  • Python“常用”代码片段

    整理的一些“常用”代码片段,分享给大家。 1、冒泡排序 lis = [56,12,1,8,354,10,100,34,56,7,23,456,234,-58] def sortport(): for i in range(len(lis)-1): for j in range(len(lis)-1-i): if lis[j] > lis[j+1]: lis[j],lis[j+1] = lis[j+1],lis[j] retur

    05-06
  • 嵌入式术语中英文对照表

    ▎ A ASIC(专用集成电路) Application-Specific Integrated Circuit. A piece of custom-designed hardware in a chip. 专用集成电路。一个在一个芯片上定制设计的硬件。 address bus (地址总线) A set of electrical lines connected to the processor a

    05-07
  • C语言的十条杀手锏

    我们平常所说的执行效率就是使用相同的算法在相同输入条件下完成相同计算所产生的系统开销,目前来说一般会更多关注执行时间方面的开销。所有语言编写的代码最终要运行,都要转化成机器码。在更短的时间内完成相同的事那么效率就高。 下面说说如何提高C语言程

    04-30
  • Matlab用于二维图形绘制

    续上篇Matlab系列篇的二维图形,本篇将完成剩下二维图形部分篇章..... 交互式绘图 交互式绘图的意思就是可以使用鼠标对图形进行操作,具体的实现看待会的演示,首先了解几个会用到的函数:ginput、gtext和zoom,其中ginput只能用于二维图形绘制,另外两个还适

    04-28
  • 用Python 快速把物料编码快速匹配到BOM 里

    我们在处整理BOM时,有一件比较麻烦的工作,就是要从物料库里找到对应的元器件的物料编码并填入BOM中。我们通常的做法就是在物料库里每种物料逐一搜索,把对应的元器件的物料编码找出来,并填到BOM里。这种工作虽然没什么难度,但是如果BOM的元器件种类很多,

    04-21
  • 程序世界:线性代数是一种特定语言

    线性代数是什么? 在大学数学学科中,线性代数是最为抽象的一门课,从初等数学到线性代数的思维跨度比微积分和概率统计要大得多。很多人学过以后一直停留在知其然不知 其所以然的阶段,若干年之后接触图形编程或机器学习等领域才发现线性代数的应用无处不在,

    04-19
  • 一个故事讲什么是卷积

    引子 很多朋友和我一样,工科电子类专业,学了一堆信号方面的课,什么都没学懂,背了公式考了试,然后毕业了。 先说"卷积有什么用"这个问题。(有人抢答,"卷积"是为了学习"信号与系统"这门课的后续章节而存在的。我大吼一声,把他拖出去枪毙!) 讲一个故事:

    03-29
  • C语言函数为什么不能返回数组?

    C语言函数为什么不能返回数组? 在C语言程序开发中,我们不可以编写下面这样的代码: char f(void)[8] {char ret;// ...fill...return ret;}int main(int argc, char ** argv) {char obj_a[10]; obj_a = f();} 不可以编写这样的代码 这其实就是不能在C语言函

    03-15
  • 初学C语言,你的“行囊”需要准备什么呢?

    今天,我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生,都要感谢两个人: 克劳德.香农和约翰.冯.诺依曼,是他们发现了所有的数字化信息,不论是一段程序,一封email,一部电影都是用一连串的1和0进行编码的; 是他们发现了我们可以利用一个预先

    03-15
  • 如何让ARM代码执行速度更快?

    通过一定的风格来编写C程序,可以帮助C编译器生成执行速度更快的ARM代码。下面就是一些与性能相关的关键点: 1.对局部变量、函数参数和返回值要使用signed和unsigned int类型。这样可以避免类型转换,而且可高效地使用ARM的32位数据操作指令。 2.最高效的循环

    03-12
下载排行榜
更多
EE直播间
更多
广告
X
广告