1 前言
使用小凌派和迪文屏进行通信,有一些特殊的命令,为了方便识别及处理,我设计了迪文屏事件接收结构体,用于存放命令以及需要执行的函数。
2 基础
2.1 uart数据结构
迪文屏uart传输的数据结构是uint8_t,使用十六进制显示为0x5A A5 XX 83 YY YY ZZ ZZ 。
命令结构:
5AA5为标志位,默认起始
XX为字节长度,也就是XX后面又多少字节。比如该条指令,XX就是05。(83 YY YY ZZ ZZ共5个字节)
83/82为读写状态位
YYYY为地址,比如3000
ZZZZ为地址内存放的数据,注意迪文屏一个地址存放2字节数据。
为了方便处理,我尝试将uint8_t存储为字符串char。
处理方法也较为简单,使用sprintf(“%x”)函数。
char temp_c[3];
char * uint8_t2char(uint8_t value)
{
memset(temp_c,0x00,3);
sprintf(temp_c, "%02X", value);
// printf("temp_c = [%s]\n",temp_c);
return temp_c;
}
temp_c用于临时存储数据,后续使用strcat(XXX,temp_c);将其存储到指定的字符串数组中。
2.2 事件结构体
#define EVENT_FLAG_NAME_MAX 30
#define EVENT_KEY_VALUE_MAX 11
typedef struct
{
char key[EVENT_KEY_VALUE_MAX]; // key[0,3] addr key[4,7] value
char event_name[EVENT_FLAG_NAME_MAX];
void (*func)();
}dwin_event_key_spec;
这里包含三个数据
key是检索的命令内容,比如地址是1500,值是0001,那么key就是"15000001"。
event_name是事件的介绍信息,比如"cam_open",表示这个是camera事件。
func是函数指针,当匹配到这个key的时候就可以执行该函数。
#define EVENT_KEY_SPEC_VALUE "over"
#define EVENT_KEY_SPEC_NUM_MAX 20
dwin_event_key_spec event_key_spec[EVENT_KEY_SPEC_NUM_MAX]=
{
{"1502010012", "search", func_search},
/* ... */
{EVENT_KEY_SPEC_VALUE, "end", func_spec_end}
};
void func_search()
{
printf("--- func_search\n");
printf("--- func_search\n");
return;
}
这是我列的一个特殊事件组。存放了key为"1502010012",介绍为search,执行函数是func_search。
2.3 迪文命令结构体
获取到了uart的uint8_t指针,我将信息都解析存储到dwin_cmd结构体中,方便后续使用。
typedef struct
{
uint8_t head[2];
uint8_t len;
uint8_t wr;
uint8_t addr[2];
uint8_t * value;
// uint8_t cmd_u8[DWIN_CMD_LEN_U8_MAX];
uint8_t * cmd_u8;
char * cmd_char;
}dwin_cmd;
cmd_u8和cmd_char需要使用malloc分配对应的空间用于存放命令。
4 事件判断
事件添加步骤
- 在event_key_spec中添加自己需要的关键字、介绍、执行函数
- 获取到uart的u8数据,将其存储到字符串数组中
- 获取char指针指向该命令的value位置
- strcmp指针以及表中的key
void searc_spec_event(dwin_cmd * cmd)
{
printf("search spec event\n");
dwin_event_key_spec * temp_value ;
temp_value = &event_key_spec[0];
// printf("spec event key = %s\n",temp_value->key);
for(int i = 0; strcmp(temp_value->key,EVENT_KEY_SPEC_VALUE) != 0 && i<EVENT_KEY_SPEC_NUM_MAX ; i++)
{
// printf("spec event key = %s\n",temp_value->key);
// printf("spec event value = %s\n",cmd->cmd_char + DWIN_CMD_CHAR_ADDR_VALUE);
if(strstr(cmd->cmd_char + DWIN_CMD_CHAR_ADDR_VALUE, temp_value->key ) != NULL)
{
temp_value->func();
printf("find spec event, value = %s, name = %s\n",temp_value->key,temp_value->event_name);
return;
}
temp_value = &event_key_spec[i];
}
printf("unfind spec key\n");
return;
}
5 结果
在迪文屏按下检索图标,自动上报1502010012,事件监听到并执行对应的func_search函数。