当前位置: 首页 > article >正文

Linux交叉编译gpsd移植至arm板

本文根据Linux-交叉编译-gpsd_gpsd 编译-CSDN博客这位大佬的文章进行扩展,解决我个人遇到的bug以及后续gps的具体应用

我是在第四步交叉编译 gpsd时报错

cgps.c:96:10: fatal error: curses.h: No such file or directory
96 | #include <curses.h>
| ^~~~~~~~~~
scons: *** [cgps.o] Error 1

原因是找不到这个curses的头文件,但我已经按照博主文章讲的将预先编译准备好的依赖库文件放至gpsd的源码目录了,仍然找不到这个curses的头文件,按理来说是能找到的,因为我预先编译的其他库文件编译时程序都能找到,唯独libncureses这个库出问题,只能手动导出ncureses的头文件目录,以下是导出命令,各位要根据自己的ncureses源码目录进行更改

export CFLAGS="-I/home/shanghai/gpsd/ncurses-6.1/arm_install/include -I/home/shanghai/gpsd/ncurses-6.1/arm_install/include/ncurses"

导出后即可正常编译,按照原博主所说,得到了编译好后的gpsd文件,用file命令检查确实是arm平台的文件,现在把gpsd这个文件复制到arm板上的/usr/sbin目录,在arm板上输入gpsd -h,发现报错找不到curses.h头文件,果然这个地方底层应该是有错误的,只好再把pc机上交叉编译好后的libncurses.so.6文件复制到arm板上的/usr/lib目录中,再次执行gpsd -h命令,正确输出了帮助信息

移植成功后,就开始对gpsd进行实际代码测试,我的arm是正点原子的stm32mp157,gps模块使用了移远ec20的gnss,正常使用流程需要先开启gps对话(开启对话后大概30s左右才能获取到定位信息)

echo -e "AT+QGPS=1\r\n" > /dev/ttyUSB2

然后gps的NMEA数据会从/dev/ttyUSB1串口输出,我们只需要使用cat命令查看这个串口输出的数据即可

cat /dev/ttyUSB1

可观察到 ttyUSB1 输出 NMEA 数据,如下:

$GPVTG,123.4,T,125.7,M,0.0,N,0.0,K,A*26
$GPRMC,075835.00,A,2231.527159,N,11356.035560,E,0.0,123.4,211117,2.3,W,A*21
$GPGSA,A,2,10,12,15,18,20,21,24,25,32,,,,1.0,0.7,0.8*33
$GPGSV,3,1,12,10,36,327,33,12,28,113,32,15,20,060,43,18,66,354,26*79
$GPGSV,3,2,12,20,35,119,26,21,46,215,29,24,48,035,40,25,23,156,31*70
$GPGSV,3,3,12,31,01,217,18,32,22,285,27,14,11,271,,51,,,34*4D
$GPGGA,075836.00,2231.527167,N,11356.035581,E,1,09,0.7,50.4,M,-1.0,M,,*48

然后我们使用gpsd来管理/dev/ttyUSB1串口,使用它与这个串口数据进行通讯
首先要确保使能了gps对话

echo -e "AT+QGPS=1\r\n" > /dev/ttyUSB2

然后输入命令

gpsd /dev/ttyUSB1

使用ps命令查看gpsd的进程

ps aux | grep gpsd

结果如下,gpsd正常运行

nobody    1074  0.6  0.1  10764  1596 ?        S<s  23:51   0:00 gpsd /dev/ttyUSB1
root      1077  0.0  0.1   6824  1632 ttySTM0  S+   23:51   0:00 grep gpsd

我们现在使用qt程序通过tcp通讯访问gpsd的默认端口2947

#include "mainwindow.h"
#include <QApplication>
#include <QTcpSocket>
#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTcpSocket socket;

    // 连接到gpsd的默认端口
    socket.connectToHost("127.0.0.1", 2947);

    if (socket.waitForConnected()) {
        qDebug() << "Connected to gpsd.";
        // 向gpsd发送命令请求 NMEA 输出
        socket.write("?WATCH={\"enable\":true,\"json\":false,\"nmea\":true}\r\n");
        socket.flush();

        // 循环读取gpsd的数据
        while (socket.waitForReadyRead(1000)) {  // 等待1秒钟数据就绪
            QByteArray response = socket.readAll();
            qDebug()  << response;

        }

        socket.close();
    } else {
        qDebug() << "Failed to connect to gpsd.";
    }

    return a.exec();
}

arm板的终端应该会输出如下NMEA数据

$GPVTG,123.4,T,125.7,M,0.0,N,0.0,K,A*26
$GPRMC,075835.00,A,2231.527159,N,11356.035560,E,0.0,123.4,211117,2.3,W,A*21
$GPGSA,A,2,10,12,15,18,20,21,24,25,32,,,,1.0,0.7,0.8*33
$GPGSV,3,1,12,10,36,327,33,12,28,113,32,15,20,060,43,18,66,354,26*79
$GPGSV,3,2,12,20,35,119,26,21,46,215,29,24,48,035,40,25,23,156,31*70
$GPGSV,3,3,12,31,01,217,18,32,22,285,27,14,11,271,,51,,,34*4D
$GPGGA,075836.00,2231.527167,N,11356.035581,E,1,09,0.7,50.4,M,-1.0,M,,*48

至此,gpsd的交叉编译到移植到程序测试就完成了


http://www.kler.cn/a/536387.html

相关文章:

  • VUE 集成企微机器人通知
  • 网络面试题(第一部分)
  • C++, STL容器 array:固定大小数组深度解析
  • 哈希(Hashing)在 C++ STL 中的应用
  • Linux学习笔记16---高精度延时实验
  • 代码随想录算法训练营| 二叉树总结
  • CI/CD相关概念
  • AWS 上的 Red Hat OpenShift 服务
  • uniapp 使用 tree.js 解决模型加载不出来的问题
  • Python办公笔记——将csv文件转Json
  • c#对接deepseek 聊天AI接口
  • 使用数学工具和大模型结合训练专有小模型(有限元算法和大模型微调)
  • 使用 Docker 部署 RabbitMQ 的详细指南
  • 紧跟潮流,将 DeepSeek 集成到 VSCode
  • Windows 电脑安装 mysqldump 的详细教程
  • 数据结构与算法面经
  • ZooKeeper相关知识点
  • C++ Primer 递增和递减运算符
  • 配置#include “nlohmann/json.hpp“,用于处理json文件
  • 【c++】析构函数
  • pytest-xdist 进行多进程并发测试!
  • 团建 蓝桥杯省a 15
  • AI死亡脱离控制器
  • webpack配置方式
  • DeepSeek和ChatGPT的对比
  • Compose 面试题