凡亿教育-小文
凡事用心,一起进步
打开APP
公司名片
凡亿专栏 | 嵌入式数据结构, C 语言映射表在串口解析中的应用
嵌入式数据结构, C 语言映射表在串口解析中的应用

我是老温,一名热爱学习的嵌入式工程师
关注我,一起变得更加优秀!

一、映射表在串口数据解析中的应用

1、数据结构
typedef struct {    char CMD[CMDLen];    unsigned char (*cmd_operate)(char *data);}Usart_Tab;
2、指令、函数映射表
static const Usart_Tab InstructionList[CMDMax]={    {"PWON",PowOn},    {"PWOFF",PowOff},    {"HDCP",HdcpOnOff},    {"/V",QueryKaVersion},    {"EDIDUpgrade",UpdataEDID},    {"Psave",Psave},    {"Precall",Precall},    {"Pclear",Pclear},};
3、串口解析函数实现
unsigned char DataAnalysis(char *buf){  unsigned char i,Result;  char *NEXT=NULL;  for(i=0;i  {    NEXT=StrCmp(buf,(char*)InstructionList[i].CMD);    if(NEXT!=NULL)    {      usartfuncp=InstructionList[i].cmd_operate;      Result=(*usartfuncp)(NEXT);    }  }  return Result;}

二、映射表在UI设计中的应用

1、数据结构

菜单枚举:typedef enum{  stage1=0,  stage2,  stage3,  stage4,  stage5,  stage6,  stage7,  stage8,  stage9,}SCENE;

数据结构:

typedef struct {  void (*current_operate)(); //当前场景的处理函数  SCENE Index;               //当前场景的标签  SCENE Up;                  //按下Up键跳转的场景  SCENE Down;                //按下Down键跳转的场景  SCENE Right;               //按下Left键跳转的场景  SCENE Left;                //按下Right键跳转的场景}STAGE_TAB;
2、函数映射表
STAGE_TAB stage_tab[]={  #.    operate       Index    Up     Down    Left   Right     {Stage1_Handler,  stage1,  stage4,  stage7,  stage3, stage2},  {Stage2_Handler,  stage2,  stage5,  stage8,  stage1, stage3},  {Stage3_Handler,  stage3,  stage6,  stage9,  stage2, stage1},  {Stage4_Handler,  stage4,  stage7,  stage1,  stage6, stage5},  {Stage5_Handler,  stage5,  stage8,  stage2, stage4,  stage6},  {Stage6_Handler,  stage6,  stage9,  stage3, stage5,  stage4},  {Stage7_Handler,  stage7,  stage1,  stage4, stage9,  stage8},  {Stage8_Handler,  stage8,  stage2,  stage5, stage7,  stage9},  {Stage9_Handler,  stage9,  stage3,  stage6, stage8,  stage7},};
3、定义两个变量保存当前场景和上一个场景
char current_stage=stage1;char prev_stage=current_stage;
4、按下Up按键 跳转到指定场景current_stage的值根据映射表改变
current_stage =stage_tab[current_stage].Up;
5、场景改变后 根据映射表执行相应的函数Handler
if(current_stage!=prev_stage){  stage_tab[current_stage].current_operate();  prev_stage=current_stage;}


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。
相关阅读
进入分区查看更多精彩内容>
精彩评论

暂无评论