文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

OpenHarmony中AT模块的代码理解之三

2024-12-02 05:16

关注

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

​https://ost.51cto.com​

现在开启第三篇,核心内容是AT命令的注册。

1、AT命令结构体

typedef struct {
hi_char *at_cmd_name;
hi_s8 at_cmd_len;
at_call_back_func at_test_cmd;
at_call_back_func at_query_cmd;
at_call_back_func at_setup_cmd;
at_call_back_func at_exe_cmd;
} at_cmd_func;

hi_char *at_cmd_name;为命令字符串,不包含“AT”字符。

hi_s8 at_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_void hi_at_sys_cmd_register(hi_void)
{
hi_at_general_cmd_register();
#ifndef CONFIG_FACTORY_TEST_MODE
hi_at_sta_cmd_register();
hi_at_softap_cmd_register();
#endif
hi_at_hipriv_cmd_register();
#ifndef CONFIG_FACTORY_TEST_MODE
#ifdef LOSCFG_APP_MESH
hi_at_mesh_cmd_register();
#endif
hi_at_lowpower_cmd_register();
#endif
hi_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命令结构体。

const at_cmd_func g_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_exe_reset_cmd},
{"+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_u32 hi_at_register_cmd(HI_CONST at_cmd_func *cmd_tbl, hi_u16 cmd_num)
{
hi_u32 ret = HI_ERR_FAILURE;
hi_u8 i;
if (cmd_tbl == HI_NULL || cmd_num == 0) {
return HI_ERR_FAILURE;
}
ret = check_cmd_tbl(cmd_tbl, cmd_num);
if (ret != HI_ERR_SUCCESS) {
return ret;
}
at_cmd_func_list *cmd_list = at_get_list();
for (i = 0; i < AT_CMD_LIST_NUM; i++) {
if ((cmd_list->at_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;
break;
}
ret = check_name_and_callback(cmd_list, i, cmd_tbl, cmd_num);
if (ret != HI_ERR_SUCCESS) {
break;
}
}
return ret;
}

其中几个核心函数的说明:

(1)check_cmd_tbl(cmd_tbl, cmd_num)。

确认需要注册的AT命令结构体中没有重复的指令。

(2)at_get_list()。

获取全局变量HI_PRV at_cmd_func_list g_at_cmd_list = { 0 }的指针。这个结构体数据中存储着已经注册的AT命令。

(3)check_name_and_callback(cmd_list, i, cmd_tbl, cmd_num)。

为检查要注册的AT命令是否有重复,避免重复注册。

(4)for (i = 0; i < AT_CMD_LIST_NUM; i++) {}去遍历g_at_cmd_list中已经存储到了第几个位置。如果遍历到空位置,则将要注册的AT命令结构体的指针进行存储。

cmd_list->at_cmd_list[i] = cmd_tbl;
cmd_list->at_cmd_num[i] = cmd_num;

3、总结

注册部分功能,就是将AT命令的添加到g_at_cmd_list的数组中。等到通过串口接收到的指令进行解析的时候,还会遍历存储在g_at_cmd_list中的指令的。所有这个结构体数组,后续还会用到。

如果想要自己添加AT命令。可以仿照给出的通用规则,自己添加即可。这里不展开说明。

这篇文章,就先介绍到这里。

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

​https://ost.51cto.com​

来源:鸿蒙社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