공부/아두이노(Arduino)

USART - 아두이노

도도-도윤 2017. 10. 20. 18:03
USART - 아두이노



1. USART 개요

시리얼 통신(serial communication)은 기기들간 데이터를 주고 받는 방법 중 하나인데 병렬 통신 (parallel communication) 방식에 비해서 통신선의 갯수가 적다는 장점이 있습니다.


아두이노는 USART (Universal Asynchronous/Asynchronous receiver and transmitter), SPI, I2C 방식의 시리얼 통신을 지원하는데 이중 UART는 주로 아두이노와 PC간의 통신을 하는데 사용 됩니다.

아두이노는 하나 이상의 UART 통신기가 내장되어 있는데 라이브러리와 IDE에 내장된 터미널(terminal, 주고 받는 데이터를 확인할 수 있는 프로그램)을 이용하면 손쉽게 PC와의 통신을  수행할 수 있습니다.





2. USART는 직렬 포트를 가질 수 있는 가능성을 제공합니다.

예를 들어 부트 로더를 통해 Arduino에 프로그램을 업로드하고 마이크로 컨트롤러와 컴퓨터 사이에 통신 채널을 만들거나 일부 센서 / 칩과 통신하는 데 사용할 수 있기 때문에 가장 많이 사용되는 것들은 LCD 용 직렬 백팩입니다.


거의 항상 직렬 인터페이스를 사용하는 그래픽 lcd 및 GPS 모듈이 있습니다.


직렬 프로토콜은 수년 전에 만들어진 Teletypes와 터미널, 또한 견고한 프로토콜 (긴 전송선을 처리 할 수있는 경우, 적어도 + 12v와 -12v 이상을 포함하는 RS-232 표준을 사용할 때 잡음에 면역성이 있음.) 직렬 프로토콜은 데이터를 수신하고 데이터를 전송하는 2 개의 와이어를 사용하며 물론 아두이노(Arduino) / 마이크로 컨트롤러와 다른 장치 사이에 공유 접지가 있어야 합니다.


직렬 인터페이스는 시작 비트 1 개와 정지 비트 1 바이트의 작은 블록으로 데이터를 전송하며 USART는 시작 및 정지 비트 설정에 대한 모든 작업을 수행합니다.

직렬 프로토콜의 클럭 신호는 암묵적입니다.

즉, 이는 데이터 스트림에 "결합"되어 있으며 한 장치에서 다른 장치로 클럭을 전송하기 위해 별도의 전선을 사용할 필요가 없습니다.

즉, USART 우리가 사용하고자하는 클럭 속도 (이것은 Baud Rate)와 USART 모듈이 Heavy Lift를 맡아서 처리할 것입니다.

RS-232 프로토콜에 대해 좀 더 알고 싶다면, 이 위키피디아 페이지를 읽으십시오.

프로토콜에 대해 좀 더 알고 싶지만 필수 사항은 아닙니다.
http://en.wikipedia.org/wiki/RS-232

또한, 항상 우리가 필요로하는 모든 정보로서 atmega328p의 데이터 시트를 가지고 있으면 좋을 것입니다. 여기에 링크하십시오 :
http://www.atmel.com/dyn/resources/prod_documents/doc8271.pdf

그리고 작은 스텁 프로그램을 만들 수도 있습니다. 기본 프로그램과 기본 기능으로 AvrStudio에서 새 프로젝트를 시작할 때마다 사용하는 기본 프로그램이 될 것입니다.


https://hekilledmywire.wordpress.com/2011/01/05/using-the-usartserial-tutorial-part-2/



3. 소스 코드



 #define F_CPU 16000000

 #include <avr/io.h>
 #include <util/delay.h>


 #define BAUDRATE 9600
 #define BAUD_PRESCALLER (((F_CPU / (BAUDRATE * 16UL))) - 1)


 //Declaration of our functions

 void USART_init(void);
 unsigned char USART_receive(void);
 void USART_send( unsigned char data);
 void USART_putstring(char* StringPtr);


 char String[]="Hello world!!";


 int main(void){
 
     USART_init();        //Call the USART initialization code
 
     while(1){        //Infinite loop
   
             USART_putstring(String);    //Pass the string to the USART_putstring function and sends it over the serial
             _delay_ms(5000);        //Delay for 5 seconds so it will re-send the string every 5 seconds
  
     }
 
      return 0;
 }


 void USART_init(void){
 
       UBRR0H = (uint8_t) ( BAUD_PRESCALLER >> 8);
       UBRR0L = (uint8_t) ( BAUD_PRESCALLER );
       UCSR0B = ( 1 << RXEN0 ) | (1 << TXEN0 );
       UCSR0C = ( 3 << UCSZ00 );
 
 }


 unsigned char USART_receive(void){
 
       while(!(UCSR0A & (1 << RXC0)));
               return UDR0;
 
 }

 void USART_send( unsigned char data){
 
        while( ! ( UCSR0A & (1 << UDRE0) ) );
               UDR0 = data;
 
 }


 void USART_putstring(char* StringPtr){
 
        while(*StringPtr != 0x00){
  
           USART_send( *StringPtr );
           StringPtr++;
  
        }
 
 }

 usart.cpp


usart.zip




usart.zip
0.0MB