J 창고

[Atmega128] UART Rx 본문

컴퓨터/Firmware

[Atmega128] UART Rx

JSFamily 2015. 1. 7. 22:56




기본적인 셋팅은


UART Tx 포스팅에서 했던 것과 비슷하고

http://wjs890204.tistory.com/762



Rx Enable을 위해

UCSR0B에 있는 RXEN0 레지스터도 셋 한다



그런데 이거 구현하는데 문제가 있었는데


엄청 골때렸음....




http://cafe.naver.com/carroty/236713


여기 질문글인데


결국 1byte만 선언된 문자열에


그 이상을 구겨 넣어서 생긴 문제...



ㅠㅠ



어쨋건 해결 해서 다행...




이번 포스팅의 내용은


Rx Buffer을 구현하여


시리얼 모니터에 문자열을 보내면


Rx buffer에 저장하고


다시 시리얼모니터에 출력해 주는 역할인 코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
 * USART_Test2.c
 *
 * Created: 2015-01-07 오전 10:49:51
 *  Author: user
 */ 
 
 
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <string.h>
 
#define RX_BUFFER_SIZE            1024
#define STRING_BUFFER_SIZE        1024
 
void putChar1(char);
void putString1(char *);
char getChar1();
char* getString1(char *);
 
char getChar1(void){
 
    char status, data;
    while(1){
        while( ( (status=UCSR0A) & (1<<RXC0)) == 0);            
        data = UDR0;
        if( (status & ( (1<<FE0) | (1<<UPE0) | (1<<DOR0))) == 0){
            return data;
        }
    }
}
    /*        
    UCSR0A의 bit7에 있는 RXC0 레지스터는 rx Buffer에 읽지 않은
    데이터가 있을 때 셋되며 rx Buffer에서 데이터가 읽혀 비어있으면
    클리어 된다.
    */
 
char* getString1(char *string){
    
    unsigned char cnt=0;
    char rx_buf[RX_BUFFER_SIZE];
    
    while((rx_buf[cnt] = getChar1()) != '\n'){
        cnt++;
    }
    rx_buf[cnt] = '\0';
    strcpy(string, rx_buf);
    return string;
}
 
void putChar1(char c){
    
    while( (UCSR0A & (1<<UDRE0)) == 0 );            
    UDR0 = c;
}
    /*  
    UCSR0A의 5bit에 있는 UDRE0는 Transmit Buffer를 가리키는 Indicator이다.
    만약 Buffer에 있는 데이터를 다 전송하면 UDRE0는 1로 Set된다.
    */
    
void putString1(char *string){
    unsigned char i=0;
 
    while(string[i] != '\0'){    // 문자열의 맨 마지막엔 항상 NULL문자가 있으므로
        putChar1(string[i]);    // NULL문자가 나올때 까지 1byte씩(캐릭터문자) 보냄
        i++;    
    }    
    putChar1(0x0A);                // 마지막에 Line Feed 보내서 시리얼 모니터의 뉴라인 생성
}
 
int main(void)
{
    char intro[] = "Hello World!";
    char string_buf[STRING_BUFFER_SIZE];
    char *string;
 
    UCSR0A = 0x00;
    UCSR0B    = (1<<TXEN0) | (1<<RXEN0);                // Tx, Rx Enable
    //Asynchronous Mode
    UCSR0C = (1<<UCSZ1)|(1<<UCSZ0);        // 8bit, 1stopbit, no parity
    UBRR0H = 0x00;        // UBRR = (16/(16*9600))-1 = 103.167
    UBRR0L = 0x67;        // Baudrate = 9600
    
    while(1)
    {            
        putString1(intro);
 
        string = getString1(string_buf);
 
        putString1(string);
        _delay_ms(100);
    }
}
 
cs





Comments