TKB-623 开发板基于 TurMass™芯片,支持多种无线通信模式(如异步收发、异步带确认等)。下面验证其无线通信功能。
准备工作
- 两块 TKB-623 开发板(分别称为 “板 A” 和 “板 B”),各配天线、USB转Type-C转接线;
- 两台电脑(或一台电脑两个串口),分别连接板 A 和板 B,打开串口助手;
- 串口助手配置:波特率 115200,校验位 None,停止位 1,勾选 “发送新行(CR+LF)”(必须,指令结尾需要)。
通信测试
异步收发模式
核心配置:板 A 和板 B 参数必须完全一致
按以下步骤在两块板的串口助手中依次发送指令,每步确认返回 “AT_OK”:
- 恢复默认参数(避免之前的配置干扰)
AT+RSTPARA // 板A和板B都发,返回“AT_OK”
- 设置工作模式为 “”(双向通信)
AT+WORKMODE=21 // 板A和板B都发,返回“AT_OK”
// 说明:模式21支持收发双向通信,是最适合测试的模式
- 设置相同的无线频率(必须一致,否则收不到数据)
AT+FREQ=473200000 // 板A和板B都发(频率473.2MHz,文档示例常用),返回“AT_OK”
- 设置相同的无线速率(必须一致,速率影响通信距离和抗干扰)
AT+RATE=6 // 板A和板B都发(速率模式6,常用),返回“AT_OK”
- (可选)设置发射功率(默认可能较低,调高可增加通信距离)
AT+TXP=15 // 板A和板B都发(15dBm,功率较高),返回“AT_OK”
如图。


之后A板向B板,B板向A板发送数据,分别查看两串口助手。

图中展示A、B两板可以异步相互通信。
简单单向通信:板 A 发,板 B 只收
板 A(发送端)设置为 “异步只发模式”:
AT+WORKMODE=20 // 模式20:只能发,不能收
AT+FREQ=473200000
AT+RATE=6
AT+SENDB=112233 // 发送数据,板B能收到
板 B(接收端)保持 “异步收发模式”(21),配置相同频率和速率,即可持续接收,无法回复
先是A向B发送,B显示收到了。

再是B向A发送,A无响应,结果显示确实是单向通信。

带确认的通信(确保数据被收到)
板 A 和板 B 都设置为 “异步带确认模式”:
A:
AT+WORKMODE=25 // 模式25:发送后等待对方确认
AT+FREQ=473200000
AT+RATE=6
AT+ADDR=00:00:00:01 // 板A地址设为00000001
AT+DEST=00:00:00:02 // 板A的目的地址是板B的地址
B:
AT+WORKMODE=25 // 板B同样设置
AT+FREQ=473200000
AT+RATE=6
AT+ADDR=00:00:00:02 // 板B地址设为00000002
AT+DEST=00:00:00:01 // 板B的目的地址是板A的地址

结果:板 A 发送:AT+SENDB=556677,板 B 收到后会自动回复 ACK,板 A 会显示 “SEND_FINISH”(发送成功)

