Arduino2013. 7. 27. 17:39

현재 저는 아두이노에서 두개의 시리얼 통신을 구동하고 있습니다. Serial1에서는 IMU와의 시리얼통신을, Serial에서는 안드로이드와의 통신을 합니다.

 

아두이노에서 시리얼 통신 하는건 안드로이드에 비해 비교적 간단한데요,

 

setup() 함수에 Serial.begin(9600); 하시고 필요할 때마다 Serial.print("blah blah");하면 되는 간단한 코딩인데 이 포스팅에서는 제가 헷갈렸던 write함수와 print함수에 대해 설명하겠습니다.

 

(- 함수 작동 양상에 대해 서술하므로 실제 코딩과는 약간 다른점이 있을 수 있습니다.)

 

시리얼 통신이 1바이트(8비트)가 최소 단위라는건 다들 아실겁니다.

 

write함수가 바로 1바이트씩 쓰는 함수인데요, Serial.write(36); 하면 00100100 이 전송되는거죠

 

하지만,

 

print함수는 다릅니다. Serial.print(36)하면 "3"과 "6"이 각각 아스키 코드값으로 변해서 두 바이트로 전송됩니다.

 

즉, Serial.print(36)은 00100100도 아니고 00000011, 00000110 두 바이트도 아니라 00110011, 00110110 이게 전송된다는 겁니다.

 

이거 때문에 한참 고생했네요 ... ㅠ

 

그리고 안드로이드와 통신할 때 아두이노 측 Serial.read() 함수는 Rx버퍼 맨 앞에 있는 한 바이트를 int형으로 반환하고 가져올 게 없을때에는 -1을 반환합니다. 즉, while문으로 read의 결과가 -1일때까지 읽어오면 쉽게 받아오실 수 있습니다. (저는 읽어와서 링버퍼에 저장)

 

그리고 나머지 코딩은 패킷을 정하고 링버퍼를 통해 데이터를 뽑아 쓰는 형식으로 구현했습니다. [안드로이드 편 참고]

 

밑에 주요 소스코드 첨부하오니 이해하는데 참고하세요~

 

 

Posted by 너를위한노래