Closed zhangoneone closed 4 years ago
你好,issue1,键入ls,按退格键,会删除s。之后输入s,补全ls的命令,按回车。 输出结果no command named: ls
------------------ 原始邮件 ------------------ 发件人: "Nrusher"<notifications@github.com>; 发送时间: 2019年12月28日(星期六) 下午2:17 收件人: "Nrusher/nr_micro_shell"<nr_micro_shell@noreply.github.com>; 抄送: "张青"<1193210854@qq.com>;"Author"<author@noreply.github.com>; 主题: Re: [Nrusher/nr_micro_shell] some issue (#1)
issue 1未能复现,实验gif如下,显示正常
issue 2由于ANSI控制码以ECS(0xb1)起始,ECS及后续字符被误识别为控制字符,后续会修复此问题
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.
在我的终端上未出现此问题,gif上s未被删除是显示问题,实际操作为
我这边运行在freertos下,单独开了一个task处理shell。代码如下 shell_init(); while(1){ shell(xgetc());//xgetc从串口读1个字符返回,阻塞方式 vTaskDelay(50);//延时50ms }
nr_micro_shell_config.h相关配置如下
/ ANSI command line buffer size. /
/ Maximum user name length. /
/ Maximum command name length. /
/ Command line buffer size. /
/ The maximum number of parameters in the command. /
/ Command stores the most history commands (the maximum number here refers to the maximum number of commands that can be stored. When the history command line cache is full, it will automatically release the earliest command record) /
/ History command cache length /
/ The user's name. /
/ 0: \n 1: \r 2: \r\n /
extern void xprintf_s(const char fmt,...); extern void xputc (char c); / If you use RTOS, you may need to do some special processing for printf(). */
------------------ 原始邮件 ------------------ 发件人: "Nrusher"<notifications@github.com>; 发送时间: 2019年12月28日(星期六) 下午2:34 收件人: "Nrusher/nr_micro_shell"<nr_micro_shell@noreply.github.com>; 抄送: "张青"<1193210854@qq.com>;"Author"<author@noreply.github.com>; 主题: Re: [Nrusher/nr_micro_shell] some issue (#1)
在我的终端上未出现此问题,gif上s未被删除是显示问题,实际操作为
输入ls
按下backspace
按下s
按下回车 结果正常回应,未出现问题。nr_micro_shell 运行于rtthread下,使用提供的例程及配置。若在裸机下使用,请检查nr_micro_shell_config.h配置是否正确。
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.
目前定位到原因了。送入shell_parser函数的字符串str是
ls退格符s
在shell_parser函数里, char *token = str;
token = nr_shell_strtok(token, " ");//该函数没有处理退格符的情况
fp = shell_search_cmd(shell, str);//该函数找不到命令 “ls退格符s”
我这里送到shell模块的是raw数据,shell中好像也没有针对raw数据的处理(或许这里可以改进一下)。所以出了问题。
------------------ 原始邮件 ------------------ 发件人: "Nrusher"<notifications@github.com>; 发送时间: 2019年12月28日(星期六) 下午4:00 收件人: "Nrusher/nr_micro_shell"<nr_micro_shell@noreply.github.com>; 抄送: "张青"<1193210854@qq.com>;"Author"<author@noreply.github.com>; 主题: Re: [Nrusher/nr_micro_shell] some issue (#1)
检查你的换行符是否匹配正确(NR_SHELL_END_OF_LINE ) -加入 / Weather the terminal support all ANSI codes. / #define NR_SHLL_FULL_ANSI 0
检查线程栈分配是否足够大
另外freertos中xget()如果为阻塞方式,延时vTaskDelay(50);应该可以去掉
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.
// Backspace '\b' processing void nr_ansi_in_backspace(ansi_st *ansi) { unsigned int i;
if (ansi->p >= 0)
{
for (i = ansi->p; i < ansi->counter; i++)
{
ansi->current_line[i] = ansi->current_line[i + 1];
}
ansi->p--;
ansi->counter--;
ansi_show_char('\b');
shell_printf(NR_ANSI_CLR_R_MV_L_NCHAR(1));
}
} ansi_port源码中处理了回退字符了,所以解析函数中没有处理特殊字符的代码,默认str符合命令行格式,不存在特殊字符。正常情况下送入的都应该是正确的格式。不过你的建议很好。
你可以写如下代码验证一下(#define NR_SHLL_FULL_ANSI 0 )(#define NR_SHELL_END_OF_LINE 1) char test_line[] = "ls\bs\r"; unsigned int i = 0; for(i=0;i<sizeof(test_line);i++) { shell(test_line[i]); }
问题解决了,我在线调试时,发现输入的backspace键,键值是0x7f。我换了3个键盘测试backspace按键,键值都是0x7f。而const char nr_ansi_in_special_symbol[] = {'\b', '\n', '\r', '\t', '\0'};的'\b'在我这里的ascii码是0x08。所以无法检测到backspace键。
不过我奇怪的是,backspace按键,按照ascii码的标准,键值应该是0x08。然而我换了三个键盘都是0x7f,而0x7f ascii码是del
------------------ 原始邮件 ------------------ 发件人: "Nrusher"<notifications@github.com>; 发送时间: 2019年12月28日(星期六) 下午4:16 收件人: "Nrusher/nr_micro_shell"<nr_micro_shell@noreply.github.com>; 抄送: "张青"<1193210854@qq.com>;"Author"<author@noreply.github.com>; 主题: Re: [Nrusher/nr_micro_shell] some issue (#1)
// Backspace '\b' processing
void nr_ansi_in_backspace(ansi_st *ansi)
{
unsigned int i;
if (ansi->p >= 0) { for (i = ansi->p; i < ansi->counter; i++) { ansi->current_line[i] = ansi->current_line[i + 1]; } ansi->p--; ansi->counter--; ansi_show_char('\b'); shell_printf(NR_ANSI_CLR_R_MV_L_NCHAR(1)); }
}
ansi_port源码中处理了回退字符了,所以解析函数中没有处理特殊字符的代码,默认str符合命令行格式,不存在特殊字符。正常情况下送入的都应该是正确的格式。不过你的建议很好。
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.
找到问题就好,我用的键盘没有这个问题,这个我就无能为力了。
感谢耐心解答!谢谢!
------------------ 原始邮件 ------------------ 发件人: "Nrusher"<notifications@github.com>; 发送时间: 2019年12月28日(星期六) 下午5:16 收件人: "Nrusher/nr_micro_shell"<nr_micro_shell@noreply.github.com>; 抄送: "张青"<1193210854@qq.com>;"Author"<author@noreply.github.com>; 主题: Re: [Nrusher/nr_micro_shell] some issue (#1)
找到问题就好,我用的键盘没有这个问题,这个我就无能为力了。
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.
不客气
issue 1: step1.输入ls step2.输入退格键 step3.输入s 结果: no command named: ls
issue2: step1.输入esc键 step2.输入l,无显示 step3.输入s,显示s 结果: no command named: s