单片机--C语言--串口接收指令然后处理的模板

121 篇文章 21 订阅

 在实际的应用过程中,单片机从串口接收指令然后执行某个操作,这是会经常用到的;而且基于这一个模式的东西在实际的产品模块中也是很常见的。最常见的就是有些模块已经烧录AT固件,然后用户需要按照规定的AT指令来操作模块。再讲远一点话命令行也是一种“AT指令操作”,扯远了。基于单片机的,又常用到,我觉得会经常用到所以非常有必要写一个模板来。

方式一:依个数

 最简单的,比如以下这种就是,每收到3个数据就处理一下,一般用于特定的场合。

void uart_evt_handle(uint8_t data)
{
    uint8_t uart_cnt;
    uint8_t uart_data_buffer[3] = 0;
	uint32_t uart_val = 0;

	uart_data_buffer[uart_cnt] = data;
	uart_cnt++;

	if((uart_cnt >= 3))
	{
		uart_val = ((uint32_t)uart_data_buffer[0]<<16) + 
					((uint32_t)uart_data_buffer[1]<<8) +
					(uint32_t)uart_data_buffer[2];
		
		printf("data2: %02X\r\n", uart_data_buffer[0]);
		printf("data1: %02X\r\n", uart_data_buffer[1]);
		printf("data0: %02X\r\n", uart_data_buffer[2]);
		
		printf("color_val: %d\r\n", uart_val);
		
		uart_cnt = 0;
	}
}

方式二:没有标志位

// 没有标志位
void uart_evt_handle(uint8_t data)
{
    uint8_t uart_cnt;
    uint8_t uart_data_buffer[10] = 0;

	uart_data_buffer[uart_cnt] = data;
	uart_cnt++;

	if((uart_cnt >= 4) &&
	   (uart_data_buffer[0] == 'c')   &&
	   (uart_data_buffer[1] == 'm')   &&
	   (uart_data_buffer[2] == 'd')   &&
	   (uart_data_buffer[3] == '0')   &&
	   (uart_data_buffer[4] == ':')   &&)
	{	
		uart_cnt = 0;
		memset(uart_data_buffer, 0, sizeof(uart_data_buffer));
		// 执行命令0
	}
	
	if((uart_cnt >= 4) &&
	   (uart_data_buffer[0] == 'c')   &&
	   (uart_data_buffer[1] == 'm')   &&
	   (uart_data_buffer[2] == 'd')   &&
	   (uart_data_buffer[3] == '1')   &&
	   (uart_data_buffer[4] == ':')   &&)
	{	
		uart_cnt = 0;
		memset(uart_data_buffer, 0, sizeof(uart_data_buffer));
		// 执行命令1
	}
}

方式三:有标志位

// 有标志位
void uart_evt_handle(uint8_t data)
{
	static uint8_t  start_flg = 0;

    uint8_t uart_cnt;
    uint8_t uart_data_buffer[10] = 0;

	if(data == '>')
	{
		start_flg = 1;
	}

	if(start_flg == 1)
	{
		if(data == '\n')
		{
			start_flg = 0;

			if((uart_data_buffer[1] == 'c')   &&
			   (uart_data_buffer[2] == 'm')   &&
			   (uart_data_buffer[3] == 'd')   &&
			   (uart_data_buffer[4] == '0')   &&
			   (uart_data_buffer[5] == ':')   &&)
			{	
				uart_cnt = 0;
				memset(uart_data_buffer, 0, sizeof(uart_data_buffer));
				// 执行命令0
			}
			
			if((uart_data_buffer[1] == 'c')   &&
			   (uart_data_buffer[2] == 'm')   &&
			   (uart_data_buffer[3] == 'd')   &&
			   (uart_data_buffer[4] == '1')   &&
			   (uart_data_buffer[5] == ':')   &&)
			{	
				uart_cnt = 0;
				memset(uart_data_buffer, 0, sizeof(uart_data_buffer));
				// 执行命令1
			}			
		}
		else
		{
			uart_data_buffer[uart_cnt] = data;
			uart_cnt++;			
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值