EMS 知识库
首页 / knowledge/代码解析/midware/ethernt/wireless

elink_parse.h

源文件路径:midware/ethernt/wireless/elink_parse.h 所属模块:midware/ethernt/wireless(无线通讯棒驱动层 / AT 指令解析) 代码行数:73

1. 文件职责

本文件是 AT 指令通道的对外头文件,集中定义无线通讯棒 AT 指令集的字符串常量、应答解析状态机的状态枚举、以及 elink_parse.c 导出的 5 个函数原型。

它统一了"哪些 AT 指令可用"这一契约:wifi/e_linker_wifi.c 里的全部 AT 交互都从这里取指令宏(AT_GET_SN、AT_GET_4G_COM、AT_P1_DATA、AT_SET_AP_SSID 等),因此新增/修改通讯棒指令只需改这一处。

它同时是"新旧两代驱动"的接口分界线:旧驱动 wifi/WM6232PU.c 使用的是 WM6232PU.h 里同名同值的枚举副本,本头文件是面向易联/自研棒新通道的版本。

本文件不含任何实现,所有逻辑在 elink_parse.c;也没有定义任何全局变量。

2. 关键数据结构与宏

名称类型说明
AT_STATE_E枚举应答解析状态机状态:AT_RECV_HEAD = 0(等待行首)、AT_SHAKE_HANDS(握手,本工程未使用)、READ_DATE(收内容行)、DATA_LF_MSG(行尾 \r 后等 \n)、MSG_DATA(后续数据/结果字符)
AT_COMM_E枚举解析结果码:AT_RECV_OK = 0、AT_RECV_ERROE、AT_RECV_Y(本工程未使用)、AT_TIMOUT(本工程未使用)
SEND_AT_CODE_TIMEOUT宏100,发 AT 指令的 DMA 完成超时(ms)
RECV_AT_CODE_TIMEOUT宏1500,接收状态机内层等待上限(ms)
AT_E_LOGIN_E宏"AT+LOGIN=E-LINTER\r\n",易联 WIFI/自研通用登录指令;注释说明由旧名 E_LINKER 改为 E-LINTER
AT_ALPHE_LOGIN_E宏"AT+LOGIN=ALPHA_LINKER\r\n",目前只有 Alpha 自研 WIFI 使用
AT_GET_SN / AT_GET_HW / AT_GET_SW宏读通讯棒序列号 / 硬件版本 / 软件版本
AT_GET_STA_EIRP宏"AT+STA_EIRP?\r\n",WIFI 信号强度
AT_GET_STATE宏"AT+WIFI_STATE?\r\n",WIFI 连接状态(含路由 / APP 登录位)
AT_GET_C0_LINK宏"AT+C0_LINK?\r\n",TCP 通道连接状态
AT_GET_4G_COM宏"AT+4G_COM?\r\n",读 4G 模块 6 位状态(SIM/网络/GPRS/TCP/STA/AP)
AT_GET_4G_CSQ宏"AT+CSQ?\r\n",4G 信号质量(RSSI/BER)
AT_GET_AP_SSID / AT_SET_AP_SSID宏读 / 设 AP SSID(SET 系列不带 \r\n,由调用者拼接)
AT_GET_C0_DSTADDR0 / AT_SET_C0_DSTADDR0宏读 / 设云服务器 IP
AT_GET_C0_DSTPORT0 / AT_SET_C0_DSTPORT0宏读 / 设云服务器端口
AT_GET_PWD / AT_SET_PWD宏读 / 设设备密码
AT_SET_ALGORITHM_KEY宏"AT+SNKEYSET=",设置加密算法密钥
AT_GET_PROTOCOL宏"AT+PROTOCOL?\r\n",读协议支持位(纯 TCP/TCP+TLS/MQTT/MQTTS)
AT_OK / AT_ERR宏"OK" / "Login Error",at_execute_command() 的成功/失败判定关键字
AT_RESET宏"AT+RESET\r\n",复位通讯棒
AT_P1_STATE宏"AT+SUBDEV_STATE?\r\n",读 P1 子设备状态
AT_P1_DATA宏"AT+P1E_DATA?\r\n",读 P1 采集器数据(24 字段逗号分隔)

