【问题标题】:Using a c-program to read an NMEA-string使用 c 程序读取 NMEA 字符串
【发布时间】:2021-05-01 20:49:26
【问题描述】:

我正在尝试制作一个可以处理字符串的 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);
            }

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

【问题讨论】:

  • 您实际上并没有提出具体问题,也没有描述代码中出现的具体问题。为什么CV 会给您带来问题?如果您需要进一步的帮助,请提供完整的代码 aminimal reproducible example,并在代码中明确说明具体问题。
  • “我唯一感兴趣的东西”听起来像是在寻找某种投影,但很难说。
  • 对于包含“C”的字符串,我希望它将“C”之后的值写入uOutsideTemp。对于包含“V”的字符串,我不希望它做任何事情。对我来说唯一有趣的是这种情况下的值“1.9”。
  • 完整代码大约 1800 行...它用于读取不同的 nmea-strings(不仅是 XDR)发送值给 conning,还有更多...所有其他 nmea-strings 都在工作正如预期的那样,但这对我来说是新的。我有字符串,但不知道如何收集 1.9 的一个值并将其写入 uOutsideTemp

标签: c nmea xdr


【解决方案1】:

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

以下是我收到的电报示例(我希望将值 3.0 放入“OutSideTemp”): $WIXDR,C,3.0,C,0,H,59.2,P,0,P,1026.9,H,04F $WIXDR,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,358

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);
}

【讨论】:

  • 通常在此类程序中,您只需阅读一整行,然后一次用if (fscanf(input_stream, " $WIXDR,C,%f,%*[^\n]", &val) == 1) 解析它。参见 gpsd 来源。 NMEA 行中的字符数有上限 - 该格式专门设计用于在小型设备中轻松使用。
猜你喜欢
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
相关资源
最近更新 更多