如何解决如何同步 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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。