3. 函数清单

本文件为头文件,只含函数声明,无函数定义。

函数名作用域说明(一句话)
u8 e_linker_send(u8 *buf, u32 len, u16 timeout)全局(声明)向通讯棒串口发送数据,返回 1 成功 / 0 超时
u8 e_linker_recv_flag(void)全局(声明)查询串口是否有待读数据
u32 e_linker_recv(u8 *buf, u32 len)全局(声明)从串口环形缓冲读取数据,返回实际长度
void e_linker_clear_buf(void)全局(声明)清空串口接收缓冲与接收信号量
u8 at_execute_command(u8 *cmd, u8 *pdata, u16 timeout)全局(声明)发送 AT 指令并等待应答,返回 TRUE/FALSE

对应的定义分别在 elink_parse.c:25、48、60、84、221。

4. 核心逻辑解析

本文件不含可执行逻辑,其设计要点体现在下列约定上,它们直接决定 elink_parse.c 的行为。

4.1 指令宏的两种格式约定

  sprintf((char*)temp, "%s%s\r\n", (u8*)AT_SET_AP_SSID, buf);
  at_execute_command(temp, pdata, RECV_AT_CODE_TIMEOUT);

若误把 AT_SET_* 直接送入 at_execute_command(),通讯棒会一直等不到换行而超时。

4.2 状态枚举与 WM6232PU.h 的同名副本

AT_STATE_E 与 AT_COMM_E 的成员名和取值与旧驱动 midware/ethernt/wireless/wifi/WM6232PU.h:61(AT_STATE_MACHINE_E)和 WM6232PU.h:70(AT_COMM_STATE_E)完全一致:

新头文件(本文件)旧头文件(WM6232PU.h)成员
AT_STATE_EAT_STATE_MACHINE_EAT_RECV_HEAD=0、AT_SHAKE_HANDS、READ_DATE、DATA_LF_MSG、MSG_DATA
AT_COMM_EAT_COMM_STATE_EAT_RECV_OK=0、AT_RECV_ERROE、AT_RECV_Y、AT_TIMOUT

也就是说这两套枚举是历史演进中被复制出来的两份副本(WM6232PU.c:108/114/127/715 仍在用 AT_RECV_Y / AT_SHAKE_HANDS),新通道只用到其中的 AT_RECV_HEAD、READ_DATE、DATA_LF_MSG、MSG_DATA 与 AT_RECV_OK、AT_RECV_ERROE。由于二者类型名不同、作用域独立,即使同一个 .c 文件同时 include 两份头文件也不会冲突。

4.3 状态机迁移条件(与实现对应)

recv_wifi_log() 的实际迁移完全由 \n / \r 两个分隔符驱动,本头文件里的枚举命名即反映这一设计:

AT_RECV_HEAD --'\n'--> READ_DATE --'\r'--> DATA_LF_MSG --'\n'--> MSG_DATA
                                                          |
                                              'O' -> AT_RECV_OK
                                              'E' -> AT_RECV_ERROE
                                              0x00 -> AT_RECV_OK

DATA_LF_MSG 在收到 \n 后会立刻用 strcmp 比对整行内容是否为 "ERROR" 或 "OK"(对应本文件的 AT_ERR / AT_OK 宏),命中即提前返回结果。

4.4 超时常量

宏值使用位置与含义
SEND_AT_CODE_TIMEOUT100 (ms)at_execute_command() 传给 e_linker_send() 的 DMA 完成超时
RECV_AT_CODE_TIMEOUT1500 (ms)① recv_wifi_log() 内层循环硬上限;② e_linker_wifi.c 中绝大多数 at_execute_command() 的 timeout 实参

两个数值在 OS_TICKS_PER_SEC = 1000(UCOSII/uCOS-CONFIG/os_cfg.h:51)下即为毫秒,与 OSTimeGet() 的计数刻度一致。

4.5 指令集分区

头文件用注释把宏按用途分区(第 35 行 WIFI、第 39 行 4G),提示同一通讯棒在 WIFI 模式与 4G 模式下可用的查询集合不同:

