STM32模拟shell指令,串口接收指令后打印数据

1.创建buffer. 初始化buffer.

typedef struct Buffer {
	unsigned char* data;
	int bufSize;
	int readOff;
	int writeOff;
	int dataLen;
}BUFFER;

int Buffer_find(struct Buffer* buf, unsigned char* cs, int len){
	int i,j,e;
	bool find;
	e = buf->dataLen - len;
	for(i = 0; i<=e; i++){
		find = TRUE;
		for(j=0; j<len; j++){
			if(buf->data[i+j] != cs[j]){
				find = FALSE;
				break;
			}
		}
		if(find)
			return i;
	}
	return -1;
}
void Buffer_write(struct Buffer* buf, unsigned char c) {
	buf->data[buf->writeOff] = c;
	buf->writeOff++;
	if(buf->writeOff >= buf->bufSize)
		buf->writeOff = 0;
	buf->dataLen++;
	if(buf->dataLen > buf->bufSize){
		buf->dataLen = buf->bufSize;
		buf->readOff++;
		if(buf->readOff >= buf->bufSize)
			buf->readOff = 0;
	}
}
void Buffer_clear(struct Buffer* buf){
	int i;
	Buffer_reset(buf);
	for(i = 0; i<buf->bufSize; i++)
		buf->data[i] = 0;
}
void Buffer_new(int size){
	buf->data = cs;
	buf->readOff = 0;
	buf->writeOff = 0;
	buf->dataLen = 0;
	buf->bufSize = size;
}
Buffer* debugBuf;
debugBuf = Buffer_new(8);  //串口调试

2.在中断中接收数据保存到buffer

 Buffer_write(debugBuf,data);  //接收串口信息

3.根据串口指令打印相应的调试信息

#define CMD_GPIO      "#gpio"
		if (Buffer_find(debugBuf, (uint8 *) CMD_GPIO, 5) >= 0) {
			printInt(gpio_get_pin(GPIO_12));
			Buffer_clear(debugBuf);
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内置 "cmd-list" 命令获取所有命令列表 支持 tab 键补全命令 支持 backspace 回退,这个在 putty 上有 bug ,还没修复。在secureCRT正常。 支持上下箭头回溯历史,这个功能没有做的很好; 支持左右箭头编辑当前命令行输入; 提供 shell_cmdparam()函数转换命令后所跟的数字参数(字符串转整型),详见 demo 提供 shell_option_suport() 函数,使命令行支持 getopt()函数,详见 demo 系统共有9个文件,全部与硬件无关,编译语言要在 C99 以上(keil 在 project -> Options .. -> c/c++ -> C99 勾上) kernel.h // 一些必要的宏定义 shell.c,shell.h //具体的命令行解释的实现 ustdio.c,ustdio.h //非标准输出文件,重新链接 printf ,并提供一个小巧型的 printk 函数 avltree.c,avltree.h //平衡二叉树支持,shell 默认用链表建立查询机制,有必要可在shell.h 中开启二叉树 getopt.c,getopt.h //网上找的 getopt() 源码 除了 getopt.c,getopt.h 两个文件是我从网上找的源码,主要实现命令行的 getopt()解析,其他的都是笔者所写。 使用: 1,首先把 shell.c ustdio.c 加入工程,这两个文件是必须的。 如果不用 getopt()函数可以不添加getopt.c文件。 shell默认使用链表来构建查询系统,但也提供了平衡二叉树的方式,在shell.h中有开启的开关,如不需要可以不添加avltree.c。 include "shell.h" 2,先对硬件进行基本的初始化。 撰写串口发送函数,形如 void usart_puts(char * str , uint16_t len) ; 调用函数 shell_init("shell >",usart_puts); //初始化shell的输入标志和默认输出指向 串口接收以包为单位。 3,新建全局变量 struct shell_input serial_shell ; 并初始化 SHELL_INPUT_INIT(&serial;_shell ,usart_puts);初始化输入缓存和输出交互; 4,串口接收到一整包函数后,调用 shell_input(&serial;_shell , packet , pktlen) ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值