-1

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

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

4

1 回答 1

0

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

这是我收到的示例电报(我希望将值 3.0 放入“OutSideTemp”): $WIXDR,C,3.0,C,0,H,59.2,P,0,P,1026.9,H,0 4F $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,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);
}
于 2021-05-01T11:34:25.117 回答