1911|6

1144

帖子

17

TA的资源

纯净的硅(高级)

楼主
 

【平头哥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是区分大小写。

 

 

下一贴子发贪吃蛇游戏,基本差不多了,可以玩了。

最新回复

nmg
你的帖子,还需同步到平头哥社区一份,>>点此查看如何同步。   详情 回复 发表于 2022-3-22 14:37
点赞 关注
 
 

回复
举报

7044

帖子

11

TA的资源

版主

沙发
 
准备用什么显示驱动?LVGL吗?还是纯自己写显示驱动?

点评

代码都已测试完成了,90%,就剩最后一些异常处理没写,像撞墙,撞蛇身等特殊情况了。  详情 回复 发表于 2022-3-21 19:47
自己编写,LVGL有点问题,就不用了,  详情 回复 发表于 2022-3-21 19:46
 
 
 

回复

1144

帖子

17

TA的资源

纯净的硅(高级)

板凳
 
lugl4313820 发表于 2022-3-21 19:11 准备用什么显示驱动?LVGL吗?还是纯自己写显示驱动?

自己编写,LVGL有点问题,就不用了,

 
 
 

回复

1144

帖子

17

TA的资源

纯净的硅(高级)

4
 
lugl4313820 发表于 2022-3-21 19:11 准备用什么显示驱动?LVGL吗?还是纯自己写显示驱动?

代码都已测试完成了,90%,就剩最后一些异常处理没写,像撞墙,撞蛇身等特殊情况了。

 
 
 

回复

5263

帖子

236

TA的资源

管理员

5
 

这利落劲,都快搞完了

参与活动的小伙伴,没事儿可以下载玩玩贪吃蛇了

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

5263

帖子

236

TA的资源

管理员

6
 

你的帖子,还需同步到平头哥社区一份,>>点此查看如何同步

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

有的,不过没还没审核过,我现在再去看看。  详情 回复 发表于 2022-3-22 16:45
 
 
 

回复

1144

帖子

17

TA的资源

纯净的硅(高级)

7
 
nmg 发表于 2022-3-22 14:37 你的帖子,还需同步到平头哥社区一份,>>点此查看如何同步。

有的,不过没还没审核过,我现在再去看看。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表