【XR806开发板试用】Console流程解析以及添加自定义指令

写在前面的话

基于串口的指令调试总是作为基础功能出现在各个项目中。而这一小小的功能却已经包括了中断注册,回调函数,互斥量等嵌入式系统基本的软件逻辑。本文将从以下两个方面介绍XR806 SDK中Console系统。

  1. Console初始化流程
  2. 添加自定义指令
Console初始化流程

在这里插入图片描述

一个Console系统会包含指令的解析和指令处理两个部分。
指令解析部分几乎都是C语言的代码,并且可以做到跨平台通用,但指令处理部分会视不同平台有不一样的实现方法。所以很容易想到将他们两者分离,通过回调函数的方式进行调用。

如上图所示,开机过程会有初始化一个Console Adapter的操作,后者会向命令解析类注册回调函数(或者回调结构体),这类函数往往会以不同的指令头做区分,比如现有的代码中:

tatic const struct cmd_data g_main_cmds[] = {{ "hm", cmd_hm_exec },
#if PRJCONF_NET_EN{ "net", cmd_net_exec },{ "rf", cmd_rf_exec },{ "lmac", cmd_lmac_exec },
#endif...
};

hm指令大家应该不陌生,Wifi连接的指令就是
hm net sta enable

注册好回调函数后,Console解析类会在启动的时候注册串口回调函数,以实现对串口数据的监控。

device\xradio\xr806\xr_skylark\src\console\console.c
HAL_UART_EnableRxCallback(console->uart_id, console_rx_callback, uart);

接下来的操作就变成:

  1. 串口回调函数收到消息
  2. 收到换行符后,通知命令解析器做处理
  3. 命令解析器根据指令头部,选择回调函数
  4. 回调函数做进一步的实现。
如何添加自定义指令
/*** Cmd List:* user set value [int]* user get value* */

这两条指令用于设置一个变量的值以及取回一个变量的值
参考device\xradio\xr806\adapter\console\src\command.c中的命令结构体,可以添加一行自定义的指令

我们定义两条指令:

static const struct cmd_data g_main_cmds[] = {{ "hm", cmd_hm_exec },
#if PRJCONF_NET_EN{ "net", cmd_net_exec },{ "rf", cmd_rf_exec },{ "lmac", cmd_lmac_exec },
#endif...
#ifdef CONFIG_BTSNOOP{ "btsnoop", cmd_btsnoop_exec },
#endif{ "user", cmd_app_user_exec},  // <==== Add Here
};

接着,新建cmd_app_user.ccmd_app_user.h文件,定义及实现回调函数

enum cmd_status cmd_app_user_exec(char *cmd);

使用Console自带的解析函数可以一串指令以空格分隔

int cmd_parse_argv(char *cmd, char *argv[], int size)

