胡菲菲
摘要 本文介绍了ARM9与μc-osII平台下通过GPRS模块收发中文短信息的实现。
关键词 嵌入式系统,短消息,gprs,图形用户接口
嵌人式系统广泛应用在很多产业中,如家电、医疗仪2S、工业控制和国防等领域。ARM32位体系结构当前被公认为业界领先的32位嵌入式RISC微处理器结构,拥有32位嵌入式的大部分市场份额。μc-osII是一个实时的任务调度及通信内核。已被应用到多种微处理器上,其大部分源码是由ANSIC语言编写的。GPRS是通用无线分组业务的缩写(General Packet Radio Service),是介于第一代和第二代移动通信技术之间的一种技术,通常称为2.5G,目前通过升级GSM网络实现。GPRS是分组交换技术,具有“高速”和“永远在线”的优点,特别适用于移动设备高速且不连续大量的数据通信。要在拥有实时操作系统的嵌入式系统上收发GPRS中文短消息,必须解决汉字的编解码和输入输出问题。本实验选用了图形用户接口。
一、 系统功能与构成
实现中文短消息收发的完整功能模块由键盘控制,屏幕输出,GPRS数据收发及处理三个部分组成。其中屏幕控制和键盘控制通过调用和完善操作系统API实现,另外为了更好的支持和显示中文字符,特别选用了图形用户接口。系统各部分构成如图1所示。
图1 系统各部分结构
具体流程如图2所示:
图2 发送信息处理
GPRS模块的初始化,由gprs_init()函数实现包括串口初始化、定时器中断初始化等工作,用gprs_pwr_on_off(GPRS_PWR_ON)实现GPRS模块复位。
键盘输入处理主要用于接收用户输入的号码,本实验中对键盘驱动进行适当修改,采用定时扫描的方式扫描键盘,在定时器中断服务函数中扫描键盘,获取键值后将其加入到缓冲区中,在主程序中通过 char gprs_get_key()函数获取键值,没有键按下时返回0。GPRS 发送短消息处理的状态图如图3所示。
图3 发送信息处理
二、 μc-osII移植
μc-osII是一种基于优先级可抢先的多任务硬实时内核,包含了任务调度、时间管理、内存管理和任务通信同步等操作系统的基本功能,但没有提供I/O 管理、文件系统、GUI 及TCP/ IP 服务。系统最多可管理64 个任务(其中8 个系统任务,56 个用户任务) ,中断管理可达255 层。μc-osII绝大部分代码是用C 语言编写的,只有与CPU 硬件接口相关部分是用汇编语言编写的,具有很好的可移植性,只要处理器具有堆栈指针、CPU 内部寄存器入栈出栈指令、能开关中断并且C 编译器支持内嵌汇编即可实现移植。
首先为编写INCLUDES. H 主头文件
//****************CPU**************//
#include "uhal/uhal.h"
#include "../inc/drivers.h"
#include "ucos_ii.h"
#include "add/osaddition.h"
移植uC/ OS2II 的主要工作就是修改uC/ OS2II内核源码中与CPU 有关的函数,包括OS_CPU. H、OS_CPU_A. ASM 和OS_CPU_C. C。经过移植操作系统后的MCU 就成为一个嵌入式开发平台,系统的各个功能是在uC/ OS2II 的管理下完成的。
程序清单在此不一一列举,以下是需要用到的字符处理函数的示例:
//int 到Unicode字符串的转换
void Int2Unicode(int number, U16 str[]);
//Unicode字符串到int的转换
int Unicode2Int(U16 str[]);
//char类型包括GB编码,到Unicode的编码转换
void strChar2Unicode(U16 ch2[], const char ch1[]);
void UstrCpy(U16 ch1[],U16 ch2[]);
三、GPRS与短消息 GPRS 网络是基于现有的GSM 网络来实现的。在现有的GSM 网络中需要增加一些节点,如GPRS 网关支持节点(Gateway GPRS Supporting Node, GGSN)和GPRS 服务支持节点 (Serving GPRS Supporting Node, SGSN)。SGSN 的主要作用是记录移动终端的当前位置信息, 并且在移动终端和GGSN 之间完成移动分组数据的发送和接收。GGSN 主要起网关作用,它可以和多种不同的数据网络连接,所以有时候也被称为GPRS 路由器。GGSN 可以把GSM 网中的GPRS分组数据包进行协议转换,从而把这些分组数据包传送到远端的TCP/IP 或X.25 网络。
通过GPRS 网络进行数据传输需要使用GPRS 模块。目前,GPRS 模块一般是指带有GPRS 功能的GSM 模块,可以利用GPRS 网络进行数据通信。GPRS 模块与开发板控制器之间通过串行口进行通信,通信速率最快可达到115 200bps。模块与控制器间的通信协议是AT 命令集。
收发短消息涉及的AT命令有:
(1) 选择短消息格式 发送AT+CMGF=n,由于我们要选择PDU格式,于是取n=0
(2) 设置短消息中心 AT+CSCA=<string>,string=”+8613********”,根据地点的不同选择相应的号码
(3) 发送短消息 发送AT+CMGS=n,n为短消息PDU包的字符数,等模块返回〉符号后,发送短消息的内容,以~Z结束,开始发送短消息。
(4) 阅读短消息 发送AT+CSMS=<index>,<index>是短消息在当前存储区的索引号。
(5) 短消息列表(PDU格式下) 发送 AT+CMGL=<mtype>,mtype表示短消息的类型,0是未读,1是已读,4是全部。
GPRS模块与S3C2410X的UART1进行通信,通过该串口,可以发送AT命令到GPRS模块并获取GPRS模块的输入。
如下函数发送cmdstring中的AT命令到GPRS模块中:
void gprs_send_cmd(char *cmdstring)
如下函数接收GPRS模块的数据,如果接收到正确的命令则返回GPRS_OK,否则返回GPRS_ERR:
int gprs_recv_cmd(char *cmd)
发送SMS信息一共有三种方式,Block Mode、Text Mode和PDU Mode。Block Mode目前很少使用,Text Mode是纯文本方式,可使用不同的字符集,主要用于欧美地区传送字母、数字字符等,而且不适合做自定义的数据传输,国内手机一般不支持,PDU Mode支持所有手机,可以使用任何字符集,是当前大部分手机默认的编码方式。
四、 PDU模式收发短信
PDU串表明上是一串ASCII码,由0~9,A~F这些数字和字母组成,是八位字节的十六进制数或BCD码十进制数。
例如向手机号码“13951083725”发送一条“你好”的短消息(USC2编码),(length>为18,<pdu>代码则为“0891683110301405F011000D91683159013827F5000800044F60597D";
对照规范,有如下发送PDU串对照表如表1所示:
|