fxyc87 发表于 2022-3-21 16:30

【平头哥RVB2601创意应用开发】@fxyc87 RVB2601-CLI(命令提示符)测试

本帖最后由 fxyc87 于 2022-3-21 16:37 编辑

<p>我的历史贴子:</p>

<p><a href="https://bbs.eeworld.com.cn/thread-1196839-1-1.html" target="_blank">【平头哥RVB2601创意应用开发】@fxyc87 RVB2601开箱+hello_world</a></p>

<p><a href="https://bbs.eeworld.com.cn/thread-1196869-1-1.html" target="_blank">平头哥RVB2601创意应用开发】@fxyc87 RVB2601-奇巧滛技</a></p>

<hr />
<p>我RVB2601报名时提交的活动是一个贪吃蛇游戏,其中一个就要交互,由于板子上只有两个用户按钮,所以控制4个方向不行,临时用上位机,通过串口来控制游戏。</p>

<p>这样就可以用电脑键盘上的方向键来控制了。</p>

<p>于是就尝试用 uart_getc AOS提供的函数来读取串口数据,发现能接收数据。</p>

<p>但尝试很多便发现需要连续发送两次数据才能接收到一次。</p>

<p>我是通过发送ASWD 4个字母来控制游戏方向的。但每次都是发送两次才能用uart_getc这个函数接收到。</p>

<p>深入调试后才发现,AOS的cli模块和uart_getc用的同一个串口,都是UART0,两者会失占同一个内部环形缓冲区。所以就放弃用uart_getc来读取了。</p>

<p>直接用cli模块来,并且cli也非常方便。</p>

<p>cli,有的OS里边叫的shell,就是通过串口调用命令,可以附加参数,来运行某个函数,像windows下的命令提示符一下。</p>

<hr />
<p>直接上干货。</p>

<p>首先定义cli回调结构体</p>

<pre>
<code class="language-cpp">//cli回调指令结构
const struct cli_command SnakeCommand={
        .name="snake",
        .help="Direction Operation,Command=Left/Right/Up/Down",
        .function=SnakeKey
};</code></pre>

<p>其中name是命令名称,调用时,串口输放此命令就可以运行对应的函数。</p>

<p>help是帮助信息,当使用help命令时,会列出所有可执行的命令及帮助。</p>

<p>funcion是执行命令的目标函数体。</p>

<hr />
<p>定义好结构体后,在需要的位置注册此指定。</p>

<pre>
<code class="language-cpp">        //初始cli命令
        aos_cli_register_command(&amp;SnakeCommand);</code></pre>

<p>注册好以后,当用户调用 snake指令时,会直接回调到SnakeKey函数体。</p>

<p>SnakeKey函数体入口参数要这样定义</p>

<pre>
<code class="language-cpp">//键盘按下键, cli回调函数
static void SnakeKey(char *outbuf, int len, int argc, char **argv){
        if(argc&lt;=1){
                //cli_printf("Error:Direction not specified");                //未指定方向
                strcpy(outbuf,"Error:Direction not specified");        //未指定方向
                return;
        }
        //strcasecmp strcmp
        if(strcasecmp(argv,"left") == 0) {
                LastKey=Left;
        }else if(strcasecmp(argv,"right") == 0) {
                LastKey=Right;
        }else if(strcasecmp(argv,"up") == 0) {
                LastKey=Up;
        }else if(strcasecmp(argv,"down") == 0) {
                LastKey=Down;
        }else{
                strcpy(outbuf,"Invalid direction");
                return;
        }
        if(SnakeRefreshFlag==0)
                return;
        SnakeMove(LastKey);
        SnakeRefreshFlag=0;
}</code></pre>

<p>函数入口参数:</p>

<p>static void SnakeKey(char *outbuf, int len, int argc, char **argv)</p>

<p>outbuf:是用户调用此命令后返回给用户的信息输出,如果没有可以忽略</p>

<p>len:outbuf的最大长度,输出不应该超过此长度。此长度在cli.c文件中有定义,默认32</p>

<p>#define CLI_OUTBUF_SIZE 32</p>

<p>argc是用户调用snake指令时,附加的参数,最多可以附加8个,</p>

<p>argv是具体参数数组</p>

<hr />
<p>当注册成功后,在串口调试助手里,输入help\r\n 就会有如图所示的输出</p>

<p>注意\r\n不能省略,在串口助手里直接输入回车就行,然后发送</p>

<p>除snake以外,其它的均是系统默认的指定。</p>

<hr />
<p></p>

<p>注册成功后就可以输入对应的指令及参数进行测试了。</p>

<p>在程序中加上断点,在监视界面,都可以正常读取到参数内容。</p>

<hr />
<p>代码中有检测参数个数</p>

<p>&nbsp;&nbsp; &nbsp;if(argc&lt;=1){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//cli_printf(&quot;Error:Direction not specified&quot;);&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//未指定方向<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;strcpy(outbuf,&quot;Error:Direction not specified&quot;);&nbsp;&nbsp; &nbsp;//未指定方向<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return;<br />
&nbsp;&nbsp; &nbsp;}</p>

<p>当参数=1时,没有附加参数,输出错误信息。(当只输入snake而没有输入参数时)</p>

<p>输出可以通过outbuf输出,也可以直接调用cli_printf输出,AOS给我们留了outbuf接口,当然就用它了</p>

<p>&nbsp;</p>

<p>//strcasecmp strcmp<br />
&nbsp;&nbsp; &nbsp;if(strcasecmp(argv,&quot;left&quot;) == 0) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;LastKey=Left;<br />
&nbsp;&nbsp; &nbsp;}else if(strcasecmp(argv,&quot;right&quot;) == 0) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;LastKey=Right;<br />
&nbsp;&nbsp; &nbsp;}else if(strcasecmp(argv,&quot;up&quot;) == 0) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;LastKey=Up;<br />
&nbsp;&nbsp; &nbsp;}else if(strcasecmp(argv,&quot;down&quot;) == 0) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;LastKey=Down;<br />
&nbsp;&nbsp; &nbsp;}else{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;strcpy(outbuf,&quot;Invalid direction&quot;);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return;<br />
&nbsp;&nbsp; &nbsp;}</p>

<p>然后在代码中检测用户输入的参数,此处用了strcasecmp,这个在SDK的newlib库中有对应的实现代码</p>

<p>strcasecmp是不区分大小定的。</p>

<p>也可以使用strcmp函数,strcmp是区分大小写。</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

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

lugl4313820 发表于 2022-3-21 19:11

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

fxyc87 发表于 2022-3-21 19:46

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

<p>自己编写,LVGL有点问题,就不用了,</p>

fxyc87 发表于 2022-3-21 19:47

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

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

nmg 发表于 2022-3-22 14:35

<p>这利落劲,都快搞完了</p>

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

nmg 发表于 2022-3-22 14:37

<p>你的帖子,还需同步到平头哥社区一份,<a href="https://bbs.eeworld.com.cn/thread-1197314-1-1.html" target="_blank">&gt;&gt;点此查看如何同步</a>。</p>

fxyc87 发表于 2022-3-22 16:45

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

<p>有的,不过没还没审核过,我现在再去看看。</p>
页: [1]
查看完整版本: 【平头哥RVB2601创意应用开发】@fxyc87 RVB2601-CLI(命令提示符)测试