ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • UART 통신
    Arduino/Atmel Studio 2021. 1. 5. 12:02

    UART통신을 위해서는 아두이노와 컴퓨터만 연결하면 된다. 
    아두이노의 tx,rx통신
    직렬통신에는 9개의 핀이 있다.
    그중에 rx,tx핀을 가장 많이 이용한다.

    jwRsMonitor 프로그램이 필요하다.

    jwRsMonitor (1).exe
    0.95MB

    우선 데이터를 전송만 하는 방식을 알아보자.

    소스는 아래와 같다. 그리고 빌드를 하고 아두이노에 업로드를 하자.

     

    소스 내용

    더보기
    	
    #include <avr/io.h>
    #define F_CPU 16000000UL	//	16MHz
    
    void PutChar0(char c);
    
    int main(void)
    {
        UCSR0B = 0x08;		//	Tx만, 즉 전송만 한다.
    	UCSR0C = 0x06;
    	
    	//	바운드 레이트 설정. 115200으로 설정		
    	//UBRR0H = 0;
    	//UBRR0L = 8;
    	
    	//	바운드 레이트 설정. 9600으로 설정
    	UBRR0H = 0;
    	UBRR0L = 103;
    	
        while (1) 
        {
    		PutChar0( 'H' );
    		PutChar0( 'i' );
    		PutChar0( '!' );
        }
    }
    
    void PutChar0(char c)
    {
    	//	데이터가 들어오지 않았다면 while문 반복
    	while ( !( UCSR0A & 0x20 ) );
    	
    	//	데이터를 저장
    	UDR0 = c;
    }

     

    그리고 jwRsMonitor 프로그램을 실행하자. 프로그램에서 Hi! 가 전송되는 것을 볼 수 있다.

    위의 소스에서 baud rate를 9600으로 설정했으므로 프로그램에서도 9600으로 설정한다.

    만약, 바운드 레이트를 9600으로 변경하면 이상한 글자가 찍힌다.
    그래서 바운드 레이트를 설정하는 것이 중요하다.

    그리고 Port는 자기가 쓰고 있는 포트로 선택을 한다.

    아두이노에서 Serial.begin과 역할이 같다.

    아래와 같이 Port있는 칸에 클릭을하면 포트를 선택할 수 있다.

     

     

     

    문자열을 전송하는 프로그램을 만들어보자.

    소스 내용

    더보기
    #define F_CPU 16000000UL	//	16MHz
    #include <avr/io.h>
    #include <util/delay.h>
    
    /*	문자 하나를 전송하는 함수	*/
    void PutChar0(char c);
    
    /*	문자열을 전송하는 함수	*/
    void Puts0(char* str);
    
    /*	문자열을 수신하는 함수	*/
    char Gets0(void);
    
    void Init_UART0(void)
    {
    	//	UCSR0B는 Tx, Rx를 설정한다. Tx(08), Rx(10)으로 설정
    	UCSR0B = 0x18;		//	Tx와 Rx를 설정한다. 송/수신 가능하도록 설정
    	UCSR0C = 0x06;		//	8bit data, no parity(0), 1 stop bit(0) 설정
    	
    	//	바운드 레이트 설정. 9600baud rate로 설정. 115200baud rate는 8로 설정
    	UBRR0H = 0;
    	UBRR0L = 103;
    }
    
    int main(void)
    {
    	Init_UART0();
    	
    	while (1)
    	{
    		Puts0( "123" );	//	문자열을 전송
    		_delay_ms(500);
    	}
    }
    
    /*	문자 하나를 전송하는 함수	*/
    void PutChar0(char c)
    {
    	//	5번째 비트가 켜져있지 않으면 while문이 무한 반복하는데
    	//	5번째 비트가 켜지는 순간에 while 루프를 빠져나와서 데이터를 전송하는 원리
    	
    	//	데이터가 들어오지 않았다면 while문 반복
    	while ( !( UCSR0A & 0x20 ) );	//	5번째 bit를 사용
    	
    	//	데이터를 전송
    	UDR0 = c;
    }
    
    /*	문자열을 전송하는 함수	*/
    void Puts0(char* str)
    {
    	while ( *str != '\0' )
    	{
    		PutChar0(*str);
    		str++;
    	}
    }
    
    /*	문자열을 수신하는 함수	*/
    char Gets0(void)
    {
    	//	데이터가 들어오지 않았다면 while문 반복
    	while ( !( UCSR0A & 0x80 ) );	//	RXC가 Set(8번째 자리)되어 있어야 한다.
    	
    	//	데이터를 리턴
    	return UDR0;
    }

    아래의 시리얼 프로그램에서 포트와 바운드 레이트를 설정하면 문자열 "123"이 출력된다.

     

     

     

     

    이번에는 송수신이 모두 가능한 프로그램을 만들어보자.

     

    소스 내용

    더보기
    	
    #include <avr/io.h>
    #define F_CPU 16000000UL	//	16MHz
    
    /*	문자 하나를 전송하는 함수	*/
    void PutChar0(char c);
    
    /*	문자열을 전송하는 함수	*/
    void Puts0(char* str);
    
    /*	문자열을 수신하는 함수	*/
    char Gets0(void);
    
    void Init_UART0(void)
    {
    	//	UCSR0B는 Tx, Rx를 설정한다. Tx(08), Rx(10)으로 설정
    	UCSR0B = 0x18;		//	Tx와 Rx를 설정한다. 송/수신 가능하도록 설정
    	UCSR0C = 0x06;		//	8bit data, no parity(0), 1 stop bit(0) 설정 
    	
    	//	바운드 레이트 설정. 9600baud rate로 설정. 115200baud rate는 8로 설정
    	UBRR0H = 0;
    	UBRR0L = 103;
    }
    
    int main(void)
    {
    	char* str;
    	char c;
    	char prompt[] = "user>>";
    	Init_UART0();
    	
    	while (1)
    	{
    		c = Gets0();	//	데이터를 가지고 온다.
    		PutChar0(c);	//	다시 돌려준다. ( echo작업 )
    		
    		//	엔터키가 입력되면 ( 시리얼 통신 창에서 입력 )
    		if ( c == '\r' )
    		{
    			PutChar0('\n');	//	개행을 한다. ( 줄 바꿈 )
    			
    			str = prompt;
    			
    			Puts0(str);
    		}
    	}
    }
    
    /*	문자 하나를 전송하는 함수	*/
    void PutChar0(char c)
    {
    	//	5번째 비트가 켜져있지 않으면 while문이 무한 반복하는데
    	//	5번째 비트가 켜지는 순간에 while 루프를 빠져나와서 데이터를 전송하는 원리
    	
    	//	데이터가 들어오지 않았다면 while문 반복
    	while ( !( UCSR0A & 0x20 ) );	//	5번째 bit를 사용
    		
    	//	데이터를 전송
    	UDR0 = c;
    }
    
    /*	문자열을 전송하는 함수	*/
    void Puts0(char* str)
    {
    	while ( *str != '\0' )
    	{
    		PutChar0(*str);
    		str++;
    	}
    }
    
    /*	문자열을 수신하는 함수	*/
    char Gets0(void)
    {
    	//	데이터가 들어오지 않았다면 while문 반복
    	while ( !( UCSR0A & 0x80 ) );	//	RXC가 Set(8번째 자리)되어 있어야 한다.
    	
    	//	데이터를 리턴
    	return UDR0;
    }

     

    빌드를 하고 임포트를 하자.

    그리고 jwRsMonitor 프로그램을 실행하자.

    입력은 아래의 맨 마지막 창인 Terminal에서 입력을 한다.

    처음에 엔터키를 입력하고, hello를 입력하고 엔터키를 쳤을 때의 결과이다.

     

    댓글

Designed by Tistory.