烧录Raspbian官方Linux固件版本,设置无线连接和远程登录(SSH)后开始集成千寻SDK。

此处如有问题请参考树莓派官方说明:
点击下载千寻位置树莓派SDK: https://bbs.qxwz.com/job.php?action=download&aid=1501

1、下载后解压

2.    编辑demo_main.c,将你申请到的千寻位置FindM Pro账号信息输入到这个文件里面

登录千寻位置官网控制中心(https://www.qxwz.com/),找到FindM Pro服务器实例,简单起见将设备服务号绑定方式设置为自动绑定,设备激活方式设置为自动激活。也可以按需设置。

DEVICE_ID和DEVICE_TYPE一行可以不变,也可以随意指定。如果在这个服务实例下面有多个账号,一个账号过期后如果需要继续使用另一个账号,需要在千寻位置账号端做解绑操作。

MC120_SERIAL_DEV为千寻开发板连接到树莓派的串口设备号,需通过如下命令获取:

保存退出

3.    编译SDK

4.    运行

如下图,是已经得到了高精度固定解:

/** Copyright (c) 2018 Qianxun SI Inc. All rights reserved.*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include "qxwz_sdk_hl.h"//this is fake account info,please use the corrent to replace it.#define APPKEY                  "123451"
#define APPSECRET               "61377185f39e5abf7c1eb1dba30dc6224efaf368a70a89653abde13f991c84af"
#define DEVICE_ID               "ID01"
#define DEVICE_TYPE             "typeA"#define MC120_TYPE_M              0
#define MC120_TYPE_A              1//root working dir which QXWZ SDK has write/read permission
#define ROOT_DIR                "./data/"
//NOTE:Magic Cube Device Node, please use the correct dev node according to your platform.
#define MC120_SERIAL_DEV         "/dev/ttyUSB0"
#define DEFAULT_SERIAL_BAUT     (115200)
#define DEFAULT_MC120M_BAUT     (9600)
// since the MC120_TYPE_M device only ouput nmea sentence in 1HZ(1000ms).
#define SERIAL_TIME_OUT_MS      (1050)#define QXLOGI printf
#define QXLOGE printf//commands to config ublox for MC120M, send these commands to MC120M before inject magic cubic data to QXWZ SDK
static unsigned char cmd10[] = { 0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0x02, 0x15, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x28, 0x4E }; //1 02-15 RXM-RAWX    16
static unsigned char cmd13[] = { 0xB5, 0x62, 0x06, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD0, 0x08, 0x00, 0x00, 0x00, 0xC2, 0x01, 0x00, 0x07, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x7E }; // 115200
//static unsigned char cmd15[] = { 0xB5, 0x62, 0x06, 0x3E, 0x34, 0x00, 0x00, 0x00, 0x20, 0x06, 0x00, 0x08, 0x10, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x08, 0x10, 0x00, 0x01, 0x00, 0x01, 0x01, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x01, 0x01, 0x14, 0xE1};    //GPS+BD
static unsigned char cmd15[] = { 0xB5, 0x62, 0x06, 0x3E, 0x3C, 0x00, 0x00, 0x00, 0x20, 0x07, 0x00, 0x08, 0x10, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x08, 0x10, 0x00, 0x01, 0x00, 0x01, 0x01, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x01, 0x06, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x01, 0x01, 0x2E, 0x75};  //GPS+BD+QZSSstatic unsigned char cmd22[] = { 0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 0x01, 0x06, 0x01, 0x12, 0x4F };    //NAV_SOL
static unsigned char cmd23[] = { 0xB5,0x62,0x06,0x31,0x20,0x00,0x00,0x01,0x00,0x00,0x32,0x00,0x00,0x00,0x40,0x42,0x0F,0x00,0x40,0x42,0x0F,0x00,0x00,0x00,0x00,0x00,0xA0,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0xF7,0x00,0x00,0x00,0xCA,0xB6 };//PPS
static unsigned char cmd24[] = {0xB5,0x62,0x06,0x08,0x06,0x00,0xC8,0x00,0x01,0x00,0x01,0x00,0xDE,0x6A};//5HZ
static unsigned char cmd25[] = {0xb5, 0x62, 0x06, 0x01, 0x08, 0x00, 0x02, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x25, 0x3d}; //sub-framestatic int g_serial_fd = 0;//handler of serial device.
static QXWZSdkConfig default_cfg = {0}; //default config of QXSDK.static int hl_main_opt(const char *dev, int type);
static int do_sdk_loop(int serial_fd, QXWZSdkConfig *pcfg);/***  change baut rate and set flags.*/
static int set_serial_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop)
{QXLOGI("Enter \n");struct termios newtio = {0};newtio.c_cflag  |=  CLOCAL | CREAD;newtio.c_cflag &= ~CSIZE;newtio.c_iflag &= ~( IXON | IXOFF | IXANY | ICRNL | INLCR | IGNCR );//for linuxswitch ( nBits ) {case 7:newtio.c_cflag |= CS7;break;case 8:newtio.c_cflag |= CS8;break;}switch ( nEvent ) {case 'O':newtio.c_cflag |= PARENB;newtio.c_cflag |= PARODD;newtio.c_iflag |= (INPCK | ISTRIP);break;case 'E':newtio.c_iflag |= (INPCK | ISTRIP);newtio.c_cflag |= PARENB;newtio.c_cflag &= ~PARODD;break;case 'N':newtio.c_cflag &= ~PARENB;break;}switch ( nSpeed ) {case 2400:cfsetispeed(&newtio, B2400);cfsetospeed(&newtio, B2400);break;case 4800:cfsetispeed(&newtio, B4800);cfsetospeed(&newtio, B4800);break;case 9600:cfsetispeed(&newtio, B9600);cfsetospeed(&newtio, B9600);break;case 115200:cfsetispeed(&newtio, B115200);cfsetospeed(&newtio, B115200);break;case 230400:cfsetispeed(&newtio, B230400);cfsetospeed(&newtio, B230400);break;default:cfsetispeed(&newtio, B9600);cfsetospeed(&newtio, B9600);break;}if ( nStop == 1 )newtio.c_cflag &=  ~CSTOPB;else if ( nStop == 2 )newtio.c_cflag |=  CSTOPB;newtio.c_cc[VTIME]  = 0;newtio.c_cc[VMIN] = 1;newtio.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);//for linuxnewtio.c_oflag &= ~OPOST;/*No Output Processing*/tcflush(fd, TCIOFLUSH);if ((tcsetattr(fd, TCSANOW, &newtio)) != 0) {perror("com set error");return -1;}QXLOGI("Leave \n");return 0;
}/***  make sure send out the whole frame.*/
static void send_cmd2mc(int fd, unsigned char *cmd, int len)
{int offset = 0;size_t wcnt = 0;int total = len;do {wcnt = write(fd, cmd + offset, total);if (wcnt <= 0) {QXLOGI("write cmd to ublox failed....\n");usleep(1000);continue;} else {offset += wcnt;total -= wcnt;}} while (total > 0);}/***  read data from seiral in noblock mode,and inject the data to QX NSDK.*/
static int serial_poll(int serial_fd, QXWZSdkInterface *sdk_hl)
{fd_set input;int max_fd;int n;unsigned char data[4096];struct timeval  tv;while (1) {/* Initialize the input set */FD_ZERO(&input);FD_SET(serial_fd, &input);max_fd = serial_fd + 1;tv.tv_sec = SERIAL_TIME_OUT_MS / 1000;tv.tv_usec = (SERIAL_TIME_OUT_MS % 1000) * 1000;/* Do the select */n = select(max_fd,  &input, NULL, NULL, &tv);/* See if there was an error */if (n < 0) {perror("select failed");
//            break;continue;} else if (n == 0) {QXLOGE("serial read timeout in :%d (ms) \n", SERIAL_TIME_OUT_MS);} else {/* We have input */if (FD_ISSET(serial_fd, &input)) {size_t len = read(serial_fd, data, sizeof(data));if (sdk_hl && (len > 0) ) {sdk_hl->inject_gnss_data(data, len);}}}}return 0;
}/***  @seiral_dev: the device name of the seiral in linux host.*  @type: MC120_TYPE_M or MC120_TYPE_A.*/
static int hl_main_opt(const char *serial_dev, int type)
{QXLOGI("Enter \n");int ret;int set_gps;int serial_fd;QXWZSdkConfig * pcfg = &default_cfg;int baut = DEFAULT_SERIAL_BAUT;default_cfg.size           = sizeof(QXWZSdkConfig);default_cfg.log_enable     = 1;default_cfg.apply_scenario = QXWZ_GNSS_APPLY_SCENE_AUTOROOF;//customer should set this args by their scenario.sprintf(default_cfg.app_key, "%s", APPKEY);sprintf(default_cfg.app_secret, "%s", APPSECRET);sprintf(default_cfg.device_id, "%s", DEVICE_ID);sprintf(default_cfg.device_type, "%s", DEVICE_TYPE);sprintf(default_cfg.root_dir, "%s", ROOT_DIR);sprintf(default_cfg.socket_dir, "%s", "/tmp");sprintf(default_cfg.cfg_filename,"./%s","testCfg.ini");QXLOGI("current account info: %s %s %s %s \n",pcfg->app_key,pcfg->app_secret,pcfg->device_id,pcfg->device_type);QXLOGI("opening device :%s \n", serial_dev);/* O_RDWR Read/Write access to serial port           *//* O_NOCTTY - No terminal will control the process   *//* O_NDELAY -Non Blocking Mode,Does not care about-  *//* -the status of DCD line,Open() returns immediatly */serial_fd = open(serial_dev, O_RDWR | O_NONBLOCK | O_NOCTTY); //open serialif (serial_fd == -1) {QXLOGI("open :%s failed \n", serial_dev);return -1;}/* NOTE: MUST CONFIG MC120M BY THESE COMMANDS BEFORE INJECT SERIAL DATA to QXWZ SDK */if (type == MC120_TYPE_M) {baut = DEFAULT_MC120M_BAUT;QXLOGI("communicate baut is %d \n", baut);set_gps = set_serial_opt(serial_fd, baut, 8, 'N', 1); //setting serial attributionif (set_gps == -1) {QXLOGI("config serial device failed on setting \n");return -1;}QXLOGI("start reading... \n");//configure for the MC120_TYPE_M moduleQXLOGI("configure the device....\n");sleep(1);send_cmd2mc(serial_fd, cmd10, sizeof(cmd10));usleep(100000);send_cmd2mc(serial_fd, cmd15, sizeof(cmd15));usleep(100000);send_cmd2mc(serial_fd, cmd25, sizeof(cmd25));usleep(100000);send_cmd2mc(serial_fd, cmd22, sizeof(cmd22));usleep(100000);send_cmd2mc(serial_fd, cmd23, sizeof(cmd23));usleep(100000);send_cmd2mc(serial_fd, cmd13, sizeof(cmd13)); //change baud rate to 115200sleep(1);QXLOGI("configure over\n");close(serial_fd);QXLOGI("re-opening device %s\n", serial_dev);serial_fd = open(serial_dev, O_RDWR | O_NONBLOCK | O_NOCTTY); //open serialif (serial_fd == -1) {QXLOGI("open :%s failed \n", serial_dev);return -1;}}baut = DEFAULT_SERIAL_BAUT;QXLOGI("communicate baut is %d \n", baut);set_gps = set_serial_opt(serial_fd, baut, 8, 'N', 1); //CHANG BUADif (set_gps == -1) {QXLOGI("failed to change baut:%d \n", baut);return -1;}g_serial_fd = serial_fd;/* After setting serial device, here start to read data & inject data to QXSDK  */ret = do_sdk_loop(serial_fd, pcfg);close(serial_fd);g_serial_fd = 0;QXLOGI("Leave");return ret;
}//TODO: User should implement this callback if want to get position information by NMEA
static void cb_fill_nmea_info(QXGnssUtcTime time, const char* nmea, int len)
{if (nmea) {QXLOGI("nmea:%s", nmea);}
}//TODO: User should implement this callback if want to get position information by paramter
static void cb_fill_position(QXWZGnssLocation *pos)
{if (pos) {QXLOGI("posflag:%d \n", pos->posflag);}
}//NOTE: Write raw data back to Magic Cube device
static void cb_fill_raw_data(unsigned char *buf, int len)
{if (buf) {QXLOGI("len:%d \n", len);}if (g_serial_fd > 0) {send_cmd2mc(g_serial_fd, buf, len);}
}//Notify status of SDK
static void cb_status_response(QXWZSdkStatus status)
{QXLOGI("status:%d \n", status);
}/*  * This is demonstrating the API using.*/
int do_sdk_loop(int serial_fd, QXWZSdkConfig* pcfg)
{int ret;const QXWZSdkInterface *sdk_hl = NULL;QXWZSdkCallbacks cbs;memset(&cbs, 0, sizeof(QXWZSdkCallbacks));cbs.size            = sizeof(cbs);cbs.fill_nmea_info  = cb_fill_nmea_info;cbs.fill_position   = cb_fill_position;cbs.fill_raw_data   = cb_fill_raw_data;cbs.status_response = cb_status_response;sdk_hl = getQXWZSdkInterface();//User should notify SDK of network status immediately once the network changes.//sdk_hl->update_conn_status(QXWZ_NET_TYPE_WIFI);sdk_hl->init(&cbs, pcfg);sdk_hl->start();/* [raw] => [QXSDK] */ret = serial_poll(serial_fd, (QXWZSdkInterface *)sdk_hl);sdk_hl->stop();sdk_hl->cleanup();QXLOGI("Leave");return ret;
}/* This is a demo, Users need to operate UART of MC120A/MC120M, and inject data from UART to QXWZ SDK,* and control the call sequence */
int  main(int argc, char *argv[])
{return hl_main_opt(MC120_SERIAL_DEV, MC120_TYPE_M);
}

https://bbs.qxwz.com/read.php?tid=1222

如何使用树莓派 连接千寻开发板开发高精度应用相关推荐

  1. FL2440(S3C2440A 芯片) 开发板开发笔记

    FL2440(S3C2440A 芯片) 开发板开发笔记 开发板的拨码开关指南: FL2440 改 vnfg 飞凌嵌入式 www. witech. com. cn 09. 8. 22 1 开发板使用手册 ...

  2. 地平线X3开发板开发环境搭建

    地平线X3开发板开发环境搭建 文章目录 地平线X3开发板开发环境搭建 开发环境搭建 安装CMAKE 交叉编译工具 下载编译AIEXPRESS demo演示 视频盒子使用HDMI显示 使用摄像头演示 m ...

  3. Hi3516DV300双目开发板开发环境搭建

    Hi3516DV300双目开发板开发环境搭建 一.软件包安装 1. 展开sdk包 2.安装交叉编译himix200 3.编译整个osdrv 4. SDK 目录介绍 二.烧写 uboot.kernel. ...

  4. 如何使用潘多拉连接千寻开发板开发高精度应用

    所需设备: 潘多拉开发板 (淘宝链接) 注意:购买时请注意屏幕背面上方的版本号,我购买的是V2.61版本,其他版本的串口布局不一样,在代码编写时需要注意,我会在代码一节详细标书. 千寻魔方110M开发 ...

  5. 迅为4412开发板开发笔记--开发板与主机和ubuntu的ping通

    说明:这部分内容在uboot初步认识中有提到,但还是要需要单独将它拿出来说明一下.开发板与主机的ubuntu的ping通相当重要,理解了如何连接开发板与你的主机,可以让你在开发的过程中节省很多时间. ...

  6. 【RISC-V】SiFive Unmatched开发板开发手记

    1. 开发环境搭建 本次使用官方FUSDK(GitHub:sifive/freedom-u-sdk: Freedom Unleashed Software Development Kit (githu ...

  7. Android开发板开发总结

    ADB常见命令 adb connect ip[:port]:连接Android开发板(要求开发板开启ADB服务) adb disconnect ip:断开与Android开发板的连接 adb shel ...

  8. JZ2440 S3C2440 开发板开发步骤 之 uboot烧录 参数设置 裸机烧录 kernel烧录(openJTAG oflash usb 串口 dnw tftp nfs )

    刚接触JZ2440开发板的通过看视频就知道怎么下载程序和各个开发步骤,但是已经过了好几年,至少快三年了,有些东西也忘记得差不多了,今天稍用很快的速度快进方式看了下视频,回忆起了一点,但不全部看完,此处 ...

  9. TDA4 J721 EVM开发板开发学习

    TDA4系列文章目录 前言 最近入手了一套TDA4 J721 EVM开发板,对这套版没什么经验,只是TI的开源库比较多,需要一部分一部分找,后续根据这套开发开发进程一部分一部分开发. 一.今天根据开发 ...

  10. TDA4开发板开发学习

    新入手一块TDA4 J721 EVM开发板,寻求对这块板有开发需求的同仁一起开发.有需求的私信,谢谢!

最新文章

  1. 利用.htaccess绑定子域名到子目录(亲测万网可用)
  2. .NET项目开发的几个非常重要的项目设置
  3. 数据库9:联结表 高级联结 组合查询 全文本搜索
  4. 【原创】FPGA (Verilog/NIOS II/Microblaze) 编程小提醒
  5. 推荐 GitHub 2K+ 星:前端监控工具 - webfunny 项目
  6. 2018山东省省赛 问题 H: Dominoes
  7. linux查看文件使用情况,linux查看文件句柄使用情况
  8. 大家都关注的Serverless,阿里怎么做的?
  9. 金山词霸怎样才能在PDF阅读器(ADOBE 7.0/9.0)上取词翻译
  10. 重返opencv——视频编码和格式
  11. 智慧城市智慧路灯解决方案
  12. cocoa-CoreData
  13. repo的安装和使用
  14. 长文详解材料阻燃性能试验方法
  15. Arranging The Sheep 中位数定理
  16. 哈佛大学公开课《死亡》
  17. 黑莓java文件怎么安装程序_黑莓开发环境搭建windows7+eclipse+BlackBerry Java Plug+JDK6...
  18. I2C总线的SDA和SCL
  19. MYSQL高可用环境搭建
  20. iOS-APP启动完成过程,以及耗时优化

热门文章

  1. 清空计算机搜索文件历史记录,如何查找已删除的浏览历史记录
  2. 用计算机画图截图图片,电脑怎么截图
  3. x5675相当于e5_2020年最新桌面CPU性能排行天梯图(含至强处理器)
  4. Python自动发抖音脚本教程(1:介绍和源码)
  5. 如何制作PE盘和系统启动盘
  6. Error response from daemon: failed to parse mydockerfile-centos: ENV must have two arguments
  7. linux网络打印机设置,linux下怎么使用网络打印机
  8. 《SEM长尾搜索营销策略解密》一一2.5 长尾,互联网时代生存的良药
  9. 《SEM长尾搜索营销策略解密》一一2.13 ZARA,零售界的长尾赢家
  10. 使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(概念篇)