欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > Linux交叉编译gpsd移植至arm板

Linux交叉编译gpsd移植至arm板

2025/2/8 11:20:04 来源:https://blog.csdn.net/m0_73406058/article/details/145483403  浏览:    关键词: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的交叉编译到移植到程序测试就完成了

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com