下面讲解 RT-Thread 提供的 QXWZ_SDK 示例代码,功能示例代码如下:
#include <rtthread.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <rtdbg.h>
#include <board.h>
#include "qxwz_types.h"
#include "qxwz_sdk.h"
#include "qxwz_api.h"
/*连接M110M串口信息*/
#define SAMPLE_UART_NAME "uart3"
/*输出gga信息文件路径*/
static char* file = "/qxwz_report.txt";
/*上报SDK GGA标志*/
static int report_flag = 0;
static rt_mutex_t dynamic_mutex = RT_NULL;
static struct rt_semaphore net_ready;
static const qxwz_usr_config_t s_config;
static char s_gga[256] = {0};
static int report_flag;
static int stopflag;
static void report_gga(char *gga, qxwz_u32_t len);
/*注册到SDK的数据回调函数,sdk会将差分rtcm数据通过该回调函数上报*/
static void receive_iprtcm(qxwz_void_t *rtcm, qxwz_u32_t len, qxwz_data_type_e type)
{
static unsigned int rtcmcouter = 0;
/*将上报的差分rtcm数据通过该函数写入M110M芯片进行差分纠偏解算*/
write_to_uart(rtcm,len);
rtcmcouter++;
if(rtcmcouter >300){
stopflag = 1;
}
}
/*注册到SDK的状态码回调函数,sdk会将运行状态或错误信息通过该回调函数上报*/
static void receive_status(qxwz_s32_t status)
{
rt_kprintf("got rtcm status=%d\n",status);
/*收到1007状态码,证明鉴权通过,可以上报GGA启动差分数据下发*/
if(1007 == status)
{
report_flag =1;
/*读取串口数据*/
start_uart(SAMPLE_UART_NAME,file,report_gga);
}
}
/*GGA上报回调函数,会将串口读取的GGA数据保存在本地*/
static void report_gga(char *gga, qxwz_u32_t len)
{
rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
memcpy(s_gga,gga,len);
rt_mutex_release(dynamic_mutex);
}
qxwz_data_response_t data_res = {
receive_iprtcm,
NULL
};
qxwz_status_response_t status_res = {
receive_status
};
/*用户账号信息*/
static const qxwz_usr_config_t s_config = {
"",
"",
"",
""
};
/*应用入口函数*/
int qxwz_appliction(void)
{
int result = RT_EOK;
/* 初始化文件系统 */
/* 初始化网络连接功能 */
dynamic_mutex = rt_mutex_create("dmutex", RT_IPC_FLAG_FIFO);
if (dynamic_mutex == RT_NULL)
{
rt_kprintf("create dynamic mutex failed.\n");
return -1;
}
static int s_current_time = 0;
qxwz_s32_t ret = 0;
/*获取当前系统时间*/
s_current_time = time(NULL);
/*配置用户账号信息*/
qxwz_setting(&s_config,QXWZ_FALSE);
/*启动SDK服务,注册数据回调,状态码回调函数到sdk*/
ret = qxwz_start(&data_res,&status_res);
if(0 != ret)
return 0;
int j = 0;
while(1){
if(stopflag){
/*停止读取串口信息,关闭串口*/
stop_uart();
/*停止/释放SDK资源*/
qxwz_stop();
}
/*时间节拍函数,驱动sdk运行*/
ret = qxwz_tick(s_current_time);
/*时间节拍函数返回为0,表示sdk处于空转状态,可以退出*/
if(ret == 0)
{
break;
}
rt_thread_mdelay(1000);
s_current_time += 1;
if((report_flag)&&(j>5)){
rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
/*通过此函数向SDK注入GGA数据*/
qxwz_send_data(s_gga, strlen(s_gga), UDATA_GGA);
rt_mutex_release(dynamic_mutex);
j = 0;
}
j++;
}
/*释放用户账号信息*/
qxwz_release();
return 0;
}