e_linker_wifi.h
wireless_driver.h 的分工4.3 调试开关的两套体系5. 对外接口本文件导出本文件依赖6. 依赖关系7. 备注与风险点源文件路径:
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 行);无其它工程内头文件。
被依赖:
midware/ethernt/wireless/wifi/e_linker_wifi.c:12——实现方,包含本文件。midware/ethernt/wireless/wireless_driver.c——通过wireless_driver.h间接使用本文件声明的状态联合体与get_e_linker_wifi_info/e_linker_P1_data等接口。midware/debug/shell_usmart.c——把get_e_linker_sn、e_linker_protocol_support_state挂到 USMART 调试 shell。
7. 备注与风险点
e_linker_4g_login()只有声明没有定义(第 45 行)。全工程搜索无该函数的实现,属于历史遗留接口;当前 4G 登录由e_linker_wifi_login()承担(wireless_driver.c:318就是用它登录 4G 棒)。保留该声明会让阅读者误以为存在独立 4G 登录流程。
E_LINKER_4G_COMM_DEBUG宏从未定义。e_linker_wifi.c的两处 4G 调试打印永久失效(未定义宏在#if中按 0 处理),不会编译报错但也没有输出。
elinker_4g_state位域成员名拼写错误:第 31 行u8 but7: 1;应为bit7,与同族bit6命名不一致。目前无引用所以无功能影响,但一旦有人按bit7引用会编译失败。
- 头文件保护宏与文件名不匹配(
_E_LINKER_H_vse_linker_wifi.h)。若工程内同时存在旧版e_linker.h,会出现宏冲突导致其中一个头文件被静默跳过。
WIFI_STATE位域到字节的映射隐含依赖:e_linker_wifi.c:645的位拼接与本节位域声明是跨文件隐式契约,改动任一侧都不会触发编译告警,属于静默错位风险。
- 位域成员未使用显式无符号位宽之外的填充控制,实际布局依赖 Keil ARMCC 的位域分配顺序(小端、低位在前);工程内统一按该约定使用。
暂无其它问题。