有了指令个数和每一条指令,我们就可以对不同的指令做响应

    if (ret == 3) {if (strcmp(argv[0], "set") == 0) {// handle setint tmp;sscanf(argv[2], "%d", &tmp);cmd_app_user_set_value(tmp);HMCMD_DBG("current user value set: %d\n", cmd_app_user_get_value());return CMD_STATUS_OK;}} else if (ret == 2){if (strcmp(argv[0], "get") == 0){HMCMD_DBG("current user value get: %d\n", cmd_app_user_get_value());return CMD_STATUS_OK;}}

代码编写完成后烧录,打开Putty验证功能。

在这里插入图片描述

FAQ
使用Putty通信的时候发现显示不正常

在这里插入图片描述

Putty官方文档是这样描述的:

4.3.3 ‘Implicit CR in every LF’
Most servers send two control characters, CR and LF, to start a new line of the screen. The CR character makes the cursor return to the left-hand side of the screen. The LF character makes the cursor move one line down (and might make the screen scroll).Some servers only send LF, and expect the terminal to move the cursor over to the left automatically. If you come across a server that does this, you will see a stepped effect on the screen, like this:First line of textSecond lineThird line
If this happens to you, try enabling the ‘Implicit CR in every LF’ option, and things might go back to normal:First line of text
Second line
Third line

因此勾选以下两个选项即可

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/511829.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文献阅读--Pulse-Width Modulation

《Dynamics and Control of Switched Electronic Systems》Jian Sun – Chapter 2 《Pulse-Width Modulation》 说明&#xff1a; 文献中的PWM是作为电控系统中基本控制信号去介绍的&#xff0c;但文中对PWM信号的数学证明是同样适用于通信领域的脉宽调制PDM的&#xff0c;文献…

LLM春招准备(1)

llm排序 GPT4V GPT-4V可以很好地理解直接绘制在图像上的视觉指示。它可以直接识别叠加在图像上的不同类型的视觉标记作为指针&#xff0c;例如圆形、方框和手绘&#xff08;见下图&#xff09;。虽然GPT-4V能够直接理解坐标&#xff0c;但相比于仅文本坐标&#xff0c;GPT-4V在…

js形参传递特殊字符

在前端我们给其他页面传值或者传数据到后台的时候&#xff0c;字符串经常将一些特殊符号识别成字符集。这种情况下会将数据打断或者打乱&#xff0c;比如字符串里面包含*/&这些符号的时候就会错误。 我们可以通过将字符中的特殊字符替换成十六进制的字符&#xff0c;一些特…

cannot import name ‘Flask‘ from partially initialized module ‘flask‘

bug&#xff1a; ImportError: cannot import name Flask from partially initialized module flask (most likely due to a circular import) (G:\pythonProject6\flask.py) 这个是因为包的名字和文件的名字一样 修改文件名&#xff1a; 结果 &#x1f923;&#x1f923;&…

使用 Docker 设置 PySpark Notebook

使用 Docker 设置 PySpark Notebook 第 1 步&#xff1a;拉取 Docker 镜像 首先拉取jupyter/all-spark-notebook包含 Spark 3.5.0 的镜像。 docker pull jupyter/all-spark-notebook:spark-3.5.0 第 2 步&#xff1a;设置您的工作区 在运行 Docker 映像之前&#xff0c;我们…

(MATLAB)第十二章-数列与极限

目录 12.1 数列 12.1.1 数列求和 1. 累计求和函数sum() 2. 忽略NaN累计求和函数 nansum() 3. 求此元素位置之前的元素和函数cumsum() 4. 求梯形累计和函数cumtrapz() 12.1.2 数列求积 1. 元素连续相乘函数 prod() 2. 求累计积函数 cumprod() 3. 阶乘函数 ffactorial(n…

【Docker】Docker:解析容器化技术的利器与在Linux中的关键作用

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Docker 是什么&#xff1f; Docker 的作用 Docker 在 Linux 中的重要性 结语 我的其他博客 前言 随着软件开发的不断发展&…

图表背后的智慧:办公场景中的数据可视化革新

在现代办公场景中&#xff0c;数据可视化的应用已经成为提高效率、推动创新的得力工具。无论是管理层还是普通员工&#xff0c;都能从数据可视化中受益匪浅。下面我就以可视化从业者的角度&#xff0c;简单聊聊这个话题。 首先&#xff0c;数据可视化提升了数据的易读性与理解性…

Hello World!第一个labview程序

软件版本&#xff1a; labview myrio 2021英文版 因为没有找到中文版的&#xff0c;据说是myrio没有中文版本 实验内容&#xff1a; 文本显示&#xff0c;程序界面输入任意文本&#xff0c;然后运行程序 在前面板显示出输入的文本 以下为具体步骤&#xff1a; 第一步&…

虚拟化之CPU

一 cpu 1 如何查看内核版本&#xff1a;uname -r 2 如何查看操作系统的发行版本&#xff1a;cat /etc/redhat-release 3 计算机系统子的系统 cpu处理器memory内存storage存储network 网络Display显示 4 进程模式 用户模式&#xff08;user mode&#xff09;主要处理I/O的模…

面试经典150题——逆波兰表达式求值

Man cannot live like a beast, he should pursue knowledge and virtue. -- Dante 1. 题目描述 2. 题目分析与解析 2.1 思路一 这个波兰式我记得在之前上编译原理的时候学过&#xff0c;是对输入的代码进行解析用的。可能有一部分读者对于波兰表达式并不太熟悉&#xff0c;…

【触想智能】工业一体机刷卡应用知识分享

工业一体机刷卡技术是一种高效、稳定、安全的身份认证方式&#xff0c;具有广泛的应用场景和优势。在工业自动化控制、生产过程监测等领域&#xff0c;它已成为必不可少的设备之一。 一、工业一体机刷卡的原理:工业一体机刷卡的原理和普通的刷卡设备类似&#xff0c;都是通过读…