簡體   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