5. 对外接口

本文件导出

名称说明
AT_STATE_E、AT_COMM_E枚举类型,供 elink_parse.c 内部使用(本工程其它文件未直接引用)
全部 AT_* 宏被 wifi/e_linker_wifi.c(绝大多数)与 wireless_driver.c(AT_GET_4G_COM、AT_ALPHE_LOGIN_E、AT_E_LOGIN_E)引用
SEND_AT_CODE_TIMEOUT、RECV_AT_CODE_TIMEOUT被 elink_parse.c 与 wifi/e_linker_wifi.c 引用
5 个函数声明实现在 elink_parse.c

本文件不定义任何全局变量。

本文件依赖的外部项

6. 依赖关系

依赖

被依赖

全工程只有 3 个文件 include 它(grep 确认):

midware/ethernt/wireless/wifi/WM6232PU.c 不依赖本文件,它使用 WM6232PU.h 中的独立副本。

7. 备注与风险点

  1. 两套状态枚举重复维护。 AT_STATE_E / AT_COMM_E 与 WM6232PU.h 中的 AT_STATE_MACHINE_E / AT_COMM_STATE_E 成员完全重复。若日后新增状态,必须同时改两处,否则两个驱动的解析语义会悄悄分叉。建议让旧驱动直接复用本文件的枚举。
  1. AT_SHAKE_HANDS / AT_RECV_Y / AT_TIMOUT 在本文件对应的新通道里从不产生。 elink_parse.c 的 recv_wifi_log() 只会返回 AT_RECV_OK 或 AT_RECV_ERROE;AT_SHAKE_HANDS 这个状态在新状态机里没有迁移路径(state 初值恒为 AT_RECV_HEAD)。AT_TIMOUT 这个结果码也被 at_execute_command() 压成 FALSE。三者是从旧驱动搬运时留下的死枚举。
  1. 与 WM6232PU.h 存在 4 个同名宏,其中 AT_RESET 取值不同。 两个头文件各自 #define 了以下同名宏:
宏名elink_parse.hWM6232PU.h是否同值
AT_RESET"AT+RESET\r\n"(第 58 行)"AT+RESET=88888\r\n"(第 19 行)否
AT_SET_AP_SSID"AT+AP_SSID="(第 50 行)同(第 34 行)是
AT_SET_C0_DSTADDR0"AT+C0_DSTADDR0="(第 51 行)同(第 45 行)是
AT_SET_C0_DSTPORT0"AT+C0_DSTPORT0="(第 52 行)同(第 46 行)是

若某个 .c 同时可见两份头文件,AT_RESET 会触发宏重定义告警,且后 include 者胜出,语义可能被悄悄替换(旧模块需要密码 88888,新模块不带)。目前靠"旧驱动只 include WM6232PU.h、新驱动只 include elink_parse.h"这一约定规避——注意 WM6232PU.h 里另有 AT_OK_STRING / AT_ERROR_STRING,与本文的 AT_OK / AT_ERR 不同名但有相同含义,容易误用。

  1. AT_P1_STATE 已定义但全工程无引用。 只有 AT_P1_DATA 被 e_linker_wifi.c:696 使用;读子设备状态的 AT_P1_STATE 是预留还是遗留,代码中无从判断。
  1. AT_ALPHE_LOGIN_E 拼写可疑。 宏名中的 ALPHE 应为 ALPHA(对应 ALPHA_LINKER),属拼写遗留;因宏名只在本工程内使用,不影响功能,但会给检索带来困扰。
  1. AT_SET_* 宏缺 \r\n 的约定不可自证。 头文件的注释没有说明"设置类指令需调用者补 \r\n"这一关键差异(第 50~54 行与第 32~48 行的格式差别只体现在字符串末尾)。这是使用本头文件时最容易踩的坑。
  1. 函数声明与实现签名一致性。 5 个声明与 elink_parse.c 中的定义逐一对应(e_linker_send 的 len 在声明与定义处均为 u32,而函数头注释仍写作 u8 len,属注释过期)。另需注意 e_linker_send 的形参名在头文件为 buf、在实现为 buf(一致),无隐患。