gpt4 book ai didi

c - 如何通过带有 c 的串行端口从带有 NMEA 协议(protocol)的 GPS 模块获取数据

转载 作者:行者123 更新时间:2023-11-30 16:16:34 25 4
gpt4 key购买 nike

我需要从 GPS 模块获取数据,该数据通过串行端口以 NMEA 协议(protocol)传入,输入如下所示:

$GPRMC,190335.389,V,3754.931,N,08002.496,W,33.6,0.59,110619,,E*47 $GPGGA,190336.389,3754.931,N,08002.496,W,0,00,,,M,,M,,*52 $GPGLL,3754.931,N,08002.496,W,190337.389,V*33 $GPVTG,0.59,T,,M,33.6,N,62.2,K*5C $GPRMC,190339.389,V,3754.932,N,08002.494,W,11.9,0.62,110619,,E*4D $GPGGA,190340.389,3754.932,N,08002.494,W,0,00,,,M,,M,,*52 $GPGLL,3754.932,N,08002.494,W,190341.389,V*33

问题是,我只需要以 GPRMC 开头的行。问题是数据是异步传入的,例如,首先是一行的前半部分,然后是另一半和另一行的一些,依此类推。现在我怎样才能逐行获取输入并且只获取以 GPRMC 开头的输入。输入源源不断,我需要实时获取正确的线路。我怎样才能用C 做到这一点?

我真的不知道如何从串行端口读取数据,我尝试了一些方法,但因为输入是异步的,所以我无法获得正确的行。哦,还有一件事,一行的最大长度是 83。

这是我尝试过的一些代码,我知道它很糟糕

int a = 0;
int test = 0;
int gprmc_find(char* gps)
{
while(a < strlen(gps))
{
if(gps[a] =='$' && gps[a+1] == 'G' && gps[a+2] == 'P' && gps[a+3] == 'R' )
{
test = 1;
break;
}
else
{
test = 0;
}
a++;
return test;
}
}
int main()
{

DWORD accessdirection =GENERIC_READ | GENERIC_WRITE;
HANDLE hSerial = CreateFile("COM4",
accessdirection,
0,
0,
OPEN_EXISTING,
0,
0);
if (hSerial == INVALID_HANDLE_VALUE) {
printf("Invalid\n");
}

DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams)) {
printf("could not get the state of the comport\n");
}
dcbSerialParams.BaudRate=9600;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;
if(!SetCommState(hSerial, &dcbSerialParams)){
printf("Error\n");
}
COMMTIMEOUTS timeouts={0};
timeouts.ReadIntervalTimeout=50;
timeouts.ReadTotalTimeoutConstant=50;
timeouts.ReadTotalTimeoutMultiplier=10;
timeouts.WriteTotalTimeoutConstant=50;
timeouts.WriteTotalTimeoutMultiplier=10;
if(!SetCommTimeouts(hSerial, &timeouts)){
printf("handle error1");
}
char buf[83] = {0};
while(1)
{


DWORD dwBytesRead = 0;

//CloseHandle(hSerial);

if(!ReadFile(hSerial, buf, 82, &dwBytesRead, NULL)){
printf("handle error");
}
printf(" %d \n", test);
if(gprmc_find(buf) == 1)
{
printf(buf);
}
memset(buf, 0, 83);
delay(1);
}
return 0;

}

最佳答案

GPS NMEA 0183是基于文本的协议(protocol),可以使用独立于平台的C语言标准库进行处理。
许多库和解析器已经开发出来,您无需重新开发即可使用它们。

例如,您可以在 StackOverflow 网站上找到这篇文章:
NMEA library - nmeaINFO empty/NMEA Library
C Gps nmea parser from linux serial port does not parse the last line of the read buffer
Parsing code for GPS NMEA string

其他网站:
MULTI-PLATFORM SERIAL INTERFACING USING BOOST: A GPS SENSOR AND OPENDDS - PART I/PART II

这些是解析器,解析读取数据的库。
jacketizer/libnmea
kosma/minmea
MaJerle/GPS_NMEA_parser

在上述库中进行分析后,您应该只使用您想要的数据。

关于c - 如何通过带有 c 的串行端口从带有 NMEA 协议(protocol)的 GPS 模块获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56550514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com