2015-02-15

AVR과 대화하기 UART 연습강좌 과제

USART 강좌의 과제를 연습한 코드 및 답변내용을 정리한 글입니다.

출처 : cafe.naver.com/laydigital/

------------------------------------------------------------------------
[과제] 위의 UART 통신 예에서, BS(Back Space) 키를 누른 경우는 글자가 지워지지 않고 커서만 왼쪽으로 가게 되는데, 이것을 한 글자가 지워지면서 왼쪽으로 가도록 프로그램해 보세요.
------------------------------------------------------------------------
혹시 위에 과제가 stack ,array 나 queue 등을 이용한 echo input data를 관리하는 형태의 연습을 위한
과제가 아닌지 조심스럽게 여쭈어봅니다. 일단 저는 문자로 문자를 지우는 방법으로 쉽게 작성했습니다..;


#include <avr/io.h>
#define kilo 1000UL
#define Mega kilo*kilo
#define F_CPU 16*Mega
//#define FOSC 16000000 //clock speed
//#define BAUD 115200
//#define Myubrr FOSC/16/BAUD-1  // FOSC/16/BAUD -1 + (-35%)

#include <util/delay.h>

void USART0_SET(uint16_t);
void USART0_Transmit (uint8_t p);
void Transmit_string (uint8_t*p);
uint8_t USART0_Receive(void);


//uint8_t arr[] = {11,'D','Y','N','E',0x20,'C','O','M','P','A','N','Y','!',10,13};
uint8_t arr[] ="DynE Serial Practice>"; //uint8_t *arr="DynE Serial Practice>"; 
uint8_t prr[] = "I like you\r\n\n";  

int main(void)
{
 uint8_t cr; 
 USART0_SET(103);  //baud rate 9600

    while(1)
    {
           cr = USART0_Receive();
    USART0_Transmit(cr);
    
    switch(cr)
    {
      case  8: USART0_Transmit(255); USART0_Transmit(8); break;   //back space 
      case 27: USART0_Transmit(10);  USART0_Transmit(12); break;  //clear terminal
      case 13: USART0_Transmit(10);  Transmit_string(arr); break;    //enter
    }
   }
}

void USART0_SET(uint16_t ubrr)
{
  /*set baud rate */
 UBRR0H = (uint8_t)(ubrr>>8);
 UBRR0L = (uint8_t) ubrr;
 /* Enable receiver and transmitter */
 UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02);  
   
 /*Set frame format : 8data, 1stop bit */
 UCSR0C = (0<<USBS0)|(3<<UCSZ00);
 /*Set Parity mode */
 UCSR0C |=(0<<UPM00); //disabled,  parity
}


void USART0_Transmit(uint8_t p)
{
  /* Wait for empty transmit buffer */
   while( !(UCSR0A &  (1<<UDRE0)) )
   ;
  /* Put data into buffer, sends the data */

   UDR0 = p;
   //_delay_ms(30); //A confirmed

}

void Transmit_string (uint8_t*p)
{
  while(*p)   USART0_Transmit(*p++);
}

uint8_t USART0_Receive(void)
{
 /* Wait for data to be received*/
 while( !(UCSR0A & (1<<RXC0)) )
 ;
 /* Get and return received data from buffer*/
 return UDR0;
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


시리얼 모니터에서 enter 키를 0x0d('\r'), 0x0a('\n') 어떤 조합으로 보내는지에 따라 약간 수정을 해야 하지만

#define ENTER '\r'
#define BS '\b'
#define SPACE ' '

ch = getchar();
swtich(ch)
{
case ENTER : 할일을함/
break;
case BS : Tx(BS); Tx(SPACE); Tx(BS); break;
}
이런 식으로 합니다.

그런데 코드에서 255을 출력하는건 어떤 의미 인가요?

ASCII 확장코드 표에서 255 값이 blank 문자여서 backspace 와 조합하여 커서가 뒤로가면서 터미널에 표시된 문자를 지우는 역활로 이용했습니다. 문자를 빈칸문자로 다시 채우는 형태로 문자가 지워지게 보이게 하여 과제내용 구현 연습을 했습니다.

예 그렇게 하셔도 상관없겠네요.
보통 blank는 스페이스 문자 (' ' . 0x20) 으로 지우거든요..ㅎ

No comments:

Post a Comment

Total Pageviews