如何同步NMEA gps语句的输出

How to sychronize the output of NMEA gps sentences

我有两个功能:

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 消息 text/line 基于:

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

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