基于GPRS modem的嵌入式Internet的实现

来源:互联网 发布:江西服装学院淘宝地址 编辑:程序博客网 时间:2024/04/29 00:15
摘要 本文根据现代信息农业的发展需求,在嵌入式无线远程环境监测系统的研究的基础之上,成功地完成了GPRSmodem的internet接入。远端基于ARM的嵌入式模块在μC/OS-II操作系统的调度下实现信号的采集,在通过串口与模块相连的GPRSmodem与Internet建立连接后,将数据发送到现场服务器,从而完成了底层的采集与发送。 正文 1.概述 无线通讯模块GPRS用于数据接入有着传输速率高、接入范围广、接入时间短、提供实时在线功能和按流量计费等优点[1] [2],同时随着GPRS技术在无线通信领域应用的不断拓展和深入,GPRS modem作为GPRS在Internet的PC机终端已经得到了广泛的应用。本课题组研制的“嵌入式无线远程环境监测系统”就成功的利用了这个技术,下面将详细介绍GPRS modem接入Internet进行数据传输,从而实现了底层的采集与上层的网络发布的连接。 GPRS接入Internet的系统设计 图1 GPRS接入Internet系统模型 本系统采用的是WAVECOM GPRS modem,这是一款内嵌TCP/IP/PPP协议的无线传输 模块,无须在ARM板内移植通讯协议,极大的缩短了开发周期。它适用于在GSM网络下实现各种无线业务,其中主要包括电话、短信、GPRS无线上网等业务。图1为GPRS接入Internet的系统模型,GPRS modem将底层电路板采集到的信息以无线传输方式发送出去,通过无线网络供应商转送到Internet,经由Internet最终进入数据处理中心。 底层核心板为本课题组自行研制,是一款以ARM7芯片LPC2210为核心处理器,有16KB片内静态RAM,通过外部存储器接口可将外部存储器配置成4组,每组的容量高达16Mb,满足μC/OS-II移植要求。本硬件设计有两个通用的九针232输入/输出串口,一个串口GPRS modem连接,另外一个串口通过转接器与传感器组相连实现数据的采集。 在GPRS的接入Internet并与远程的服务器接收端连接的设计中,关键的设计有三个方面,一是底层ARM板将数据通过串口发送到与之相连的GPRS modem上,二是在ARM CPU中移植嵌入式适时操作系统μC/OS-II,并在操作系统下实现任务的建立,三是在μC/OS-II下用AT指令实现GPRS modem与网络的连接。 μC/OS-II操作系统的移植与任务的建立 2.1操作系统的移植 移植[3] [5]工作主要针对三个与处理器相关的文件进行修改,使之与处理器相适合,即:C语言文件OS_CPU.H,OS_CPU_C.C和汇编文件OS_CPU_A.ASM。 (1)0S_CPU.H 编译器相关数据类型的设定:用#define语句定义两个宏开关中断 ②定义堆栈方向(从上向下递增):#define OS_STK_GROWTH 1 ③ OS_TASK_SW()、OSCtxSw ()的移植:#define OS_TASK_SW() OSCtxSw () μC/OS-II从低优先级任务切换到高优先级任务时,通过执行OS_TASK_SW()仿中断的产生。中断服务子程序的中断向量地址指向汇编语言函数OSCtxSw()。 (2)修改OS_CPU_C.C OS_CPU_C.C文件中需要用户定义6个C语言函数:OSTaskStklnit(),OSSTaskCreateHook(),OSTaskDelHook(),OS_TaskSwHook(),OSTaskStatHook(),OSTimeTickHook()。实际必须定义的只有OSTaskStklnit()函数,其它5个函数需要声明,但可以不加代码,但要将OS_CFG.H中的OS_CPU_HOOKS_EN设为0。 (3)修改OS_CPU_A.ASM OS_CPU_A.ASM中要改写四个汇编语言函数:OSStarHighRdy(),OSCtxSw() 2.2任务的建立[4] μC/OS-II是多任务嵌入式RTOS,最多可添加64个不同的任务[6],可以很好的满足系统设计的要求,在μC/OS-II下可以采用模块化设计,这样不同的任务的添加变得非常简单,同时极大的减小了编程的难度,增加了程序的可读性。基于此,在设计时将GPRS与网络的连接和信息的发送分成两个不同的任务建立,在任务的建立时首先要给任务定义自己的堆栈,由于系统中还有流水灯和多组传感器的采集,因此在设计时暂将GPRS的连接和数据的发送分别作为第四、第五个任务来编写。 OS_STK TaskStk4 [TaskStkLengh]; // 定义Task4的堆栈 OS_STK TaskStk5 [TaskStkLengh]; // 定义Task5的堆栈 void gprslianjie(void*pdata); // Task4 任务4 void shujufasong(void*pdata); // Task5 任务5 OS_EVENT *USEPORTMutex; int main (void) { OSInit (); //操作系统的初始化 OSTaskCreate (gprslianjie,(void *)0, &TaskStk4[TaskStkLengh - 1],7); //建立GPRS与网络连接的任务,任务名为gprslianjie OSTaskCreate (shujufasong,(void *)0, &TaskStk5[TaskStkLengh - 1],8); //建立数据发送的任务,任务名为shujufasong USEPORTMutex=OSMutexCreate(2,&err); OSStart (); return 0; } 因为GPRS与网络连接是本系统建立的第五个任务,所以定义时用TaskStk4表示它的堆栈名,由于设计时本着先采集再连接发送的思想,而且数据要按照一定的顺序定时发送,另外,还要避免资源的共享与冲突的出现,于是建立了互斥型信号量加以控制,并且数据发送任务的优先级要低于GPRS连接的优先级。其中阿拉伯数字7、8分别代表任务的优先级,需要指出的是数字越小,优先级别越高。 这样一来GPRS与网络连接的任务就在μC/OS-II中建立了。 GPRS modem的AT指令的介绍 限于篇幅,在本文中只介绍GPRS modem接入Internet和与服务器连接的必要指令,按照接入网络时需要发送AT指令的顺序介绍。 (1)AT,测试GPRS modem是否于ARM板连接好,正常时返回OK; (2)AT+CGCLASS=”B”,设置模块工作类型为B,正常时返回OK; (3)AT+CGDCONT=1,”IP”,”CMNET”,上网设置,只有开通GPRS功能的SIM卡可以使用,设置成功后返回OK; (4)AT+WOPEN=1,激活Q2406B中的TCP/IP协议栈,成功时返回OK; (5)AT+CGATT=1,GPRS附着到网络,成功后返回OK; (6)at#connectionstart,模块中封装的TCP/IP栈拨号并启动GPRS连接,成功后返回网关随机分配IP地址。 10.16.140.71 OK_Info_GprsActivation (7)at#tcpserv=1,"211.147.18.79",设置上位机(TCP server)的IP地址,成功后返回OK; (8)at#tcpport=1,"1433",设置上位机与Q2406B间的通讯端口,这需与服务器端正侦听的端口相同。成功后返回OK; (9)at#otcp=1,开启与上位机的通讯,成功后返回Ok_Info_WaitingForData从而进入等待输入数据的状态。 通过这九步的成功设置后GPRS modem就成功的与远程的服务器之间建立了连接,进入了数据的通讯状态。值得注意的是在编写程序过程中,在定义AT指令时,一条完整的AT指令可以用大写英文字符定义,也可以用小写的英文字符定义,但如果是在同一条指令中英文字符的大小写要一致。另外一点就是引号不能够省略,也不能够写成文本编辑状态下的双引号,否则GPRS modem不予辨别,如输入AT#tcpport=1,"1433"、at#tcpport=1,1143、at#tcpport=1,“1433” 等,通过串口返回的将都会是ERROR。 4.软件编程注意事项及流程图 由于通过GPRS modem实现通过无线网络与远程服务器的连接存在不稳定和掉线等情况,如当时所在地区GPRS网络不稳定。因此在编写程序的时候做了以下的 一些处理,以保证系统的连接和通讯处于正常和规范的状态。 (1)建立TCP连接的过程中要考虑到每一步可能会出现的错误,比如设备没有连接好、网络信号质量不高引起连接失败等,因此在程序设计的时候要做到两点,一是在modem依附到网络、启动GPRS连接以及开启与上位机的通讯等过程中从发送指令到接收指令之间要有一定的等待时间;二是所有的步骤中,需要判断从串口返回的字符串是不是表示ERROR,如果是则再发送一次该指令,再次对返回的字符串进行判断,如果显示操作成功则进入下一步,否则第三次发送该指令,第三次判断后如果还是显示操作失败则放弃本次TCP/IP的连接。 (2)由于两次发送数据之间有一定的时间间隔,在此期间也有可能因为一些因素造成连接关闭,因此在程序的编写过程中笔者采用每发送一次数据后自动让连接关闭,下次要发送数据时从新进行TCP的连接的机制。这样就避免了数据采集成功而发送不成功的隐患的出现。 图2为软件实现的流程图。 图2 GPRS接入Internet软件实现流程图 软件的实现 char str4[]="AT+CGATT=1/r"; char str5[]="at#connectionstart/r"; char *test="K"; char strget[100];char str8[]="at#otcp=1/r"; //部分字符串的定义 void gprslianjie (void *pdata) //Q2406B接入Internet的任务 { 。。。。。。。。。。。。。。。 while (1) {。。。。。。。。。。。。。。。 uart1_sendstr(str4); //进入TCP连接的第五步 OSTimeDly(OS_TICKS_PER_SEC*6); //延时等待串口返回数据 uart1_getstr( strget,16); //串口1接收Q2406B返回的字符串 value=strstr(strget,test); //判断返回字符串中是否有“OK“,有表示连接成功 if(value != NULL) //第一次连接如果成功 { uart1_sendstr(str5); //进入下一步 U1FCR=0X07;} //串口要及时清空,避免出现乱码 else if(value == NULL)//第二次连接及判断 { 。。。。。。。。。。else //第二次连接不成功则再次发送该指令 。。。。。。。。。。else OSTimeDly(OS_TICKS_PER_SEC);} //三次判断后连接不成功则 进行任务的下一次调度,退出本次连接 }。。。。。。。。。。。。。。。。。。。。} void shujufasong(void *pdata) { 。。。。。。。。。。。。。。。。。 while (1) { OSMutexPend(USEPORTMutex,0,&err);//等待互斥性信号量 uart1_sendstr(data);//data为采集到的数据,按照接收软件及数据库定义的格式定义 。。。。。。。。。。。。。。。。 uart1_sendstr(str8);//再次发送第九步AT指令,自动关闭连接 OSMutexPost(USEPORTMutex);//释放互斥性信号量 。。。。。。。。。。。。。。。。。。。。。。。。。。 }} 结束语 本设计利用WAVECOM (Q2406B) GPRS modem通过无线网络与远程服务器建立连接,实现了信息的采集与发布的有效统一,可用于各种条件下的远程的环境监测,具有比较大的现实意义及实用价值。当然本系统还有待完善,比如短消息功能和语音功能需要进一步的开发得以实现。 参考文献: [1]Theodore S. Rappaport, et al. Wireless Conmmunications: Past Events and a Future Perspective. IEEE Communications Maganine,50th Anniversary Commemorative Issue, May 2002:150~153. [2]李秀红,孙忠富,黄天戍.嵌入式系统在基于WEB的农业信息获取技术中的应用探讨.农业网络信息, 2005,12:34-37. [3]黄天戍 李秀红. RTOS 嵌入式实时多任务操作系统 嵌入式系统 μc/OS-Ⅱ.微计算机信息, 2005年 18期 . [4] 周立功等编著. ARM嵌入式系统基础教程.北京航空航天大学出版社 .2005.  [5] Jean J.Labrosse , MicroC/OS-II The Real-Time Kernel, Second Edition. Published by CMP Books , CMP Media LLC,2002. [6] Jane W S Liu.Real-Time Systems.New Jersey:Prenticc Hall,2000.
原创粉丝点击