嵌入式开发 > 详情

基于uC/OS的嵌入式系统通信接口设计

发布时间:2020-06-30 发布时间:
|

1 引言

随着微电子技术的不断创新和发展,嵌入式系统已经广泛渗透到科学和技术的各个领域,如:工程设计、数码产品、国防军事、自动化控制领域。嵌入式系统是指将应用程序、操作系统与计算机硬件集成在一起的系统。它以应用为中心、以计算机技术为基础,而且软硬件可以裁剪,因而是能满足应用系统对功能、可靠性、成本、体积和功耗的严格要求的专用计算机系统。

常用的主机与嵌入式外设的通信接口有RS232、USB、1394及10/100M以太网等接口。RS232接口被广泛用于不同速度设备与主机通信,有使用广泛,驱动程序丰富,可靠性好等优点。

本文以一个已开发成功的手持嵌入式仪器的RS232通信接口作为实例,详细说明了上位机和下位机通信程序的开发原理和过程,对类似的开发有很大的借鉴意义。

2 嵌入式通信系统结构

嵌入式处理器有许多种流行的处理器核,本文采用Piliphs公司的LPC2210,它是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-S CPU。对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。

由于LPC2210的144脚封装、极低的功耗、多个32位定时器、8路10位ADC、PWM输出以及多达9个外部中断使它们特别适用于工业控制、医疗系统、访问控制和电子收款机(POS)。通过配置总线,LPC2210最多可提供76个GPIO。由于内置了宽范围的串行通信接口LPC2210也非常适合于通信网关、协议转换器、嵌入式软件调制解调器以及其它各种类型的应用。更详细的资料见参考文献[1]

500)this.style.width=500;" border=0>

3、嵌入式实时操作系统μC/OS-II的移植

对于大多数手持嵌入式仪器而言,采用公开源码的操作系统μC/OS-II是最好的选择,μC/OS-II是一个完整、可移植、可固化及可裁减占先实时多任务内核。代码简洁经典,可靠性高。

μC/OS-II可以大致分为内核、任务处理、时间处理、任务同步与通信、与CPU的接口等五部分。内核(OSCore.c)是操作系统的处理核心,包括操作系统初始化、系统运行、中断处理、时钟节拍、任务调度和事件处理等多任务。任务处理部分(OSTask.c)是与任务操作密切相关的,包括任务的建立、删除、挂起、恢复等。时钟部分(OSTime.c)定义μC/OS-II的最小时钟单位是Timetick(时钟节拍)。任务同步和通信部分包括信号邮箱、邮箱队列和时间 标志等部分,主要用于任务间的互相联系和对临界资源的访问。与CPU接口部分是指μC/OS-II针对所使用的CPU的移植部分,主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断和相关处理部分等内容。

μC/OS-II除了良好的稳定性和安全性以外,很重要的特点就是对多任务管理的优异表现。μC/OS-II可以管理多达64个任务。除了8个μC/OS-II自用的任务以外,用户的应用程序最多可有56个任务。用户可以通过系统提供的任务结构来自行创立任务。更详细的资料见参考文献[4]。

本实例就是通过创建通信任务来实现下位机的通信。代码如下:

/* 创建任务receive */

OSTaskCreate(TaskUart0Recieve, (void *)0,TaskComStk[TaskStkLengh - 1], 20 );

4 嵌入式RS232通信软件设计

软件部分的设计包括上、下位机通信协议的制订、上位机程序和单片机程序的编写。其中上位机程序以Visual BASIC为开发工具,单片机程序用ANSIC C编写。

4.1 上位机与下位机通信协议的制订

上位机与下位机之间的数据交换必须遵循一定的通信协议,通信双方才能按照该协议解析所传输的数据。就本设计而言,规定串口数据帧为1起始位,8个数据位,1个停止位,无奇偶校验位,波特率为115200bps。

为了实现大文件的传送,我们将文件切成块,以二进制方式传送,这样就使得任意大小的文件都可传送,并且对系统的资源消耗最小。所制订的通信协议为:

帧头为6个字节,具体规定如下:

a.消息帧数据格式: 1 0 A B X X ,其中 10 为消息标识, AB表示文本长度, L=A*100+B, XX为配位字符,可以是任意值。

b.控制帧数据格式: 0 1 A B M N ,其中 01为控制标识, AB为请求标识, MN为附加标识, 11表示请求对方接收文件, M表示描述字串中文件名子串的长度, N表示描述字串中文件大小子串的长度, 10通知对方放弃传输, 00通知文件传输完毕, 01请求对方发送数据, MN为10请求发送下一个, MN为00请求重发。

c.数据帧数据格式: 0 0 A B M N, 其中 00 为数据标识,, AB表示数据长度,L=A*100+B, MN为校验,M*100+N=A+B。

前导帧使通信双方保持同步,当PC机发送数据时,先将请求对方接收控制帧给下位机,收到应答帧后开始传送;当PC机接收数据时,同样地,先将请求对方发送控制帧给下位机,下位机收到帧后开始传送。

4.2 上位机软件的编写

