如何同步 NMEA gps 语句的输出

问题描述

我有两个功能:

string get_GPGGA() {
// read_gga_sentence extract only gga
return gps.read_gga_sentence();
}

string get_GPGSA() {
// read_gsa_sentence extract only gsa
return gps.read_gsa_sentence();
}

int main() {
    while(true) {
    cout << get_GPGGA();
    cout << get_GPGSA();
    }
}

问题是,gps 模块在一秒内传输了 4 个句子。所以我第一次调用 read_gga_sentence() 时,我已经丢弃了所有其他句子并保留了 gga。与 read_gsa_sentence 相同。但我发现这会在我的程序中造成延迟,因为一旦我调用第一个 get_GPGGA(),它会等待 1 秒,然后我可以调用 get_GPGSA()。但是,我希望能够在同一 1 秒内将它们全部打印

这里需要多线程吗?

解决方法

你不需要多线程,只需要缓冲和一个 gps.Read() 函数。 您使用哪个库?

GPS 消息是基于文本/行的:

$GPGGA,092750.000,5321.6802,N,00630.3372,W,1,8,1.03,61.7,M,55.2,*76
$GPGSA,A,3,10,07,05,02,29,04,08,13,1.72,1.38*0A
$GPGSV,11,63,137,17,61,098,15,59,290,20,54,157,30*70
$GPGSV,2,39,223,19,28,070,26,23,252,14,186,14*79
$GPGSV,09,301,24,16,020,36,*76
$GPRMC,0.02,31.66,280511,A*43
$GPGGA,092751.000,00630.3371,55.3,*75
$GPGSA,15*77
$GPGSV,0.06,A*45

读取它们并将每一行存储在缓冲区中。 然后从末尾开始读取缓冲区并找到最后一个 GGA 消息。

您的代码可能类似于

// wait 1 GPS message
string get_GPGGA() {
buffer.add(gps.Read()); 
// read_gga_sentence extract only gga
return buffer.read_last_gga_sentence();
}

string get_GPGSA() {
// Wait 1 GPS message
buffer.add(gps.Read()); 
// read_gsa_sentence extract last gsa
return buffer.read_gsa_sentence();
}

int main() {
    while(true) {
    cout << get_GPGGA();
    cout << get_GPGSA();
    }
}

创建一个 GPSBuffer 类

class GPSBuffer {
   void add(string msg);
   string read_last_gga_sentence();
   string read_last_gga_sentence();
} buffer;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...