使用bacnet-stack-1.0.0示例程序实现MS/TP通信失败问题咨询
问题:BACnet MS/TP模式下客户端无法读取服务端属性,服务端无响应
环境配置与运行日志
1. BACnet MS/TP Server 配置与运行
通过修改环境变量设置波特率38400、MAC地址0x78,使用apps目录下的server示例模拟BACnet MS/TP Server,运行日志如下:
/var/user/app/device_supervisor # ./bacserv 20000 BACnet Server Demo BACnet Stack Version 1.0.0 BACnet Device ID: 20000 Max APDU: 480 pyh defined MSTP MS/TP Interface: /dev/ttyO3 RS485: Initializing /dev/ttyO3 at Baud Rate 38400=success! MS/TP MAC: 78 MS/TP Max_Master: 7F MS/TP Max_Info_Frames: 1
2. BACnet MS/TP Client 配置与运行
通过修改环境变量设置波特率38400、MAC地址0x79,使用apps目录下的readprop示例模拟BACnet MS/TP Client,运行日志如下:
root@pyhao-VirtualBox:~/pyhao/tmp/bacnet-stack-1.0.0-yuan/apps/readprop# ./bacrp_mstp_x86 20000 0 0 85 --mac 78 pyh defined MSTP MS/TP Interface: /dev/ttyS1 RS485: Initializing /dev/ttyS1 at Baud Rate 38400=success! MS/TP MAC: 79 MS/TP Max_Master: 7F MS/TP Max_Info_Frames: 10 pyh send read req pyh Send_Read_Property_Request_Address pyh dlmstp_send_pdu pyh Ringbuf_Data_Put pyh bytes_sent = 13 pyh pdu len = 0 pyh pdu len = 0 pyh pdu len = 0 pyh pdu len = 0 pyh pdu len = 0 pyh pdu len = 0 pyh pdu len = 0
客户端核心代码片段(bacnet-stack-1.0.0-yuan/apps/readprop/main.c):
/* returns 0 bytes on timeout */ pdu_len = datalink_receive(&src, &Rx_Buf[0], MAX_MPDU, timeout); printf("pyh pdu len = %d\n", pdu_len);
问题现象
客户端运行后无法读取服务端属性值,服务端无任何打印输出;已通过rs485.c测试确认RS485链路收发数据正常,且相同配置逻辑下BACnet/IP通信正常,但MS/TP模式无法正常工作。
排查方向
- 同步MS/TP核心参数
服务端Max_Info_Frames设为1,客户端设为10,虽然该参数允许两端不同,但建议临时调整为一致值测试,排除参数不兼容导致的帧交互问题。 - 验证串口底层配置
确认两端串口的数据位、停止位、奇偶校验是否严格匹配(BACnet MS/TP标准为8N1:8数据位、无校验、1停止位),部分设备默认配置可能存在差异,需手动显式指定。 - 抓包分析帧交互
使用RS485串口抓包工具(如USB转RS485适配器配合Wireshark的BACnet插件),捕获客户端发送的请求帧,检查是否符合BACnet MS/TP帧格式;同时确认服务端是否接收到该帧。 - 调试服务端接收流程
在服务端代码中添加日志,跟踪datalink_receive函数的执行状态,确认是否有数据进入接收缓冲区,排查是否存在帧解析错误或过滤逻辑阻断了请求。 - 调整客户端超时参数
检查客户端timeout值是否过短,尝试延长超时时间,确认是否是响应延迟导致datalink_receive返回0。 - 排查MAC地址绑定
确认服务端MAC地址0x78是否正确绑定到/dev/ttyO3接口,是否存在MAC地址冲突或接口绑定错误的情况。
内容的提问来源于stack exchange,提问作者PYHAO
相关产品推荐
相关产品推荐

