1. 项目背景与核心需求
排队叫号系统在银行、医院、政务大厅等场景中随处可见,传统的有线方案存在布线复杂、维护困难等问题。这个项目通过STM32作为主控芯片,搭配ESP8266 WiFi模块,构建了一套无线主从机通信的排队叫号解决方案。
我在实际部署中发现,这类系统最关键的三个技术痛点是:
- 通信稳定性:在人员密集场所需要保证长时间稳定连接
- 低延迟响应:叫号指令需要实时传达至终端设备
- 设备扩展性:要支持随时增加从机设备数量
这套方案采用主从架构,主机负责叫号逻辑处理和指令分发,从机接收指令驱动显示和语音模块。ESP8266的STA+AP混合模式既保证了组网灵活性,又降低了部署成本。
2. 硬件架构设计解析
2.1 主控芯片选型考量
STM32F103C8T6作为主机核心,主要基于以下考量:
- 72MHz主频足够处理排队逻辑运算
- 内置硬件SPI接口可高速连接ESP8266
- 多达5个USART接口便于扩展外设
- 成本控制在20元以内,适合批量部署
从机采用STM32F030F4P6,主要看中:
- 48MHz主频满足基础显示控制需求
- QFN20封装节省PCB空间
- 低至2.4V的工作电压降低功耗
2.2 网络通信模块设计
ESP8266-12F模块的选型关键点:
- 支持802.11 b/g/n协议
- 内置TCP/IP协议栈减轻MCU负担
- 板载PCB天线增益达到2dBi
- 深度睡眠电流仅20μA
实际测试发现,模块固件版本对稳定性影响很大。推荐使用AT固件v2.2.0,这个版本在连续工作72小时后丢包率仍低于0.3%。
3. 通信协议实现细节
3.1 自定义应用层协议设计
为提高通信效率,我们设计了精简的二进制协议:
code复制[HEADER(2B)][CMD(1B)][LEN(1B)][DATA(NB)][CRC(2B)]
- HEADER固定为0xAA55
- CMD字段定义6种指令类型
- 数据长度限制在128字节内
- CRC16采用CCITT多项式
实测对比显示,相比JSON格式,该协议可减少约65%的数据量,在20个从机的场景下,广播延迟控制在300ms以内。
3.2 网络拓扑管理策略
采用分级连接机制:
- 主机作为AP创建热点(SSID:QueueMaster_XXXX)
- 从机以STA模式连接主机
- 每个从机分配唯一设备ID(1-255)
- 心跳包间隔设置为15秒
关键配置参数:
c复制#define MAX_RETRY 3
#define TIMEOUT_MS 1500
#define HEARTBEAT_INTERVAL 15000
4. 软件实现关键代码
4.1 主机端状态机实现
c复制typedef enum {
STATE_IDLE,
STATE_WAIT_ACK,
STATE_PROCESSING,
STATE_ERROR
} HostState;
void host_state_machine() {
static HostState state = STATE_IDLE;
switch(state) {
case STATE_IDLE:
if(new_cmd) {
send_command();
state = STATE_WAIT_ACK;
timeout = HAL_GetTick();
}
break;
case STATE_WAIT_ACK:
if(received_ack) {
state = STATE_IDLE;
} else if(HAL_GetTick()-timeout > TIMEOUT_MS) {
if(++retry_cnt >= MAX_RETRY) {
state = STATE_ERROR;
} else {
resend_command();
}
}
break;
//...其他状态处理
}
}
4.2 从机端数据接收处理
c复制void ESP8266_DataHandler(uint8_t *data, uint16_t len) {
if(len < 6) return; //最小包长检查
//CRC校验
uint16_t crc = CRC16_Calculate(data, len-2);
if(crc != *(uint16_t*)(data+len-2)) {
send_nak();
return;
}
//指令解析
switch(data[2]) {
case CMD_HEARTBEAT:
send_ack();
break;
case CMD_UPDATE_NUM:
display_update(data[4]);
play_voice(data[5]);
send_ack();
break;
//...其他指令处理
}
}
5. 实际部署优化经验
5.1 抗干扰配置技巧
在政务大厅实际部署时,发现以下配置可显著提升稳定性:
- 将WiFi信道固定为6或11,避开常见的1信道
- 设置RTS阈值=2347,降低密集环境冲突
- 启用WMM QoS保证语音优先级
- 调整ESP8266发射功率为17dBm(AT+RFPPOWER=17)
5.2 电源管理方案
从机设备采用18650电池供电时:
- 添加TPS61090升压芯片保证3.3V稳定输出
- 修改ESP8266睡眠模式:
arduino复制// 深度睡眠配置
wifi_set_sleep_type(LIGHT_SLEEP_T);
wifi_fpm_open();
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
wifi_fpm_do_sleep(1000*1000); //1秒间隔
实测可使待机时间从8小时延长至72小时。
6. 典型问题排查指南
6.1 连接不稳定问题
现象:从机频繁掉线
排查步骤:
- 用AT+CWLAP扫描周边WiFi干扰
- 检查主机日志确认DHCP租期(建议设为24小时)
- 测试不同位置信号强度(RSSI>-70dBm为佳)
- 更新ESP8266 SDK至3.0.0以上版本
6.2 显示不同步问题
现象:从机显示号码滞后
解决方案:
- 增加主机端发送重试机制
- 优化从机接收缓冲区管理
- 添加序列号检查避免丢包
- 设置硬件流控(RTS/CTS)
7. 系统扩展与优化方向
当前系统支持最多32个从机设备,如需扩展:
- 采用分组广播机制,按区域划分从机组
- 实现OTA升级功能(可使用HTTP服务器)
- 添加BLE Mesh作为备用通信通道
- 引入LoRa模块用于远距离从机
性能优化空间:
- 采用ESP32替代ESP8266可提升吞吐量
- 使用STM32H7系列主机提高处理能力
- 实现差分传输减少数据量