基于uC/OS的嵌入式系统通信接口设计
据时,同样地,先将请求对方发送控制帧给下位机,下位机收到帧后开始传送。 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-Ⅱ. 邵贝贝译. 第
- 在uclinux下实现拨号(04-21)
- 基于uClinux嵌入式系统的汽车黑匣子的设计(07-08)
- uClinux进程调度器的实现分析(04-13)
- 嵌入式操作系统uCLinux详解(03-19)
- 多任务操作系统Nucleus简介(04-21)
- UC/OS与uClinux的比较(04-21)