ARM Cortex-M0 UartGets()筆記
The Definitive Guide to the ARM Cortex-M0 中文版,
目前讀到p.15-19
談到如何讓UART在NXP LPC1114動起來,而且在重定向之後,
自己修改程式,來解決scanf()的問題,最重要的就是UartGets()
試了一下程式執行的結果,和預期不一樣,按倒退鍵,不會倒退,按del鍵,結果出現的是 [3~。想說作者很好心,很次都會故意出一些小錯誤,讓我們讀者可以玩玩找問題的遊戲。這樣不但多了一些樂趣,也可以有更深刻的體驗。後來發現不是,其實是使用的Terminal軟體不同,或者其設定不同,就會造成這些問題。
我使用Putty,預設的設定:
開除錯去看:
按倒退鍵,出現127,預期是8
按ESC,出現[3~(三個鍵),預期是27
按del,出現27,預期是沒有動作或反應
修改Putty的設定後,行為就符合預期了:
試了一下程式執行的結果,和預期不一樣,按倒退鍵,不會倒退,按del鍵,結果出現的是 [3~。想說作者很好心,很次都會故意出一些小錯誤,讓我們讀者可以玩玩找問題的遊戲。這樣不但多了一些樂趣,也可以有更深刻的體驗。後來發現不是,其實是使用的Terminal軟體不同,或者其設定不同,就會造成這些問題。
我使用Putty,預設的設定:
開除錯去看:
按倒退鍵,出現127,預期是8
按ESC,出現[3~(三個鍵),預期是27
按del,出現27,預期是沒有動作或反應
修改Putty的設定後,行為就符合預期了:
int UartGets(char dest[], int length)
{
unsigned int textlen=0; // Current text length
char ch; // current character
do {
ch = UartGetc(); // Get a character from UART
switch (ch) {
case 8: // Back space
if (textlen>0) {
textlen--;
UartPutc(ch); // Back space
UartPutc(' '); // Replace last character with space on console
UartPutc(ch); // Back space again to adjust cursor position
}
break;
case 13: // Enter is pressed
dest[textlen] = 0; // null terminate
UartPutc(ch); // echo typed character
break;
case 27: // ESC is pressed
dest[textlen] = 0; // null terminate
UartPutc('\n');
break;
default: // if input length is within limit and input is valid
if ((textlen= 0x20) & (ch < 0x7F))) // valid characters
{
dest[textlen] = ch; // append character to buffer
textlen++;
UartPutc(ch); // echo typed character
}
break;
} // end switch
} while ((ch!=13) && (ch!=27));
if (ch==27) {
return 1; // ESC key pressed
} else {
return 0; // Return key pressed
}
}
留言