2017-03-10 11 views
0

사용자가 'l'을 입력 할 때까지 직렬 콘솔에 대한 데이터 문자열을 읽는 UART 용 드라이버가 있습니다. 그러나, 나는 단지 하나의 문자를 읽고 싶다. 이것은 사용자가 1-9 또는 a-z를 입력하는 메뉴입니다. 표준 C getchar()에 해당하는 것을 만들려고합니다. 나는 이것을 어떻게 일반적으로 할 수 있을까?getchar()을 에뮬레이트하는 UART 드라이버

이것은 UART 용 레지스터 맵입니다.

enter image description here

void getstring(char *str) { 

    volatile uint32_t *uart = (volatile uint32_t*) UART; 
    char c = 0; 

    do { 
     while ((uart[2] & (1<<7)) == 0); 
     c = uart[0]; 
     *str++ = c; 
    } 
    while (c!='l'); 
} 
+2

우리는 코딩/개인지도 서비스가 없습니다. 귀하의 ** 특정 ** 문제는 무엇입니까? [mcve]를 제공하십시오. – Olaf

+1

이 함수를 리팩토링하면 루프 내부의 코드를 getchar() 함수로 옮길 수 있습니다. 'uart' 선언은 버그가 있습니다. 레지스터 크기를 맞추려면'uint16_t'가 필요합니다. –

+0

이'getstring()'구현은 안전하지 않으므로주의해야합니다. 그것은'str'에 쓰여지는 문자의 수에 제한이없고, 문자열을 종료하지 않으며,'l' 문자를 포함하여 엔트리를 종료합니다. – Clifford

답변

0

루프는 루프의 한 번에 한 문자를 검색한다. 하나의 문자 만 원한다면 단순히 루프 외부를 생략하십시오.

char getch() 
{ 
    volatile uint32_t *uart = (volatile uint32_t*) UART; 
    while ((uart[2] & (1<<7)) == 0); 
    return uart[0]; 
} 

그것은이 함수 (기타 유지 보수)를 이용하여 다시 쓰기 getstring()하는 것이 합리적이다.