3. Zigbee数据透明传输实现
任务目标
本案例使用两个 Zigbee 模块(如 EBYTE E18-MS1PA2-PCB 或兼容的 TI CC2530/CC2538 方案),通过串口连接 PC 或开发板,实现一端串口收到的数据经 Zigbee 无线链路发送,另一端收到后从串口原样输出,完成点对点透明传输。
环境与依赖
- 硬件:2× Zigbee 模块(AT 固件,支持透明传输模式)、USB-TTL 转换器 2 个、PC 1 台
- 软件:串口调试助手(或 minicom/PuTTY),模块默认波特率 115200,8N1
- 模块配置:两个模块均需设置为相同的 PAN ID 和信道,一个为协调器,一个为路由器/终端
模块配置(AT 指令)
以下指令通过串口发送,每条指令以回车换行结尾(\r\n)。模块 A 配置为协调器,模块 B 配置为终端,两者 PAN ID 设为 0x1234,信道设为 15。
// 模块 A(协调器)
AT+ROLE=1 // 设为协调器
AT+PANID=1234 // 设置 PAN ID
AT+CH=15 // 设置信道
AT+TRAN=1 // 开启透明传输模式
AT+Z // 保存并重启
// 模块 B(终端)
AT+ROLE=3 // 设为终端设备
AT+PANID=1234
AT+CH=15
AT+TRAN=1
AT+Z
透明传输验证代码
以下 Python 脚本用于自动化测试:向模块 A 的串口发送数据,然后从模块 B 的串口读取,验证数据是否一致。需安装 pyserial:pip install pyserial。
import serial
import time
import random
import string
PORT_A = 'COM3' # 模块 A 所在串口
PORT_B = 'COM4' # 模块 B 所在串口
BAUD = 115200
def test_transparent():
ser_a = serial.Serial(PORT_A, BAUD, timeout=2)
ser_b = serial.Serial(PORT_B, BAUD, timeout=2)
time.sleep(0.5) # 等待模块就绪
# 生成随机测试数据(含 ASCII 可打印字符)
test_data = ''.join(random.choices(string.ascii_letters + string.digits, k=64))
print(f"发送数据: {test_data}")
# 从 A 发送
ser_a.write(test_data.encode())
time.sleep(0.5) # 等待无线传输完成
# 从 B 接收
received = ser_b.read(len(test_data))
received_str = received.decode(errors='replace')
print(f"接收数据: {received_str}")
ser_a.close()
ser_b.close()
if received_str == test_data:
print("测试通过:数据完全一致")
return True
else:
print("测试失败:数据不一致")
return False
if __name__ == '__main__':
test_transparent()
运行与验证
- 按上述 AT 指令分别配置两个模块,确认返回
OK。 - 将模块 A 连接 PC 串口 COM3,模块 B 连接 COM4(按实际端口修改脚本)。
- 运行脚本:
python test_transparent.py - 观察输出:若打印“测试通过:数据完全一致”,说明透明传输链路正常。
手动测试方法
若不用脚本,可打开两个串口调试助手:在连接模块 A 的串口发送任意字符串(如 Hello Zigbee),应在连接模块 B 的串口收到完全相同的字符串。反向发送同样验证。
常见问题
- 收不到数据:检查两模块 PAN ID、信道是否一致;确认模块 B 已成功入网(观察模块 LED 状态或发送
AT+NETWORK?查询)。 - 数据乱码:确认两端串口波特率一致(默认 115200),且模块未处于 AT 指令模式(透明传输模式下直接透传数据)。
- 传输延迟:Zigbee 每次发送前有信道检测机制,短数据建议间隔 100ms 以上再发下一条。