微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于uC/OS的嵌入式系统通信接口设计

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

时间:07-15 来源:互联网 点击:

据时,同样地,先将请求对方发送控制帧给下位机,下位机收到帧后开始传送。

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-Ⅱ. 邵贝贝译. 第

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top