系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
rtthread-uart finsh组件实现机制
提示:以下是本篇文章正文内容,下面案例可供参考
一、FinSH组件是什么?
FinSH 是 RT-Thread 的命令行组件,提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用串口 / 以太网 / USB 等与 PC 机进行通信。
二、使用步骤
1.引入数据
1.ping - ping network host
2.MSH_CMD_EXPORT_ALIAS(netdev_ping, ping, ping network host);
3.#define MSH_CMD_EXPORT_ALIAS(command, alias, desc)
MSH_FUNCTION_EXPORT_CMD(command, alias, desc)
4.#define MSH_FUNCTION_EXPORT_CMD(name, cmd, desc)
const char _fsym##cmd##_name[] = #cmd;
const char _fsym##cmd##_desc[] = #desc;
__declspec(allocate(“FSymTab$f”))
const struct finsh_syscall _fsym##cmd =
{
_fsym##cmd##_name,
_fsym##cmd##_desc,
(syscall_func)&name
};
5.void finsh_thread_entry(void *parameter)
shell->line[shell->line_position] = ch
6.int finsh_getchar(void)
7.device_read(dev, pos, buffer, size);
8.rt_serial_read();
9._serial_int_rx(); //因为是中断接收
10.ch = rx_fifo->buffer[rx_fifo->get_index]//环形队列存数据, 哪怎么取了?
2022.9.23
2.取出数据
serial->parent.rx_indicate(&serial->parent, rx_length)---->
finsh_rx_ind(); //释放信号量
finsh_thread_entry();
msh_exec(shell->line, shell->line_position);//shell.c 641
msh_exec();
_msh_exec_cmd(); //msh.c 347
总结
1:rt_hw_serial_isr()//serial.c 1291串口中断回调函数一直接收数据,往rx_fifo->buffer[]循环队列里面丢数据,基本的循环队列的操作(空间是否溢出等等),不做任何数据过滤和处理;
2:finsh_thread_entry() //shell.c 445 线程里面通过finsh_getchar()//shell.c 485一直在提取数据(有些特殊判定,特殊按键),存放到shell->line[]循环队列里面当识别到’\r’或’\n’时,截取数据及长度,确认为一帧数据;
3:通过调用msh_exec();//shell.c 641执行解析msh,并回调对应该的指针函数;
4:在msh_exec()函数之前写个if/else,如果有收到帧头是A0(约定),则执行与PC端的数据交互。