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

e_linker_wifi.h

源文件路径:midware/ethernt/wireless/wifi/e_linker_wifi.h 所属模块:midware/ethernt/wireless/wifi(易联/自研 WIFI 通讯棒驱动) 代码行数:52

1. 文件职责

本文件是易联(E-LINKER)WIFI 通讯棒与 4G 通讯棒 AT 指令驱动的对外头文件,声明了 e_linker_wifi.c 中全部对外可见的接口函数和两个全局状态联合体。

它处在 EMS 无线通道数据流的最底层:上层 wireless_driver.c 通过本文件声明的函数获取通讯棒身份(SN/HW/SW)、协商 AP SSID 与服务器域名/端口、读取连接状态与信号强度,最终决定 EMS 能否通过 WIFI 棒连上云端。

两个全局变量 g_wifi_state 与 g_4g_state 是本模块与 wireless_driver.c 之间的状态快照通道:本文件只定义类型,实体定义在 e_linker_wifi.c:24-25。

本文件本身不含任何实现,只提供类型定义、宏开关与函数原型;同时它被 e_linker_wifi.c 与 wireless_driver.c 共同包含,是两者之间的契约。

2. 关键数据结构与宏

名称类型说明
_E_LINKER_H_宏头文件防重复包含保护(第 1-2 行)。注意宏名与文件名 e_linker_wifi.h 不一致,历史上由 e_linker.h 改名而来
E_LINKER_COMM_DEBUG宏易联 AT 调试打印总开关,默认 (0) 关闭(第 7 行)。e_linker_wifi.c 中所有 printf 都由它包住
WIFI_STATE联合体WIFI 棒连接状态位域:底层 u8 l_u8_wifi_state;位域 l_u8_APP_login(bit0) 是否已登录云端 App、l_u8_route(bit1) 是否已连上 AP/路由(第 9-17 行)
elinker_4g_state联合体4G 棒连接状态位域:底层 u8 u8_4g_state;位域 u8_sim_pin_state(bit0) SIM 卡在位、u8_net_login_state(bit1) 基站注册、u8_gprs_state(bit2) GPRS 附着、u8_tcp_state(bit3) TCP 已连服务器、u8_sta_state(bit4)、u8_ap_state(bit5)、bit6、but7 保留(第 19-33 行)。注意 but7 是 bit7 的拼写错误
g_wifi_state全局变量WIFI_STATE 实例声明,定义在 e_linker_wifi.c:24(第 36 行)
g_4g_state全局变量elinker_4g_state 实例声明,定义在 e_linker_wifi.c:25(第 37 行)

3. 函数清单

本文件为头文件,只含函数声明,无函数体(共 11 个声明)。

函数名作用域说明(一句话)
void e_linker_wifi_status_detect(void)全局(声明)探测 WIFI 棒连接状态并刷新 g_t_wireless_info 的链路/TCP 标志(定义在 e_linker_wifi.c:88)
void e_linker_4g_status_detect(void)全局(声明)探测 4G 棒连接状态并刷新 g_t_wireless_info 与 App 连接标志(定义在 e_linker_wifi.c:54)
s8 e_linker_sta_eirp(void)全局(声明)读取无线信号强度(AT+STA_EIRP?),失败返回 0(定义在 e_linker_wifi.c:123)
u8 e_linker_wifi_init(void)全局(声明)无线棒参数对齐总入口:探测协议、对齐 SSID/端口/域名/密钥,必要时写回并重启(定义在 e_linker_wifi.c:180)
void get_e_linker_4g_csq(u8 *rssi, u8 *ber)全局(声明)通过 AT+CSQ? 读取 4G 信号质量 RSSI/BER(定义在 e_linker_wifi.c:147)
u8 e_linker_4g_login(void)全局(声明)4G 棒登录接口——本工程中只有声明,无任何定义(见第 7 节)
u8 e_linker_wifi_login(u8 *cmd)全局(声明)以指定 AT 命令登录通讯棒,最多重试 2 次(定义在 e_linker_wifi.c:477)
u8 get_e_linker_wifi_info(u8 *wifi_SN, u8 *wifi_SW, u8 *wifi_HW)全局(声明)一次读取通讯棒的 SN、软件版本、硬件版本,三者各重试 3 次(定义在 e_linker_wifi.c:509)
u8 e_linker_P1_data(u8 *pdata)全局(声明)通过 AT+P1E_DATA? 读取 P1 采集器数据帧(定义在 e_linker_wifi.c:694)
u8 get_e_linker_sn(u8 *pdata)全局(声明)读取通讯棒 SN,长度超过 MAX_E_LINKER_SN_LEN 判失败(定义在 e_linker_wifi.c:892)
u8 e_linker_protocol_support_state(void)全局(声明)读取通讯棒支持的通信协议位图,写入 g_t_wireless_info.protocol_support_state(定义在 e_linker_wifi.c:1005)

4. 核心逻辑解析

本文件不含可执行逻辑,但其类型设计直接决定模块行为,要点如下。

4.1 两个状态联合体为何用位域 + 联合体

