【平头哥RVB2601创意应用开发】@fxyc87 RVB2601-CLI(命令提示符)测试
[复制链接]
本帖最后由 fxyc87 于 2022-3-21 16:37 编辑
我的历史贴子:
【平头哥RVB2601创意应用开发】@fxyc87 RVB2601开箱+hello_world
平头哥RVB2601创意应用开发】@fxyc87 RVB2601-奇巧滛技
我RVB2601报名时提交的活动是一个贪吃蛇游戏,其中一个就要交互,由于板子上只有两个用户按钮,所以控制4个方向不行,临时用上位机,通过串口来控制游戏。
这样就可以用电脑键盘上的方向键来控制了。
于是就尝试用 uart_getc AOS提供的函数来读取串口数据,发现能接收数据。
但尝试很多便发现需要连续发送两次数据才能接收到一次。
我是通过发送ASWD 4个字母来控制游戏方向的。但每次都是发送两次才能用uart_getc这个函数接收到。
深入调试后才发现,AOS的cli模块和uart_getc用的同一个串口,都是UART0,两者会失占同一个内部环形缓冲区。所以就放弃用uart_getc来读取了。
直接用cli模块来,并且cli也非常方便。
cli,有的OS里边叫的shell,就是通过串口调用命令,可以附加参数,来运行某个函数,像windows下的命令提示符一下。
直接上干货。
首先定义cli回调结构体
//cli回调指令结构
const struct cli_command SnakeCommand={
.name="snake",
.help="Direction Operation,Command=Left/Right/Up/Down",
.function=SnakeKey
};
其中name是命令名称,调用时,串口输放此命令就可以运行对应的函数。
help是帮助信息,当使用help命令时,会列出所有可执行的命令及帮助。
funcion是执行命令的目标函数体。
定义好结构体后,在需要的位置注册此指定。
//初始cli命令
aos_cli_register_command(&SnakeCommand);
注册好以后,当用户调用 snake指令时,会直接回调到SnakeKey函数体。
SnakeKey函数体入口参数要这样定义
//键盘按下键, cli回调函数
static void SnakeKey(char *outbuf, int len, int argc, char **argv){
if(argc<=1){
//cli_printf("Error:Direction not specified"); //未指定方向
strcpy(outbuf,"Error:Direction not specified"); //未指定方向
return;
}
//strcasecmp strcmp
if(strcasecmp(argv[1],"left") == 0) {
LastKey=Left;
}else if(strcasecmp(argv[1],"right") == 0) {
LastKey=Right;
}else if(strcasecmp(argv[1],"up") == 0) {
LastKey=Up;
}else if(strcasecmp(argv[1],"down") == 0) {
LastKey=Down;
}else{
strcpy(outbuf,"Invalid direction");
return;
}
if(SnakeRefreshFlag==0)
return;
SnakeMove(LastKey);
SnakeRefreshFlag=0;
}
函数入口参数:
static void SnakeKey(char *outbuf, int len, int argc, char **argv)
outbuf:是用户调用此命令后返回给用户的信息输出,如果没有可以忽略
len:outbuf的最大长度,输出不应该超过此长度。此长度在cli.c文件中有定义,默认32
#define CLI_OUTBUF_SIZE 32
argc是用户调用snake指令时,附加的参数,最多可以附加8个,
argv是具体参数数组
当注册成功后,在串口调试助手里,输入help\r\n 就会有如图所示的输出
注意\r\n不能省略,在串口助手里直接输入回车就行,然后发送
除snake以外,其它的均是系统默认的指定。
注册成功后就可以输入对应的指令及参数进行测试了。
在程序中加上断点,在监视界面,都可以正常读取到参数内容。
代码中有检测参数个数
if(argc<=1){
//cli_printf("Error:Direction not specified"); //未指定方向
strcpy(outbuf,"Error:Direction not specified"); //未指定方向
return;
}
当参数=1时,没有附加参数,输出错误信息。(当只输入snake而没有输入参数时)
输出可以通过outbuf输出,也可以直接调用cli_printf输出,AOS给我们留了outbuf接口,当然就用它了
//strcasecmp strcmp
if(strcasecmp(argv[1],"left") == 0) {
LastKey=Left;
}else if(strcasecmp(argv[1],"right") == 0) {
LastKey=Right;
}else if(strcasecmp(argv[1],"up") == 0) {
LastKey=Up;
}else if(strcasecmp(argv[1],"down") == 0) {
LastKey=Down;
}else{
strcpy(outbuf,"Invalid direction");
return;
}
然后在代码中检测用户输入的参数,此处用了strcasecmp,这个在SDK的newlib库中有对应的实现代码
strcasecmp是不区分大小定的。
也可以使用strcmp函数,strcmp是区分大小写。
下一贴子发贪吃蛇游戏,基本差不多了,可以玩了。
|