Hi3861 AT指令源码分析,如何添加一条自己的AT指令 - HarmonyOS技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

连志安 关注 私信
[文章]

Hi3861 AT指令源码分析,如何添加一条自己的AT指令

3.2 Hi3861 AT指令源码分析,如何添加一条自己的AT指令
这节主要讲下 hi3861 的AT指令相关。先看下AT指令在源码中的位置。上一节已经说到,hi3861 内核启动后的第一个入口函数。
代码路径:
vendorhisihi3861hi3861appwifiiot_appsrcapp_main.c

hi_void app_main(hi_void)

在app_main函数中,会调用 hi_at_init 进行AT指令的相关初始化。如果初始化成功,则开始注册各类AT指令,代码如下:

初始化部分暂时先不看,主要是底层相关的。我们重点看下 hi_at_sys_cmd_register 注册AT指令的函数。
  1. hi_void hi_at_sys_cmd_register(hi_void)

  2. {

  3. printf("____>>>>> %s %d rn", __FILE__, __LINE__);




  4.     hi_at_general_cmd_register();

  5. #ifndef CONFIG_FACTORY_TEST_MODE

  6.     hi_at_sta_cmd_register();

  7.     hi_at_softap_cmd_register();

  8. #endif

  9.     hi_at_hipriv_cmd_register();

  10. #ifndef CONFIG_FACTORY_TEST_MODE

  11. #ifdef LOSCFG_APP_MESH

  12.     hi_at_mesh_cmd_register();

  13. #endif

  14.     hi_at_lowpower_cmd_register();

  15. #endif

  16.     hi_at_general_factory_test_cmd_register();

  17.     hi_at_sta_factory_test_cmd_register();

  18.     hi_at_hipriv_factory_test_cmd_register();

  19.     hi_at_io_cmd_register();

  20. }

其中,hi_at_general_cmd_register 是注册通用指令。代码如下:

其实就是把 g_at_general_func_tbl 数组的AT指令都注册进来。我们可以看到这个数组的内容:

g_at_general_func_tbl的结构体原型如下:
  1. typedef struct {

  2. //AT指令命。前面省略AT

  3.     hi_char *at_cmd_name;

  4. //指令的长度

  5.     hi_s8   at_cmd_len;

  6. //at测试时调用的回调函数

  7.     at_call_back_func at_test_cmd;

  8. //at查询时调用的回调函数

  9.     at_call_back_func at_query_cmd;

  10. //at设置时调用的回调函数

  11.     at_call_back_func at_setup_cmd;

  12. //at运行时调用的回调函数

  13.     at_call_back_func at_exe_cmd;

  14. } at_cmd_func;


看到这个数组,聪明的朋友应该知道怎么增加第一条属于自己的指令了吧~~~~

(1)增加AT指令

(2)完善相关函数:
  1. hi_u32 at_setup_mytest_cmd(hi_s32 argc, const hi_char *argv[])

  2. {

  3. hi_at_printf("at_setup_mytest_cmd rn");

  4. return HI_ERR_SUCCESS;

  5. }




  6. hi_void at_exe_mytest_cmd(hi_s32 argc, const hi_char *argv[])

  7. {

  8. hi_at_printf("at_exe_mytest_cmd rn");

  9. return HI_ERR_SUCCESS;

  10. }




  11. hi_u32 at_query_mytest_cmd(hi_s32 argc, const hi_char* argv[])

  12. {

  13. hi_at_printf("at_query_mytest_cmd rn");

  14. return HI_ERR_SUCCESS;

  15. }




  16. hi_u32 at_test_mytest_cmd(hi_s32 argc, const hi_char* argv[])

  17. {

  18. hi_at_printf("at_test_mytest_cmd rn");

  19. return HI_ERR_SUCCESS;

  20. }


编译后我们开始测试:
发送:AT+MYTEST
接收:at_exe_mytest_cmd
ERROR

发送:AT+MYTEST?
接收:at_query_mytest_cmd

发送:AT+MYTEST=1
接收:at_setup_mytest_cmd

回帖(1)

jeromyin0216

2021-6-14 10:30:21
老师,上午好!打开AT命令,代码除了调用 hi_at_init 进行AT指令的相关初始化和注册各类AT指令,还要调用什么函数,才能正常使用AT命令? 我折腾了好几天没有搞定,请老师指导,谢谢!

更多回帖

×
发帖