繁体   English   中英

使用 c 程序读取 NMEA 字符串

[英]Using a c-program to read an NMEA-string

我正在尝试制作一个将字符串的c程序,但我希望它只读取其中的一小部分。 我尝试阅读的 NMEA 电报是 $WIXDR,并且确实收到了必要的字符串。 这是我进入 CPU 的 2 个字符串示例:

$WIXDR,C,1.9,C,0,H,83.2,P,0,P,1023.9,H,0*46
$WIXDR,V,0.01,M,0,Z,10,s,0,R,0.8,M,0,V,0.0,M,1,Z,0,s,1,R,0.0,M,1,R,89.9,M,2,R,0.0,M,3*60

如果它只有 1 个字符串(不是 C 和 V),这对我来说不是问题。 这里的问题是它是 2 个单独的字符串。 一个是温度,一个是雨信息。

我唯一感兴趣的是值“1.9”来自

$WIXDR,C,1.9,C,0......

这是我到目前为止所拥有的:

void ProcessXDR(char* buffPtr)
{
    char valueBuff[10];
    int result, x;
    float OutSideTemp;
    USHORT uOutSideTemp;
//  char charTemperature, charRain
    IODBerr eCode;

    //Outside Temperature
    result = ReadAsciiVariable(buffPtr, &valueBuff[0], &buffPtr, sizeof(valueBuff));
    sscanf(&valueBuff[0],"%f",&OutSideTemp);
    OutSideTemp *= 10;
    uOutSideTemp = (USHORT)OutSideTemp;
    eCode = IODBWrite(ANALOG_IN,REG_COM_XDR,1,&uOutSideTemp,NULL);
    
}


            // XDR ...
            if(!strcmp(&nmeaHeader[0],"$WIXDR"))
            {
                if(PrintoutEnable)printf("XDR\n");
                ProcessXDR(buffPtr);
                Timer[TIMER_XDR] = 1200;          // Update every minute
                ComStateXDR = 1;
                eCode = IODBWrite(DISCRETE_IN,REG_COM_STATE_XDR,1,&ComStateXDR,NULL);
            }

还有更多,但这是我拥有的主要部分。

我已经找到了我自己的问题的答案。 按照我的意图执行的代码如下:我的小代码的作用是查找字母 C,如果找到 C,它将取其后的值并将其放入“OutSideTemp”。 我不得不寻找 C 的原因是也收到了一个类似的字符串,带有字母 V(Rain)。 如果有人有任何意见,它可能会更好,我不介意,但是这里的这个小部分可以满足我的需要。

这是我收到的示例电报(我希望将值 3.0 放入“OutSideTemp”中):$WIXDR,C,3.0,C,0,H,59.2,P,0,P,102096美元。 ,V,0.00,M,0,Z,0,s,0,R,0.0,M,0,V,0.0,M,1,Z,0,s,1,R,0.0,M,1,R ,89.9,M,2,R,0.0,M,3 58

void ProcessXDR(char* buffPtr)
{
char valueBuff[10];
int result, x;
float OutSideTemp;
USHORT uOutSideTemp;
//  char charTemperature, charRain
IODBerr eCode;

//  Look for "C"
result = ReadAsciiVariable(buffPtr, &valueBuff[0], &buffPtr, sizeof(valueBuff));
//  sscanf(&valueBuff[0],"%f",&charTemperature);
if (valueBuff[0] == 'C')

//Outside Temperature
result = ReadAsciiVariable(buffPtr, &valueBuff[0], &buffPtr, sizeof(valueBuff));
sscanf(&valueBuff[0],"%f",&OutSideTemp);
OutSideTemp *= 10;
uOutSideTemp = (USHORT)OutSideTemp;
eCode = IODBWrite(ANALOG_IN,REG_COM_XDR,1,&uOutSideTemp,NULL);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM