基于STM32F10x的BACnet例程添加MSTP_Slave_Node_FSM及I_AM问题咨询
解决BACnet STM32F10x例程MSTP从机逻辑缺失及WhoIs无I_AM回复问题
一、补全MSTP从机状态机(MSTP_Slave_Node_FSM)
现有/port/stm32f10x/dlmstp.c仅实现主机逻辑,需手动添加从机状态机:
- 定义从机状态枚举,放在dlmstp.c的合适位置:
typedef enum { SLAVE_STATE_IDLE, SLAVE_STATE_WAIT_HEADER, SLAVE_STATE_RECV_DATA, SLAVE_STATE_SEND_RESP, SLAVE_STATE_ERR_RESET } MSTP_SLAVE_STATE;
- 实现
MSTP_Slave_Node_FSM核心函数:- 空闲状态:监听总线起始符,检测到后切换至等待帧头状态
- 等待帧头:解析BACnet MAC帧头,判断目标MAC是否匹配本机(或广播地址)
- 接收数据:按帧长度完整接收数据,校验帧格式合法性
- 发送响应:针对WhoIs等指令生成对应响应帧(如I_AM),通过串口发送至总线
- 错误重置:帧校验失败或超时后,重置状态至空闲
- 在主循环或串口中断回调中调用该FSM函数,保证从机实时处理总线数据
二、修复WhoIs无I_AM回复问题
从机不响应WhoIs通常由设备配置或帧处理逻辑缺失导致:
- 确认从机BACnet设备对象初始化正确,必须设置设备实例ID、厂商信息等:
// 示例初始化代码 Device_Set_Object_Instance_Number(OBJECT_DEVICE, 123); // 替换为你的从机设备ID Device_Set_Vendor_Name("Custom Vendor"); Device_Set_Model_Name("STM32F10x MSTP Slave");
- 在从机帧处理逻辑中添加WhoIs指令分支:解析接收到的WhoIs帧,检查帧中设备ID范围是否包含本机ID,匹配则生成I_AM响应帧
- 确保从机与主机的MSTP波特率、总线终端电阻配置一致,物理连接无故障
- 检查串口接收配置:确认串口缓冲区大小足够、中断触发方式正确,避免帧丢包或截断
三、整合Automac功能
要启用Automac,需在从机逻辑中添加自动MAC地址分配处理:
- 从机初始化时,若未配置固定MAC,触发Automac流程:发送MAC地址请求帧至总线
- 在
MSTP_Slave_Node_FSM中新增Automac相关状态分支,处理主机返回的地址分配响应,更新本机MAC地址并完成初始化
内容的提问来源于stack exchange,提问作者Twillpower
相关产品推荐
相关产品推荐

