尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

域格移芯平台模块之open二次开发(二):AT指令

域格移芯平台模块之open二次开发(二):AT指令 适用模块YM310 X09、YM310 X19、YM310 X08、YM310 W09、YM310 W19AT指令概述模块自带AT指令RIL接口RIL接口说明使用流程注意事项客户自定义AT指令参考 demo_gpio.cdemo_gpio.c 的指令格式实现步骤注意事项实测验证踩坑记录自定义 AT 在 USB 口不响应RIL 回调拿不到 CESQ 响应两类指令的快速对照本篇示例基于 demo 工程编译命令为build YM310_X09C.S61 demo。AT指令概述在 OpenCPU开发里AT 指令有两类实现方法模块自带 AT 指令协议栈/基带原生支持比如ATCPIN?查 SIM、ATCEREG?查注册、ATCESQ查信号。应用不用实现只管发给协议栈、收响应。客户自定义 AT 指令协议栈不认识比如ATGPIO2,0,1、ATMYRSRP。全部由应用层代码解析、执行、回复常用于让外部 MCU / 上位机控制模组上的应用行为。本篇分别讲这两类在 YOpen SDK 下怎么调、怎么配、怎么发并给出一个能同时跑通两类指令的实测 demo。模块自带AT指令RIL接口RIL接口说明SDK 在api/yopen_ril.h里封装了 RIL 接口应用通过它把 AT 发给协议栈// RIL 初始化注册 URC 主动上报回调yopen_errcode_ril_eyopen_ril_init(yopen_ril_urc_callback callback);// 发送 AT 指令typedefint32_t(*yopen_ril_callback)(char*line,uint32_tline_len,void*user_data);yopen_errcode_ril_eyopen_ril_send_atcmd(char*cmd,uint32_tcmd_len,yopen_ril_callback callback,void*param);使用流程初始化 RIL应用启动时yopen_ril_init()注册一个 URC 回调用来接收网络主动上报来电、短信、注册状态变化。构造命令字符串按 3GPP / 厂商规范拼写末尾带\r\n。比如查卡状态必须写成ATCPIN?\r\n。下发指令yopen_ril_send_atcmd()传命令、长度、响应回调、自定义参数。解析响应回调里逐行收到协议栈返回常见有OK、ERROR、厂商扩展错误如CME ERROR: 140以及查询类信息行。下面以查询 RSRP 为例ATCESQ#includeyopen_ril.h#includeyopen_nw.hstaticintg_rsrp255;/* 255 表示无效 *//* RIL 响应回调协议栈返回内容逐行传入 */staticint32_tcesq_rsp_cb(char*line,uint32_tline_len,void*user_data){if(linestrstr(line,CESQ:)){/* CESQ: rxlev,ber,rscp,ecno,rsrq,rsrp */char*pstrchr(line,:)1;intfield0;char*comma;while((commastrchr(p,,))!NULL){*comma0;if(field6){g_rsrpatoi(p);break;}/* 第 6 字段 RSRP */pcomma1;}DEMO_AT_TRACE(parse CESQ rsrp%d\n,g_rsrp);}return0;}voidquery_rsrp_by_at(void){yopen_ril_init(NULL);yopen_ril_send_atcmd(ATCESQ\r\n,strlen(ATCESQ\r\n),cesq_rsp_cb,NULL);}注意事项超时与重试yopen_ril_send_atcmd()自身不直接暴露超时参数超时由 RIL 内部管默认约 5 秒。涉及网络交互的命令短信、PDP 激活建议上层用状态机 超时计数器保护别在主线程死等。命令格式严格按规范。ATD拨号必须带;ATCMGS发短信先等提示再发内容、以CtrlZ(0x1A) 结尾。错误码解析CME ERROR: code优先查厂商扩展定义。比如该平台140在bsp/EC7XX/kernel/PLAT/prebuild/PS/inc/cmicomm.h里是CME_FEATURE_NOT_SUPPORTED常见于没开 VoLTE/IMS 却去拨语音电话的场景详见文末踩坑记录。客户自定义AT指令参考 demo_gpio.cdemo_gpio.c 的指令格式YOpen SDK 里自定义 AT 的典型参考是demo/demo_gpio.c它实现了ATGPIOyopen_GpioNum,dir[,level]例如ATGPIO2,0,1把 GPIO2 配成输出并拉高。命令从 USB / 指定 UART 收进来应用解析后执行 GPIO 动作并通过同一串口回结果。实现步骤初始化 UARTyopen_uart_set_dcbconfig()配波特率yopen_uart_open()打开口yopen_uart_register_cb()注册接收回调。接收回调通知任务回调里收到YOPEN_UART_RX_RECV_DATA_IND事件后用消息队列通知业务任务去读数据。读取并解析业务任务yopen_uart_read()读串口再parse_at_command()解析——strchr(input,)定位命令名与参数分隔strchr(params_start,,)依次切分多参数atoi()转整型。执行并回复按解析结果设 GPIO 方向/电平然后demo_uart_write()回\r\nOK\r\n失败回\r\nERROR\r\n。要上报状态则按CRLFGPIO LVL levelCRLF回送最后也要有OK/ERROR收尾。下面以ATMYRSRP查询 RSRP 的自定义指令为例展示 UART 接收侧代码#includeyopen_uart.h#includeyopen_nw.h#defineMY_AT_PORTYOPEN_UART_PORT_1/* 自定义 AT 走独立 UART避开 USB 口 *//* 业务任务里读串口、解析、回复 */staticvoidat_uart_task(void){chardata[128];intlenyopen_uart_read(MY_AT_PORT,(uint8_t*)data,sizeof(data)-1);if(len0)return;data[len]0;/* 归一化去前导空白、转大写兼容 ATMYRSRP / ATMYRSRP? / ATMYRSRP; 等变体 *//* 归一化实现可参考 demo_gpio.c 的 parse_at_command() */if(strncmp(data,ATMYRSRP,9)0){yopen_nw_signal_strength_info_s sig;charresp[64];if(yopen_nw_get_signal_strength(0,sig)YOPEN_NW_SUCCESS)snprintf(resp,sizeof(resp),\r\nMYRSRP: %d\r\n\r\nOK\r\n,sig.rsrp);elsesnprintf(resp,sizeof(resp),\r\nMYRSRP: NA\r\n\r\nERROR\r\n);yopen_uart_write(MY_AT_PORT,(uint8_t*)resp,strlen(resp));}else{yopen_uart_write(MY_AT_PORT,(uint8_t*)\r\nERROR\r\n,9);}}注意事项自定义 AT 处理任务别做长耗时操作否则阻塞串口读取影响后续命令和 URC。多任务共享 GPIO / 传感器等资源时解析执行要加锁。回复尽量简短避免占串口太久。命令命名建议加私有前缀如ATMYGPIO、ATMYRSRP别和模块自带AT标准指令撞车。端口选择见下方「踩坑记录」——S61 这类平台 USB AT 口被原厂引擎占着自定义 AT 建议直接接硬件 UART如 UART1。实测验证下面这张图来自 YOpen SDKEC716S / YM310_X09C.S61 平台上的真实测试两类 AT 同时跑、互不干扰。左侧 EPAT Trace 窗口模块自带 AT 路径ATCMD , decode AT : ATCESQ应用层通过yopen_ril_send_atcmd()把ATCESQ下发给协议栈。AT CMD , RESP : CESQ: 99,99,255,255,34,48协议栈返回小区信号质量最后一个字段48就是 RSRP 报告值。[AT_RSRP]auto ATCESQ rsrp48应用在 RIL 回调里解析出 RSRP 并打印到 trace。右侧串口助手窗口客户自定义 AT 路径通过硬件 UART1 向模组发ATMYRSRP。模组应用层收到后调yopen_nw_get_signal_strength()读信号强度回送结果最终返回OK。踩坑记录自定义 AT 在 USB 口不响应现象应用层yopen_uart_open(YOPEN_USB_PORT_COM)后从外部串口助手发ATMYRSRP回ERROR而ATCESQ等原厂指令却正常。原因YM310_X09C.S61EC716s平台上YOPEN_USB_PORT_COM被协议栈 AT 引擎独占应用层无法通过yopen_uart_open()接管这个口。外部指令实际走的是原厂 AT 引擎所以不认识自定义指令。处理方法把自定义 AT 改走硬件 UARTstaticints_uart_portYOPEN_UART_PORT_1;/* 原来是 YOPEN_USB_PORT_COM */重新编译烧录从 UART1TX/RX/GND 接电脑串口工具波特率 115200发ATMYRSRP即可。USB AT 口继续正常用原厂指令互不干扰。RIL 回调拿不到 CESQ 响应现象S61 平台调用yopen_ril_send_atcmd(ATCESQ\r\n, ...)后等信号量 5 秒超时g_rsrp一直是 255。原因该平台yopen_ril_send_atcmd()的响应回调不一定会把CESQ:/OK逐行回传给应用层回调外部 USB 口发ATCESQ能回值是因为那条路走的是原厂 AT 引擎。处理方法保留yopen_ril_send_atcmd(ATCESQ\r\n, ...)作为「模块自带 AT 下发」的演示动作但实际取值改用已验证可用的 APIyopen_nw_signal_strength_info_s sig;if(yopen_nw_get_signal_strength(0,sig)YOPEN_NW_SUCCESS)g_rsrpsig.rsrp;/* 直接读稳 */两类指令的快速对照维度模块自带 AT 指令客户自定义 AT 指令实现位置协议栈/基带固件应用层代码如demo_gpio.c调用/入口yopen_ril_send_atcmd()yopen_uart_read() 自行解析结果返回RIL 回调逐行接收yopen_uart_write()主动回复典型示例ATCPIN?、ATD...ATGPIO2,0,1出错排查查 CME 错误码/网络状态查解析逻辑和 GPIO 配置
返回列表