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

 在实际的应用过程中,单片机从串口接收指令然后执行某个操作,这是会经常用到的;而且基于这一个模式的东西在实际的产品模块中也是很常见的。最常见的就是有些模块已经烧录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;
	uint32_t uart_val = 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;
		// 执行命令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;
		// 执行命令1
	}
}

方式二:有标志位


猜你喜欢

转载自blog.csdn.net/qq_28877125/article/details/94550045