Python脚本测试
分别写两个脚本A.py,B.py
A.py
import serial
import time
SERIAL_PORT = "COM7"
BAUD_RATE = 115200
LOCAL_ADDR = "00:00:00:02"
DEST_ADDR = "00:00:00:01"
FREQ = 473200000
RATE = 6
SEND_INTERVAL = 5
def init_serial(port, baud):
"""初始化串口"""
try:
ser = serial.Serial(port, baud, timeout=1)
return ser if ser.is_open else None
except Exception as e:
print(f"串口初始化失败:{e}")
return None
def send_at_cmd(ser, cmd, timeout=1):
"""发送AT指令并返回响应"""
ser.write((cmd + "\r\n").encode())
time.sleep(timeout)
response = ser.read_all().decode().strip()
print(f"发送指令:{cmd}")
print(f"响应:{response}\n")
return response
def auto_config(ser):
"""自动配置板A为异步带确认模式"""
print("开始自动配置板A...")
if "AT_OK" not in send_at_cmd(ser, "AT+RSTPARA"):
print("恢复默认参数失败,退出")
return False
if "AT_OK" not in send_at_cmd(ser, "AT+WORKMODE=25"):
print("设置工作模式失败,退出")
return False
if "AT_OK" not in send_at_cmd(ser, f"AT+FREQ={FREQ}"):
print("设置频率失败,退出")
return False
if "AT_OK" not in send_at_cmd(ser, f"AT+RATE={RATE}"):
print("设置速率失败,退出")
return False
if "AT_OK" not in send_at_cmd(ser, f"AT+ADDR={LOCAL_ADDR}"):
print("设置本地地址失败,退出")
return False
if "AT_OK" not in send_at_cmd(ser, f"AT+DEST={DEST_ADDR}"):
print("设置目的地址失败,退出")
return False
print("板A配置完成!\n")
return True
def send_data(ser, data_hex):
"""发送数据并等待ACK"""
cmd = f"AT+SENDB={data_hex}"
response = send_at_cmd(ser, cmd, timeout=5)
if "SEND_FINISH" in response:
print(f"数据 {data_hex} 发送成功(已收到ACK)")
return True
elif "SEND_TIMEOUT" in response:
print(f"数据 {data_hex} 发送失败(未收到ACK)")
return False
return False
def main():
ser = init_serial(SERIAL_PORT, BAUD_RATE)
if not ser:
return
if not auto_config(ser):
ser.close()
return
try:
count = 1
while True:
data = f"{count:04X}"
print(f"\n第{count}次发送数据:")
send_data(ser, data)
count += 1
time.sleep(SEND_INTERVAL)
except KeyboardInterrupt:
print("\n程序退出")
ser.close()
if __name__ == "__main__":
main()
B.py
import serial
import time
SERIAL_PORT = "COM8"
BAUD_RATE = 115200
LOCAL_ADDR = "00:00:00:01"
DEST_ADDR = "00:00:00:02"
FREQ = 473200000
RATE = 6
def init_serial(port, baud):
"""初始化串口"""
try:
ser = serial.Serial(port, baud, timeout=0.1)
return ser if ser.is_open else None
except Exception as e:
print(f"串口初始化失败:{e}")
return None
def send_at_cmd(ser, cmd, timeout=1):
"""发送AT指令并返回响应"""
ser.write((cmd + "\r\n").encode())
time.sleep(timeout)
response = ser.read_all().decode().strip()
print(f"发送指令:{cmd}")
print(f"响应:{response}\n")
return response
def auto_config(ser):
"""自动配置板B为异步带确认模式(与板A匹配)"""
print("开始自动配置板B...")
if "AT_OK" not in send_at_cmd(ser, "AT+RSTPARA"):
print("恢复默认参数失败,退出")
return False
if "AT_OK" not in send_at_cmd(ser, "AT+WORKMODE=25"):
print("设置工作模式失败,退出")
return False
if "AT_OK" not in send_at_cmd(ser, f"AT+FREQ={FREQ}"):
print("设置频率失败,退出")
return False
if "AT_OK" not in send_at_cmd(ser, f"AT+RATE={RATE}"):
print("设置速率失败,退出")
return False
if "AT_OK" not in send_at_cmd(ser, f"AT+ADDR={LOCAL_ADDR}"):
print("设置本地地址失败,退出")
return False
if "AT_OK" not in send_at_cmd(ser, f"AT+DEST={DEST_ADDR}"):
print("设置目的地址失败,退出")
return False
print("板B配置完成!\n")
return True
def parse_data(response):
"""解析接收的数据"""
if "+DI:" in response:
parts = response.split(", ")
data = parts[4].split("Data ")[1] if len(parts)>=5 else "未知"
snr = parts[2].split("SNR ")[1] if len(parts)>=3 else "未知"
rssi = parts[3].split("RSSI ")[1] if len(parts)>=4 else "未知"
print(f"收到数据:{data} | 信号质量:SNR {snr}dB, RSSI {rssi}dBm")
def main():
ser = init_serial(SERIAL_PORT, BAUD_RATE)
if not ser:
return
if not auto_config(ser):
ser.close()
return
print("开始监听数据...(按Ctrl+C退出)")
try:
while True:
if ser.in_waiting > 0:
response = ser.read_all().decode().strip()
parse_data(response)
time.sleep(0.1)
except KeyboardInterrupt:
print("\n程序退出")
ser.close()
if __name__ == "__main__":
main()
运行结果如图。

分析,用python的pyserial库分别向两个串口发送指令和数据,并接收数据。
问题与分析
在我填写AT+ADDR=00:00:00:02 和 AT+DEST=00:00:00:01时,一开始是写:
AT+ADDR=00000001
AT+DEST=00000002
结果给我报错:AT_PARAM_ERROR
查阅官方文档对地址格式的要求才知道:是要写00:00:00:02这种形式。这一点很容易忽略。