上位机是一个数据发送与接收的终端,上位机软件的功能是:使计算机与嵌入式系统能够通过RS232接口标准收发数据。由于Visual BASIC是一种易学易用的面向对象的程序设计工具,因而采用它来编写上位机程序。在上位机程序中要能够对计算机串行口的硬件进行操作。本设计通过串行通信组件MsComm实现串行通信功能。在设计中还需要使用其它一些组件如CommandButton、TextBox、CommonDialog等来完成软件界面的设计。界面如下:

500)this.style.width=500;" border=0>

4.3 下位机程序设计

通信任务代码如下:

/*******************************************************************

** 函数名称: TaskUart0Recieve

** 功能描述: μCOS-II的任务。从UART0接收并处理数据。通信调度程序!

** 输入: pdata 任务附加参数(指针)

** 输出: 无

*******************************************************************/

void TaskUart0Recieve(void *pdata)

{ uint8 bytTest[6];

uint32 i, intTest;

char strReceive[100];

pdata = pdata; /* 避免编译警告 */

for (;;)

{ for (i = 0; i 6; i++)bytTest[i] = UART0Getch();/* 接收数据帧头6Byte */

if((bytTest[0] == 1)(bytTest[1] == 0)){ //收到信息帧

intReceiveLen = bytTest[2] * 100 + bytTest[3];

for (i = 0; i intReceiveLen ; i++)strReceive[i] = UART0Getch();

}

else if(( bytTest[0] == 0)( bytTest[1] == 1)) //收到控制帧

{intTest = bytTest[2] * 100 + bytTest[3]; //控制帧分析

switch(intTest)

{ case 101: //对方请求接收新文件

intReceiveLen = bytTest[4];

i = 0;

do{strFileName[i++] = UART0Getch(); //'接收文件名信息

}while (i intReceiveLen);

intReceiveLen = bytTest[5];

i = 0;

do{strReceive[i++] = UART0Getch(); //接收文件长度信息

}while (i intReceiveLen);

intFileLenth = atol(strReceive); //文件长度

FileReceiveManager(0); //receive

break;

case 100:break; //对方通知放弃传输

case 1: //对方请求发送数据

if( bytTest[4] == 1){ //请求发送数据包

intDataNumber++;

if (intDataNumber >= intDataCount)

FileSendManager(4); //发送完成信号

else

FileSendManager(1); //发送新一帧数据

}

else

FileSendManager(2); //重发上一帧数据

break;

case 0: //接收到传输完毕信号

FileReceiveManager(4);

break;

}

}

else if( (bytTest[0] == 0)(bytTest[1] == 0)) //收到数据帧

{intTest = bytTest[4] * 100 + bytTest[5];

intReceiveLen = bytTest[2] * 100 + bytTest[3]; //数据字节数

i = 0;

do{ b_char[intFileReceiveLenth + i++ ] = UART0Getch();// 一帧数据

}while (i intReceiveLen);

if(intTest == (bytTest[2] + bytTest[3])) //根据校验和作出响应

FileReceiveManager(1); //校验和正确请求发送新数据

else

FileReceiveManager(2); //校验和错请求重新发送

}

else if( (bytTest[0] == 1)(bytTest[1] == 1)) //发送数据到PC

FileSendManager(0); //发数据

}

} /* 关于UART0Getch()请参看参考文献[2]*/

/* 文件发送管理 void FileSendManager(uint32 intFlag) 根据接收端的请求发送文件 */

/*文件接收管理void FileReceiveManager(uint32 intFlag) 处理接收到的文件数据 */

以上两函数,限于篇幅,具体代码略。

5 结束语

本文阐述了嵌入式系统的概念及嵌入式通信系统的结构。在设计中,作者充分地发挥了uC/OS-II的多任务管理功能,为实现通信功能而单独分配了一个优先级较低的任务,使得下位机在与主机通信的同时,能继续自己的工作,真正实现了实时多任务;此外,为了实现大文件的传送,我们将文件切成块,以二进制方式传送,这样就使得任意大小的文件都可传送,并且对系统的资源消耗最小,对于嵌入式系统,这是很有意义的。最后,为了便于参考,给出了在一个裁剪的uC/OS-II操作系统环境下,实现系统与主机通信的下位机程序源码。

参考文献:

[1] LPC221016/32-bit ARM microcontroller with 10-bit ADC and external memory interface Rev. 01 — 09 February 2004 ,Philips Semiconductors

[2] ARM嵌入式系统实验教程(二),广州周立功单片机技术有限公司,2005.

[3] 刘承广,常宇健,杨卫东,施博学. uCOS-II在车载GPS移动终端中的应用.

微计算机信息(旬刊).2005;21(2):103-104

[4] Labrosse Jean J. 嵌入式实时操作系统μC/OS-Ⅱ. 邵贝贝译. 第2版. 北京:北京航空航天大学出版社, 2003

作者简介

罗永道,1969.9,男,汉,北京理工大学 光学工程专业在读博士

EMail : lyd@bit.edu.cn

罗徽,1972.7,男,汉,昆明理工大学 计算机应用专业 在读硕士;

廖宁放,1960.1,男,汉,教授,博士生导师北京理工大学

通信地址:北京市海淀区中关村南大街5号 北京理工大学 信息科学技术学院颜色科学与工程国家专业实验室 邮编:100081



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
定时器CTC模式的测试