当前位置: 首页 > 科技观察

OpenHarmony部分AT模块代码理解

时间:2023-03-14 11:30:42 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com现在开启第三章,核心内容是AT命令的注册。1、命令结构typedefstruct{hi_char*at_cmd_name;hi_s8at_cmd_len;at_call_back_funcat_test_cmd;at_call_back_funcat_query_cmd;at_call_back_funcat_setup_cmd;at_call_back_funcat_exe_cmd;}at_cmd_func;hi_char*at_cmd_name;为指令字符串,不包含“AT”字符。hi_s8at_cmd_len;是字符串长度。下面四个回调函数分别对应四种AT指令:测试指令、查询指令、设置指令和执行指令。例如:{“+RST”,4,HI_NULL,HI_NULL,(at_call_back_func)at_setup_reset_cmd,(at_call_back_func)at_exe_reset_cmd}。2、注册函数hi_at_sys_cmd_register()这个函数包含了很多注册函数。每个函数都包含一类AT命令。hi_voidhi_at_sys_cmd_register(hi_void){hi_at_general_cmd_register();#ifndefCONFIG_FACTORY_TEST_MODEhi_at_sta_cmd_register();hi_at_softap_cmd_register();#endifhi_at_hipriv_cmd_register();#ifndefCONFIG_FACTORY_TEST_MODE#ifdefLOSCFG_APP_MESHhi_at_mesh_cmd_register();#endifhi_at_lowpower_cmd_register();#endifhi_at_general_factory_test_cmd_register();hi_at_sta_factory_test_cmd_register();hi_at_hipriv_factory_test_cmd_register();hi_at_io_cmd_register();}只取其中一个做进一步说明,以hi_at_general_cmd_register()这个函数为例。函数中引用了AT命令的注册函数。hi_at_register_cmd(g_at_general_func_tbl,AT_GENERAL_FUNC_NUM);该函数有两个参数:结构体数组和结构体数组的长度。结构体数组就是上篇介绍的AT指令结构体。常量at_cmd_funcg_at_general_func_tbl[]={{"",0,HI_NULL,HI_NULL,HI_NULL,(at_call_back_func)at_exe_at_cmd},{"+RST",4,HI_NULL,HI_NULL,(at_call_back_func)at_setup_reset_cmd,(at_call_back_func)at_cmd},{"+RST",HI_NULL,HI_NULL+MAC",4,HI_NULL,(at_call_back_func)cmd_get_macaddr,(at_call_back_func)cmd_set_macaddr,HI_NULL},{"+HELP",5,HI_NULL,HI_NULL,HI_NULL,(at_call_back_func)at_exe_help_cmd},};下面对注册表数量进行说明。hi_u32hi_at_register_cmd(HI_CONSTat_cmd_func*cmd_tbl,hi_u16cmd_num){hi_u32ret=HI_ERR_FAILURE;嗨u8我;如果(cmd_tbl==HI_NULL||cmd_num==0){返回HI_ERR_FAILURE;}ret=check_cmd_tbl(cmd_tbl,cmd_num);if(ret!=HI_ERR_SUCCESS){返回ret;}at_cmd_func_list*cmd_list=at_get_list();for(i=0;iat_cmd_list[i]==HI_NULL)||(cmd_list->at_cmd_num[i]==0)){cmd_list->at_cmd_list[i]=cmd_tbl;cmd_list->at_cmd_num[i]=cmd_num;ret=HI_ERR_SUCCESS;休息;}ret=check_name_and_callback(cmd_list,i,cmd_tbl,cmd_num);如果(ret!=HI_ERR_SUCCESS){break;}}returnret;}几个核心函数说明:(1)check_cmd_tbl(cmd_tbl,cmd_num)。确认AT命令结构中没有重复的命令需要注册。(2)at_get_list()。获取指向全局变量HI_PRV的指针at_cmd_func_listg_at_cmd_list={0}。该结构体数据存储注册的AT命令。(3)check_name_and_callback(cmd_list,i,cmd_tbl,cmd_num)。为了检查要注册的AT命令是否重复,避免重复注册。(4)for(i=0;iat_cmd_list[i]=cmd_tbl;cmd_list->at_cmd_num[i]=cmd_num;3、总结一下注册部分的功能,就是在g_at_cmd_list的数组中加入AT指令。当解析通过串口接收到的指令时,也会遍历g_at_cmd_list中存储的指令。所有这个结构体数组都会在后面用到。如果你想自己添加AT命令。您可以遵循给出的一般规则并自己添加它们。这里不做解释。本文就先介绍到这里。更多信息请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com