WIFI_STATE 与 elinker_4g_state 都采用"1 字节联合体 + 位域"的写法,目的是让 e_linker_wifi_status_detect() 里可以整体读/写一个字节,也可以按位取单一状态。e_linker_wifi_state() 在 e_linker_wifi.c:645 用 g_wifi_state.l_u8_wifi_state = ((*(addr+4)-0x30) | res << 1); 一次性把模块上报的两位状态拼成一个字节写入,正是依赖这一布局。

位序约定必须与 e_linker_wifi.c:644-645 的拼接顺序严格一致:bit0 取 l_u8_APP_login,bit1 取 l_u8_route。任何一方调整位序都会静默错位,编译器不会报错。

elinker_4g_state 的 bit0~bit5 与模块 AT+4G_COM? 返回的 6 个十进制字段顺序一一对应,该对应关系在 e_linker_wifi.c:606-611 写死。

4.2 与 wireless_driver.h 的分工

本文件只声明"易联 AT 指令级"接口;通讯棒类型识别(WIRELESS_TYPE_E)、运行总表(WIRELESS_TAB_T)、身份信息(E_LINKER_ID_INFO)等统一定义在上一层 midware/ethernt/wireless/wireless_driver.h。因此本文件只 #include "chip.h",不包含 wireless_driver.h,避免循环包含;实现文件 e_linker_wifi.c 才同时包含两者。

4.3 调试开关的两套体系

头文件里只定义了 E_LINKER_COMM_DEBUG(第 7 行)。但实现文件 e_linker_wifi.c:153 与 e_linker_wifi.c:593 又使用了 E_LINKER_4G_COMM_DEBUG,该宏在整个工程里都没有定义(仅出现在条件编译判断中,见 elink_parse.c:230)。按 C 预处理规则,未定义标识符在 #if 中求值为 0,因此这两处 4G 调试打印实际永久关闭。这属于历史遗留:4G 调试开关原本应在本文件或 elink_parse.h 中定义,现已丢失。

5. 对外接口

本文件导出

导出项类型使用者
E_LINKER_COMM_DEBUG宏e_linker_wifi.c
WIFI_STATE联合体类型wireless_driver.c
elinker_4g_state联合体类型wireless_driver.c
g_wifi_state全局变量声明wireless_driver.c(读 state.l_u8_route、state.l_u8_APP_login)
g_4g_state全局变量声明wireless_driver.c(读 u8_sta_state/u8_sim_pin_state/u8_tcp_state/u8_ap_state)
e_linker_wifi_status_detect / e_linker_4g_status_detect函数声明wireless_driver.c:211,217,252,256
e_linker_sta_eirp函数声明wireless_driver.c:266
e_linker_wifi_init函数声明wireless_driver.c:323,341,354
get_e_linker_4g_csq函数声明wireless_driver.c:275
e_linker_wifi_login函数声明wireless_driver.c:318,336,349
get_e_linker_wifi_info函数声明wireless_driver.c:209,216
e_linker_P1_data函数声明wireless_driver.c:500
get_e_linker_sn / e_linker_protocol_support_state函数声明midware/debug/shell_usmart.c:21-22(USMART 调试命令表)

本文件依赖

依赖项来源
u8 / s8 等类型别名、TRUE/FALSE 与芯片头chip.h(第 5 行)
MAX_E_LINKER_SN_LEN、MAX_E_LINKER_P1_LEN、WIRELESS_TYPE_E、PROTOCOL_TYPE_E、g_t_wireless_info由使用方(e_linker_wifi.c)另行 include wireless_driver.h 提供,本文件不引入

6. 依赖关系

依赖: 仅 chip.h(第 5 行);无其它工程内头文件。

被依赖:

7. 备注与风险点

  1. e_linker_4g_login() 只有声明没有定义(第 45 行)。全工程搜索无该函数的实现,属于历史遗留接口;当前 4G 登录由 e_linker_wifi_login() 承担(wireless_driver.c:318 就是用它登录 4G 棒)。保留该声明会让阅读者误以为存在独立 4G 登录流程。
  1. E_LINKER_4G_COMM_DEBUG 宏从未定义。e_linker_wifi.c 的两处 4G 调试打印永久失效(未定义宏在 #if 中按 0 处理),不会编译报错但也没有输出。
  1. elinker_4g_state 位域成员名拼写错误:第 31 行 u8 but7: 1; 应为 bit7,与同族 bit6 命名不一致。目前无引用所以无功能影响,但一旦有人按 bit7 引用会编译失败。
  1. 头文件保护宏与文件名不匹配(_E_LINKER_H_ vs e_linker_wifi.h)。若工程内同时存在旧版 e_linker.h,会出现宏冲突导致其中一个头文件被静默跳过。
  1. WIFI_STATE 位域到字节的映射隐含依赖:e_linker_wifi.c:645 的位拼接与本节位域声明是跨文件隐式契约,改动任一侧都不会触发编译告警,属于静默错位风险。
  1. 位域成员未使用显式无符号位宽之外的填充控制,实际布局依赖 Keil ARMCC 的位域分配顺序(小端、低位在前);工程内统一按该约定使用。

暂无其它问题。