Arduino

dtostrf(), sprintf()

기하 2023. 1. 26. 23:38

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kaiserkhan21&logNo=221042305919 

 

[아두이노] format을 가진 출력을 위한 sprintf( ), dtostrf( )

아두이노에서 직렬통신 또는 LCD 등에 문자열을 출력할 수 있다. 이 때, format을 가진 내용을 단순히 p...

blog.naver.com

 

아두이노에서 직렬통신 또는 LCD 등에 문자열을 출력할 수 있다.
이 때, format을 가진 내용을 단순히 print( )라는 함수만으로 구현하기는 귀찮은 면이 있다.

이 때 사용하는 함수가 sprintf( )이다.
이 함수는 아두이노를 구성하는 AVR에서 제공하는 함수이다.

int sprintf( char *buffer , const char *format[,argument]...)


C-언어에서 printf( )가 문자열을 화면에 출력하는데 비해
sprintf( )는 첫번째 매개변수인 buffer에 출력한다.
즉, 출력할 내용이 문자열 buffer에 저장된다.

이 문자열 buffer[]를 전송하면 format이 있는 양식으로 직렬포트 또는 LCD에 출력할 수 있다.

char buffer[20];
int num1 = 12345;
char c = 'A';
char str[] = "Hello";
sprintf(buffer , "%6d , %x, %c, %s", num1, num2, c, str);

Serial.print(buffer);

 

그런데 아두이노에서는
실수(float, double)를 sprintf( )로 출력하면 정상적인 값이 출력되지 않고 '?'가 출력된다. 
이 때 dtostrf( )를 이용하여 실수를 문자열로 변환한 후
sprintf( ) 등으로 format을 지정할 수 있다.

char* dtostrf( double _val, signed char _width, unsigned char _prec, char *_s)

  _val : 변환하고자 하는 double, float 데이터
  _width : 소숫점을 포함한 전체 자리수
  _prec : 소숫점 이하 자리수
  _s : 변환된 문자열. 문자열을 선언할 때 적어도 _width+1 이상의 크기를 가져야 정상적으로 저장된다.

 

char temp[20];
char buffer[20];
int i = 123;
float f = 32.4;
char c = 'A';
char str[] = "Hello";

dtostrf(f, 4, 1, temp);
sprintf(buffer, "%d , %s , %c , %s", i, temp, c, str);

Serial.print(buffer);