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