概述
在实际的应用过程中,单片机从串口接收指令然后执行某个操作,这是会经常用到的;而且基于这一个模式的东西在实际的产品模块中也是很常见的。最常见的就是有些模块已经烧录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: %02Xrn", uart_data_buffer[0]);
printf("data1: %02Xrn", uart_data_buffer[1]);
printf("data0: %02Xrn", uart_data_buffer[2]);
printf("color_val: %drn", 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++;
}
}
}
最后
以上就是动听手机为你收集整理的单片机--C语言--串口接收指令然后处理的模板的全部内容,希望文章能够帮你解决单片机--C语言--串口接收指令然后处理的模板所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复