提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
一个功能强大的嵌入式shell
letter shell是一个C语言编写的,可以嵌入在程序中的嵌入式shell,主要面向嵌入式设备,以C语言函数为运行单位,可以通过命令行调用,运行程序中的函数
相对2.x版本,letter shell 3.x增加了用户管理,权限管理,以及对文件系统的初步支持
此外3.x版本修改了命令格式和定义,2.x版本的工程需要经过简单的修改才能完成迁移
若只需要使用基础功能,可以使用letter shell 2.x版本
使用说明可参考Letter shell 3.0 全新出发
如果从3.0版本迁移到3.1以上版本,请注意3.1版本对读写函数原型的修改
一、功能
- 命令自动补全
- 快捷键功能定义
- 命令权限管理
- 用户管理
- 变量支持
- 代理函数和参数代理解析
二、在接口方面的注意事项
1.函数的接收
#include "shell_port.h"
#include "shell.h"
#include "stm32f10x_usart.h"
volatile uint8_t Flag=0;
volatile u8 USARTA_BUF[10] = {0};
volatile u8 USART1_BUF[10] = {0};
volatile u8 USART1_BUF_LEN = 0;
volatile u8 USART1_BUFA_LEN = 0;
volatile u8 USART1_REC_FLAG = 0;
void USART1_IRQHandler(void)
{
static u8 res = 0;
if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
{
res = USART_ReceiveData(USART1);
if(USART1_BUF_LEN < 200)
USART1_BUF[USART1_BUF_LEN++] = res;
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)
{
if(!Flag)
{
USART_ReceiveData(USART1); //一定要读
Flag=1;
USART1_BUFA_LEN = USART1_BUF_LEN;
for(u8 k=0;k<USART1_BUF_LEN;k++)
USARTA_BUF[k] = USART1_BUF[k];
memset((void*)USART1_BUF,0,USART1_BUF_LEN);
USART_ClearITPendingBit(USART1,USART_IT_IDLE);
USART1_BUF_LEN=0;
}
else
{
USART_ReceiveData(USART1); //一定要读
USART_ClearITPendingBit(USART1,USART_IT_IDLE);
USART1_BUF_LEN=0;
}
}
}
2.主函数
我这里把shellHandler放在main函数出来,原文章则放在中断处理,缺点是串口发送数据会跑死。
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "shell_port.h"
#include "shell.h"
extern volatile uint8_t Flag;
extern volatile u8 USART1_BUFA_LEN;
extern volatile u8 USARTA_BUF[200];
int main(void)
{
while(1)
{
uint8_t i=0;
if(Flag==1)
{
for(i=0;i<USART1_BUFA_LEN;i++)
shellHandler(&shell, USARTA_BUF[i]);
memset(USARTA_BUF,0,USART1_BUFA_LEN);
USART1_BUFA_LEN=0;
Flag =0;
}
}
}
#include "shell_port.h"
#include "shell.h"
#include "stm32f10x_usart.h"
Shell shell;
char shellBuffer[512];
/**
* @brief 用户shell写
*
* @param data 数据
*/
signed short userShellWrite(char* data,unsigned short len)
{
int i;
for(i=0;i<len;i++){
USART_SendData(USART1, (uint8_t) data[i]);
/* 等待发送完毕 */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
return 0;
}