完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
以前搞过u-boot,,有很多命令,,用超级终端操作,,比如help、tftp、erase、fatload, 其实就是下面这段代码接受超级终端命令的。 最近打算给产品做一个shell,用超级终端输入命令,,所以从u-boot找到这段代码并移植出来了 使用方法是: main() { char buffer[16];//缓冲区长度根据命令长度可调整 while(1){ _delay_ms(100); //其中"LW-C360#"就是显示在超级终端的输入命令前端的,叫什么? readline_into_buffer ("LW-C360#", buffer); } } 使用截图: /* ********************************************************************************** * 实现一个简单的Shell命令交互界面,命令行接收部分移植自u-boot-1.3.4 ********************************************************************************** */ #define tab_seq (" ")/* used to expand TABs */ #define erase_seq ("b b") /* erase sequence */ //删除一个字符 static char * delete_char(char *buffer, char *p, int *colp, int *np, int plen) { char *s; if (*np == 0) { return (p); } if (*(--p) == 't') { /* will retype the whole line */ while (*colp > plen) { USART_PutStr(COMMUNICATE_USART, erase_seq); (*colp)--; } for (s=buffer; s if (*s == 't') { USART_PutStr(COMMUNICATE_USART, tab_seq+((*colp) & 07)); *colp += 8 - ((*colp) & 07); } else { ++(*colp); USART_PutChar(COMMUNICATE_USART, *s); } } } else { USART_PutStr(COMMUNICATE_USART, erase_seq); (*colp)--; } (*np)--; return (p); } //从超级终端读取命令行 int readline_into_buffer (const char *const prompt, char * buffer) { char *p = buffer; char * p_buf = p; /* buffer index */ int n = 0; /* prompt length */ int plen = 0; /* output column cnt */ int col; char c; /* print prompt */ if (prompt) { plen = strlen (prompt); USART_PutStr(COMMUNICATE_USART, prompt); } col = plen; for (;;) { //从at91sam9260串口读取一个字符 while( 0 == (AT91C_BASE_US1->US_CSR & AT91C_US_RXRDY) ); c = AT91C_BASE_US1->US_RHR; /* * Special character handling */ switch (c) { case 'r': /* Enter */ case 'n': //回车表示命令输入结束 *p = ' |