接线图

串口接收数据
这里使用的是 mm32link-service 的在线串口。波特率 115200,8 位数据位,1 位停止位,校验位和流控为 None,接收设置选 ASCII,发送设置选 ASCII。打开串口后可以实时接收到雷达发送的数据:


另外,雷达还支持通过串口命令修改设置,详细命令可以查阅萤火工场 CEM5831G-M12 24GHz毫米波雷达模块规格书了解详情


使用 Python 绘图
编写了一段简单的代码,可以绘制出雷达检测到的速度折线图(按照文档:绿色曲线为人体靠近,红色曲线为人体远离)

import serial
import time
import matplotlib.pyplot as plt
# 配置串口参数
port = 'COM3' # 串口号,根据实际情况修改
baudrate = 115200 # 波特率,根据实际情况修改
timeout = 1 # 超时时间,单位为秒
# 创建串口对象
ser = serial.Serial(port, baudrate, timeout=timeout)
# 检查串口是否打开
if ser.isOpen():
print(f"串口 {port} 已打开,波特率:{baudrate}")
# 初始化速度列表和时间戳列表
speeds = []
timestamps = []
def hex_to_ascii(hex_data):
ascii_data = ""
for i in range(0, len(hex_data), 2):
ascii_data += chr(int(hex_data[i:i + 2], 16))
return ascii_data
# 计数器,用于跟踪接收到的数据点数量
counter = 0
def plot_with_colors(timestamps, speeds):
plt.figure(figsize=(10, 5))
for i in range(1, len(speeds)):
v = speeds[i]
if v > 1:
color = 'green'
elif -1 < v < 1:
color = 'orange'
else:
color = 'red'
plt.plot([timestamps[i - 1], timestamps[i]], [speeds[i - 1], v], color=color)
plt.title('Speed Over Time')
plt.xlabel('Time')
plt.ylabel('Speed (km/h)')
plt.grid(True)
plt.show()
try:
while True:
if ser.inWaiting() > 0:
# 读取数据
data = ser.readline() # 读取二进制数据
hex_data = data.hex() # 将二进制数据转换为十六进制字符串
ascii_data = hex_to_ascii(hex_data) # 将十六进制字符串转换为ASCII字符
# 解析数据
if "v=" in ascii_data and "km/h" in ascii_data and "str=" in ascii_data:
try:
# 提取速度和字符串值
v = float(ascii_data.split("v=")[1].split(" ")[0])
str_value = int(ascii_data.split("str=")[1].split(",")[0])
print(f"速度:{v} km/h, 字符串值:{str_value}")
speeds.append(v)
timestamps.append(time.time())
counter += 1 # 增加计数器
if counter == 100: # 每100次数据绘制一次图表
plot_with_colors(timestamps, speeds)
# 清空列表和计数器
speeds = []
timestamps = []
counter = 0
except ValueError as e:
print(f"解析错误:{e}")
time.sleep(0.1)
finally:
# 关闭串口
ser.close()
print(f"串口 {port} 已关闭")

