알 수 없는 사용자 2013. 6. 14. 10:44
728x90
반응형

시리얼을 통하여 여러 센서의 값을 하나의 문자열로 받아 쉽게 파싱하는 방법을 공유합니다.

gcc 컴파일러에서만 될 수도 있는 비표준 코드이니 이런게 있다는 것만 알아두시길 바랍니다. 하지만 임베디드 리눅스에서는 압도적으로 gcc를 사용하니..


아래는 sscanf 의 사용과 gcc에서 지원하는 정규표현식을 이용하여 필요한 부분만을 재가공하여 넘겨주는 코드입니다.

사용방법은 어렵지 않으니 한번씩 해보시면 나중에 크게 도움될거라 생각합니다.


/* Vaisala WXT520 온도 습도 기압 값 파서 */                                 

int getSensorValue10sec_WXT520(multiSensorArr *valueFromSensor, char sensor)

{                                                                           

    float pressure;                                                         

    float temp;                                                             

    float humidity;                                                         

                                                                            

    char buff[20];              /* 쓸모없는 문자열을 저장 */                

                                                                            

    /* 센서가 출력한 아래와 같은 문자열을 파싱                              

     * 0R2,Ta=24.6C,Ua=55.1P,Pa=1005.5H */                                  

    sscanf(valueFromSensor -> rev10secBuff, "%[^=]=%f%[^=]=%f%[^=]=%f",     

           buff, &temp,                                                     

           buff, &humidity,                                                 

           buff, &pressure);                                                

                                                                            

    /* 요청받은 센서의 값을 리턴 */                                         

                                                                            

    switch (sensor) {                                                       

    case 'T':                   /* 온도 */                                  

        return (int)((temp + 100) * 10);                                    

    case 'H':                   /* 습도 */                                  

        return (int)(humidity * 10);                                        

    case 'P':                   /* 기압 */                                  

        return (int)(pressure * 10);                                        

    default:                                                                

    }                                                                       

                                                                            

    return 1;                                                               

}                                                                           


728x90