基于CDMA模块的车载监控终端的设计方案
1.DTGS-800 简介
DTGS800 是AnyDATA 公司生产的一款CDMA 无线通信模块。
DTGS800 工作在832MHz 频段,功耗为0.32W,拥有高达153kbps 的数据传输速率,可通过AT 命令进行远程控制,内置TCP/IP 协议栈,提供短消息服务。模块内部集成了具有gpsOne 功能的芯片, 能够采用gpsOne 解决方法实现定位功能。
DTGS800 的模块主要接口包括:通用异步串行口UART,通用I/O口GPIO、编解码器接口CODEC、用户接口User Interface、PM 接口。
2.系统硬件设计
车载监控终端主要用来与监控中心进行实时的信息交互, 包括:
获取车辆的位置信息、速度信息;发布调度信息;在车辆出现异常情况下进行远程控制。另外给车辆司机提供移动通信服务,可利用此模块拨打和接听电话,甚至可以进行三方通话。其硬件系统是一个综合利用电子技术和通信技术的嵌入式单片机系统,主要由控制器和通信模块两部分组成。
控制器是车载监控终端的核心,它对整个系统的安全运行、可靠性有很大影响。本设计中CPU 选用了ATMEL 公司的8 位单片机89C51RD2, 它是CMOS 单片8 位微控制器80C51 的高性能CMOSFLASH 版本。其特性包括:1 个64-Kbyte FLASH 存储区,用于存储代码和数据;256 字节的内部RAM,1 个9 源4 级中断控制器和3 个定时/计数器;1 个1792 字节的XRAM,1 个硬件看门狗定时器,SPI 接口,键盘,1 个更加通用的串行频道,便于多处理器通信(EUART)和加速机制(X2 Mode)。
这款CPU 采用全静态设计,减少了系统功耗,允许时钟频率降至任何数值而不导致数据损失。另外有两种软件可选的工作模式,降低8 位时钟分频器的活动状态,进一步减少了功耗。空闲模式下,CPU 被冻结,而外设和中断系统继续工作。在掉电模式,RAM 内容被保存,而其他所有功能都无效。
系统的框架图如下所示:
图1 系统结构框架图
3.系统软件设计
系统以任务的形式对软件功能进行模块划分,软件实现的任务包括:任务调度;车辆位置信息、速度信息的获取;短信息的接受、处理与发送;电话的拨打与接听;屏幕显示。
程序流程为:车辆发动之后,系统上电,首先进行系统初始化,然后开定时中断与串口中断,启动完毕后启动进入中断监听状态,每隔10ms 扫描一次串口buffer 中的数据,并根据不同的状态调用不同的接口函数实现各种功能。车辆监控终端最重要的任务就是实时交通信息的获取和传输数据, 下文着重介绍GPS 信息的获取和短消息的接收与发送。
3.1 串口中断函数
在本系统中,处理器对DTGS800 模块的控制是通过串口发送AT 指令实现的, 当发送某种AT 命令后,DTGS 模块会通过串口与处理器进行数据交换。因此,如何进行串口数据管理是系统性能优劣的关键。在本文的设计中,采用了基于中断的管理方式,并设置了一个200Bytes 的串口缓冲区,以循环队列的形式实时读取串口的接收数据。实现的步骤如下:
3.1.1 定义全局变量
#define REC_BUF_LEN 200
idata volatile BYTE datain;输入数据的长度
idata volatile BYTE dataout;;输出数据的长度
BYTE xdata dat[REC_BUF_LEN]; 串口缓冲区
3.1.2 操作函数的实现
bit BuffOut(BYTE *dp);从缓冲区读出数据
bit BuffIn( BYTE *dp);向缓冲区写入数据
3.1.3 中断函数
处理器与DTGS800 模块之间通过串口通信,当接收短信息,有来电提醒时,都会引发串口中断,因此串口中断函数的核心就是将接受数据存储到循环队列中。其实现的流程图如下:
图2 中断函数流程图
3.1.4 接口函数
在实际工作状态下,通话任务,短信息任务都需要通过串口向DTGS800 模块发送数据, 这些任务的实质都是向串口发送字节数据。因此接口函数最重要的就是定义发送字节函数,定义如下:
void WriteToComm(BYTE c)
{
SBUF = c;
while (! TI);
TI = 0;
}
3.2 系统任务设计
{$page$}
根据不同的任务定义了不同的系统状态,其中一部分定义如下:
typedef enum
{
SYS_NET_FAIL, 网络不通
SYS_MISSED_CALL, 未接来电
SYS_CALL_SPEAKING, 通话中
SYS_END_CALL, 挂电话
SYS_GET_GPS_INFO, 获得GPS 数据
SYS_SMS_INFO, 短消息接收
SYS_SMS_DISPLAY, 短信息显示
}sys_app_sta;
系统启动完毕以后,进入main 函数中的死循环,对不同状态响应不同的任务。以未接来电为例,定义如下函数:
if(cmp_com_str("MISSED_CALL ",Locat,1)) 判断状态
{
Missed_call_deal(); 未接来电处理函数
dataout = Locat;//go
Reccnt = Reccnt -4;
clrline(line_1);
display_app(0x82, "未接电话:"); 显示函数
start_nom_ref();
Sys_state = SYS_IDLE_STATE; 进入空闲态
break;
}
3.2.1 定位任务
定位任务负责采集车辆的交通信息,包括经度、维度、速度、行进方向等,在发送定位命令之前首先查询模块的工作状态,然后通过串口发送AT 命令进行定位请求,如果串口接收到"OK"信息,则系统进入到SYS_GET_GPS_INFO 状态。
接收的数据首先存储在串口的buffer 中,定义了如下GPS 数据处理函数:
typedef struct
{
BYTE UTC[10]; //时间
BYTE Latitude[10]; //纬度
BYTE Longitude[11]; //经度
BYTE rec_flg; //状态
BYTE Velocity[5]; //速度
BYTE Direction[5]; //方向
}GPS_STR;
void Gps_Data(WORD head) 将数据读入到GPS 数据buffer 中
void GpsData_PRO(void) 解析GPS 中的相关信息以方便进一步处理;
GPS 数据解析完成以后,再利用短消息的形式将车辆的交通信息发送到监控中心。
3.2.2 短信息任务
DTGS800 提供了两种不同的短信息服务协议,一种为简单协议,适合于一些简单的应用,一种为扩展协议,收发的格式比较复杂。本系统采用了扩展的SMS 协议。
3.2.2.1 短消息发送流程
1)给模块发送命令"AT+CAD? "检测模块的工作状态,如果返回值为1 表示模块工作正常;如果为0 则表示模块暂时不可用,等待几秒空闲后再进行检测;2)给模块发送命令"AT+SMSS? ",通过返回值检测模块的状态,如果模块返回值为3,表示模块等待接受发送的数据;3)发送解析的GPS 信息,又一次给模块发送命令"AT+SMSS? ",如果模块返回值为1,表示发送信息成功;4)调用显示函数,在屏幕上显示"短信息发送成功".
3.2.2.2 短消息接受流程
1)判断系统状态,如收到短信,给模块发送命令"AT+SMSR",读取收到的短信息;2) 对收到的短信息做数据处理, 存放在Buffer 中; 调用函数UnicodeToGB()将收到的Unicode 码转化为GBK 码;3)调用显示函数循环显示未读取的短信息,当用户读取信息后,系统返回到空闲态,等待下一步的指令。
4.结论
通过系统实测,发现本车载监控终端系统可以很好的实现车辆交通信息的采集,接收监控中的调度信息、控制信息,具有通信可靠、良好的扩展性等特点。