了解更多请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com一、背景介绍最早接触AT命令是在使用通讯模块的时候。当时对AT命令的打包和解析都是通过自己编写的函数来实现的。代码逻辑和框架不成熟,通用性不强。现在的RTOS操作系统也包含了这部分内容,比如RTT等,比较通用,代码的逻辑也值得我们去分析和学习。接触openharmony后发现系统代码中也包含了AT相关的服务。今天试着梳理一下这部分代码的思路。2、总结(1)代码路径device\hisilicon\hispark_pegasus\sdk_liteos\components\at\src\(2)关闭AT服务有时候需要用串口做一些私事,不想用原生AT命令,比如移植micropython,需要关闭AT服务。关闭方法如下:打开device\hisilicon\hispark_pegasus\sdk_liteos\build\config\usr_config.mk。从中删除#CONFIG_AT_SUPPORT=y。或者使用menuconfig关闭文件。宏关闭后,会在config.mk中判断宏的值。ifeq($(CONFIG_AT_SUPPORT),y)DEFINES+=-DCONFIG_AT_COMMANDendif会使AT初始化和注册相关函数失效。3.框架简要描述程序框架。核心内容分为接收任务和处理任务。两个任务通过Event事件同步。cmd_register函数用于注册我们需要解析的AT命令。4.代码(1)数据接收数据接收任务创建在hi_u32hi_at_init(hi_void)。attr.stack_size=g_at_uart_task_size;attr.task_prio=AT_UART_TASK_PRIO;attr.task_name=(hi_char*)"at_uart";ret=hi_task_create(&at_uart_task,&attr,at_uart_task_body,0);if(ret!=inTS_ERR_ATUCCESS_ffail\r\n");returnret;}(2)数据处理属性。stack_size=1024*6;attr.task_prio=AT_PROC_TASK_PRIO;attr.task_name=(hi_char*)"at_proc";ret=hi_task_create(&at_proc_task,&attr,at_proc_task_body,0);if(ret!=HI_ERR_SUCCESS){hi_at_printf("AT_PROC_TSKinitfail\r\n");returnret;}通过g_at_event在两个task之间传递数据buf=at_get_buf();拿到数据后解析处理,处理函数如下。hi_voidat_cmd_execute(hi_char*buf){hi_u32ret;如果(memcmp(buf,AT_CMD_HEADER,strlen(AT_CMD_HEADER))==EOK){hi_char*at_buf=buf+strlen(AT_CMD_HEADER);ret=at_cmd_process(at_buf);ret!=HI_ERR_SUCCESS)&&(ret!=HI_ERR_RECVING)){g_at_ctrl.at_state=AT_IDLE;}}else{AT_ENTER;AT_RESPONSE_ERROR;g_at_ctrl.at_state=AT_IDLE;}}处理函数会比较注册的AT命令中的关键字,然后解析,处理,执行。5.总结本文先整理到这里,后面会有更详细的AT命令逻辑分析。后续计划:(1)继续分析openharmony的AT命令的代码思路和关键函数。(2)与RT-Thread等其他RTOS的AT部分的实现相比。(3)简化了openharmony的部分代码,移植了一套可以在其他平台上使用的AT框架。更多信息请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com
