기본적인 셋팅은
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 |