TA的每日心情 | 奋斗 12 小时前 |
---|
签到天数: 2000 天 连续签到: 24 天 [LV.Master]伴坛终老
|
上期实现了串口的发送接收数据,本次就利用串口的发送接收移植一些开源的shell框架。
本次移植的是nr_micro_shell和letter_shell这2种,以前也在其他MCU平台移植过,所以本次移植就很容易了。
下面先移植nr_micro_shell.
首先添加nr_micro_shell源码到工程中。添加头文件路径。
然后修改nr_micro_shell的配置文件nr_micro_shell_config.h.主要移植配置如下2个,其他项按需配置。
一个串口printf输出打印,一个串口单字节输出。
先在串口初始化后初始化shell。直接调用nr_micro_shell的初始化函数。
shell_init();
然后在串口接收处处理串口接收的数据。
- void shell_usart_loop(void)
- {
- if(shell_uart_rx.read_i != shell_uart_rx.write_i)
- {
- shell(shell_uart_rx.buff[shell_uart_rx.read_i++]);
- shell_uart_rx.read_i &= 0x7f;
- }
- }
复制代码 编译成功
下载程序到板上,连接串口。
打开串口助手输入命令查看效果
2、移植letter_shell.
和上面移植差不多,首先下载letter_shell源码,加入到工程中,添加源码的头文件路径。
下面是移植的接口文件代码:
首先是配置文件:
下面是接口代码及测试命令:
- /**
- * @file shell_port.c
- * @author Letter (NevermindZZT@gmail.com)
- * @brief
- * @version 0.1
- * @date 2019-02-22
- *
- * @copyright (c) 2019 Letter
- *
- */
- #include "shell_cfg_user.h"
- #include "platform.h"
- #include "shell.h"
- Shell shell;
- char shellBuffer[512];
- /**
- * @brief 用户shell写
- *
- * @param data 数据
- * @param len 数据长度
- *
- * @return short 实际写入的数据长度
- */
- short userShellWrite(char *data, unsigned short len)
- {
- for(uint32_t i=0;i<len;i++)
- stdout_putchar(data[i]);
- return len;
- }
- /**
- * @brief 用户shell读
- *
- * @param data 数据
- * @param len 数据长度
- *
- * @return short 实际读取到
- */
- short userShellRead(char *data, unsigned short len)
- {
- uint32_t rlen = 0;
- for(uint32_t i=0;i<len;i++)
- {
- if(shell_uart_rx.read_i != shell_uart_rx.write_i)
- {
- data[rlen++] = shell_uart_rx.buff[shell_uart_rx.read_i++];
- shell_uart_rx.read_i &= 0x7f;
- }
- }
- return rlen;
- }
- /**
- * @brief 用户shell上锁
- *
- * @param shell shell
- *
- * @return int 0
- */
- int userShellLock(Shell *shell)
- {
- return 0;
- }
- /**
- * @brief 用户shell解锁
- *
- * @param shell shell
- *
- * @return int 0
- */
- int userShellUnlock(Shell *shell)
- {
- return 0;
- }
- /**
- * @brief 用户shell初始化
- *
- */
- void userShellInit(void)
- {
- shell.write = userShellWrite;
- shell.read = userShellRead;
- // shell.lock = userShellLock;
- // shell.unlock = userShellUnlock;
- shellInit(&shell, shellBuffer, 512);
- }
- //测试添加用户:
- SHELL_EXPORT_USER(SHELL_CMD_PERMISSION(0x01), root, 123456, add user);
- //测试添加mian命令
- int func(int argc, char *argv[])
- {
- printf("%d parameter(s)\r\n", argc);
- for (char i = 1; i < argc; i++)
- {
- printf("%s\r\n", argv[i]);
- }
- return 0;
- }
- SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0x01)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), func, func, test1);
- //letter:/$ func "hello world"
- //2 parameter(s)
- //hello world
- SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0x02)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), func2, func, test2);
- //测试添加func命令
- int func1(int i, char ch, char *str)
- {
- printf("input int: %d, char: %c, string: %s\r\n", i, ch, str);
- return 0;
- }
- SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), func1, func1, test3);
- //letter:/$ func1 666 'A' "hello world"
- //input int: 666, char: A, string: hello world
-
复制代码
接口初始化shell
主循环处理串口接收的数据:
编译下载查看串口数据:
GPIO_LED_Toggle.zip
(3.14 MB, 下载次数: 3)
|
|