1.函数指针
函数指针本身是指针变量,该指针变量指向函数的入口地址。基础的功能是调用函数和做函数参数。
2.函数指针的应用
- 匹配字符串(例如AT指令),执行相应的函数。将自己开发的单片机或者物联网模组封装好,只留出UART外设供外部使用。再使用UART传递交换AT指令。如下图所示,使用一个单片机采集陀螺仪加速度计数据,使用卡尔曼或者互补滤波实现角度输出,这时候将单片机和传感器封装起来成为一个模块。其他设备使用该模块的时候只需使用AT指令就可以实现控制和数据传输。
- 补充一点额外知识,很多模块是可以定时透传数据的,比如GPS模块定时1s传输一个数据包,只需对数据包进行解析就可以获取到定位数据,这一点我后面的博客会谈到。
3.代码
代码我使用codeblock模拟,具体应用到单片机等等设备需要调整。
#include <stdio.h>
#include <stdlib.h>
#define MAX_COMMAD 2
void AT1(void);
void AT2(void);
typedef void (*FUNC)(void);//函数指针
//指令结构体包括指令名以及对应的函数指针
typedef struct
{
char * at_cmd;
FUNC func;
}AT_CMD_TABLE;
//使用结构体数组的方式定义AT指令表
AT_CMD_TABLE cmd_table[] =
{
{"AT1", AT1},
{"AT2", AT2}
};
int main()
{
char tmp[10];
int i = 0;
int match_succuss = 0;//匹配成功标志位
printf("输入AT指令\n");
scanf("%s",tmp);
while(i<MAX_COMMAD)
{
if(strncmp(cmd_table[i].at_cmd, tmp, strlen(tmp)) == 0)
{
match_succuss = 1;
cmd_table[i].func();//跳转到对应函数
break;
}
i++;
}
if(match_succuss == 0)
{
printf("未找到AT指令");
}
return 0;
}
void AT1()
{
printf("AT1");
}
void AT2()
{
printf("AT2");
}