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的交叉编译到移植到程序测试就完成了