티스토리 뷰

Arduino

[Arduino] Converting Element

생각많은 소심남 2012. 5. 16. 00:21

그냥 닥치는대로 뭐좀 해보려고 합니다.

이번 포스트에서 다룰 내용은 아두이노를 이용한 문법 공부중 개체변환에 대해서 언급해보고자 합니다. 물론 저도 초보자인 만큼 최대한 쉽게 나아가려고 합니다.

 보통 개체변환이라고 하면 어떤게 있을까요? C에는 대표적인 함수가 atoi()가 있습니다. 뭐 종류에 따라서는 itoa()도 있고 어떤거는 ltoa() 함수도 있습니다. 그런데 이게 뭘 의미하는 걸까요?

 컴퓨터는 사실 문자를 못 읽습니다. 우리가 지금 타자를 치고 있는 모든 문자... 이건 숫자가 어떠한 변환과정을 거쳐서 문자로 보여지고 있는 것일 뿐입니다. 문자각각에 해당하는 코드가 읽고 컴퓨터는 그 코드를 문자로 변환해서 우리가 보고 있는 겁니다. 이 코드가 바로 ASCII 코드이며 지금 위에 나오는 a에 해당하는 문구가 바로 ASCII의 A에서 나온겁니다.

결론적으로 말하자면 to를 가운데에 두고 양쪽에 있는 것이 바로 자료형이 되는 것이죠. 그래서 atoi는 ASCII코드를 integer 즉 정수로 바꿔주는 함수가 될 것이고 itoa는 그 반대가 될겁니다. 뒤에 잠깐 소개해드린 ltoa는 long to ASCII인데 우선은 이 함수로 예시를 들어보겠습니다.

 

 

맨날 하는 이야기지만 컴퓨터와의 통신을 위해서는 아두이노와 컴퓨터간의 baud rate이 같아야 합니다. 그래야 동기화가 되지요. 우선은 9600bps로 설정하고 빈 buffer를 12개 생성합니다. 다음은 loop에 채울 내용인데 한번 다음과 같이 치고 결과를 확인해봅니다.

 

 

자 한번 결과를 예상해봅시다. 우선 첫번째 구문은 long형 으로 선언된 value를 정수형으로 변환시키고 buffer에 넣었을때 버퍼의 크기를 측정하는 겁니다. 만약 ltoa에 의해서 정상적으로 정수형으로 변환되었다면 buffer의 size는 5가 될겁니다.

참고로 ltoa(a,b,n)은 다음과 같이 사용합니다.

- ltoa(a,b,n) : a라는 long형 변수를 b라는 버퍼속에 n진수로 변환시켜서 집어넣는다.

그럼 위에서 설명한 ltoa(value,buffer,10)이라고 하면 value를 buffer에 10진수 정수로 변환시킨다는 말이 되겠습니다.

그럼 밑의 결과는 9가 찍히게 될겁니다. 한번 확인해볼까요? 아두이노에 롬업한후 Tools의 Serial Monitor로 살펴봅니다.

 

 

당연히 loop에 들어가 있기 때문에 지금 이문구는 반복되어서 나옵니다. 이렇게 ltoa가 정상적으로 동작하는 것을 확인할 수 있습니다. 그럼 이걸 왜 사용하는 걸까요?

사실 long형 자료형을 쓰면서 가장 우려되는 문제점은 바로 오버플로우라는 겁니다. 가령 버퍼의 크기가 한정되어있는데 그 값을 초과하는 수를 버퍼에 담다보면 넘치는 것이 생깁니다. 반면 위와 같이 문자열로 바꿔서 저장한 후 다시 정수형으로 쓰도록 한다면 이전에 담을 수 있는 범위보다 훨씬 크게 사용할 수 있는 겁니다.

 결론으로 말하자면 지금까지 한것은 숫자를 문자열로 바꿔서 저장하는 구문이었습니다.

 

댓글