-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 つは気温、もう 1 つは雨情報です。

私が興味を持っているのは、値「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 に答える