STP-23单点激光测距模块传感器高精度TOF测距原理毫米级串口输出


接线

不要被自带的线颜色给迷惑了

数据解析


python代码
import serial
import time
# 设置串口参数
port = 'COM55' # 串口号,根据你的实际情况修改
baudrate = 230400 # 波特率
def parse_data(data):
# 检查起始符
if data[0] != 0xAA:
print("Invalid data packet: Start byte not found.")
return
# 从第11个字节开始解析测量数据
measurements = []
for i in range(10, 195, 15):
if i + 15 < len(data): # 确保不会越界
#---------------距离数据distance------------------
distance1 = data[i + 1]
distance1=hex(distance1) #将十进制整数转换为十六进制字符串表示
interval1 = distance1[2:].upper() #(去掉十六进制前面的0x)
str1 = str(interval1) #将 interval1 转为字符串
distance2 = data[i]
distance2 = hex(distance2)
interval2 = distance2[2:].upper()
str2= str(interval2)
string1=str1+str2 #拼接高字节和低字节(用字符串来表示)
distance =int(string1,16) #将一个字符串 按照 16 进制的方式解析并转换为整数
#------------------环境噪声noise--------------------
noise1 = data[i + 3]
noise1 = hex(noise1)
noise1_16 = noise1[2:].upper()
noise1_str = str(noise1_16)
noise2 = data[i + 2]
noise2 = hex(noise2)
noise2_16 = noise2[2:].upper()
noise2_str = str(noise2_16)
noise_str = noise1_str+noise2_str
noise = int(noise_str,16)
#-------------------------接收强度信息peak--------------------
peak1 = data[i + 7]
peak1 = hex(peak1)
peak1_16 = peak1[2:].upper()
peak1_str = str(peak1_16)
peak2 = data[i + 6]
peak2 = hex(peak2)
peak2_16 = peak2[2:].upper()
peak2_str = str(peak2_16)
peak3 = data[i + 5]
peak3 = hex(peak3)
peak3_16 = peak3[2:].upper()
peak3_str = str(peak3_16)
peak4 = data[i + 4]
peak4 = hex(peak4)
peak4_16 = peak4[2:].upper()
peak4_str = str(peak4_16)
peak_str = peak1_str+peak2_str+peak3_str+peak4_str
peak = int(peak_str,16)
#-------------------------置信度confidence--------------------
confidence = data[i + 8]
#-------------------------积分次数intg---------------------
intg1 = data[i + 12]
intg1 = hex(intg1)
intg1_16 = intg1[2:].upper()
intg1_str = str(intg1_16)
intg2 = data[i + 11]
intg2 = hex(intg2)
intg2_16 = intg2[2:].upper()
intg2_str = str(intg2_16)
intg3 = data[i + 10]
intg3 = hex(intg3)
intg3_16 = intg3[2:].upper()
intg3_str = str(intg3_16)
intg4 = data[i + 9]
intg4 = hex(intg4)
intg4_16 = intg4[2:].upper()
intg4_str = str(intg4_16)
intg_str = intg1_str+intg2_str+intg3_str+intg4_str
intg = int(intg_str, 16)
#--------------------------温度表征值reftof-----------------
reftof1 = data[i + 14]
reftof1 = hex(reftof1)
reftof1_16 = reftof1[2:].upper()
reftof1_str = str(reftof1_16)
reftof2 = data[i + 13]
reftof2 = hex(reftof2)
reftof2_16 = reftof2[2:].upper()
reftof2_str = str(reftof2_16)
reftof_str = reftof1_str+reftof2_str
reftof = int(reftof_str, 16)
#---------------------------------------------------------
measurements.append((distance, noise, peak, confidence, intg, reftof))
return measurements
def read_serial_data():
with serial.Serial(port, baudrate, timeout=3) as ser:
time.sleep(2) # 等待设备准备
while True:
if ser.in_waiting > 0:
# 读取数据
raw_data = ser.read(195) # 读取所有可用数据
data = list(raw_data) # 转换为列表以便处理
measurements = parse_data(data)
if measurements:
for idx, (distance, noise, peak, confidence, intg, reftof) in enumerate(measurements):
print(f"测量点 {idx + 1}: 距离数据Distance = {distance} mm, 环境噪声Noise = {noise}, 接收强度信息Peak = {peak}, 置信度Confidence = {confidence}, 积分次数Intg = {intg}, 温度表征值Reftof = {reftof} ")
print("------------")
if __name__ == "__main__":
read_serial_data()
stm32 采集 arduino采集代码
arduino Serial2波特率230400捕获解析数据,Serial波特率9600打印给电脑。Serial2解析数据是0XAA,0XAA,0XAA,0XAA开头,总数据长度195。获取数据后完整的一帧打包

首帧是0xaa ,0xaa ,0xaa ,0xaa
#define START_BYTE 0xAA // 帧头字节
#define FRAME_SIZE 195 // 总数据长度
uint8_t frameBuffer[FRAME_SIZE]; // 用于存储一帧数据
bool capturing = false; // 是否在捕获数据
uint8_t index_ = 0; // 数据索引
uint16_t f_distance=0; // 测量的距离
void printFrame() {
// Serial.println("完整数据帧:");
// 发送数据到 Python 格式解析
// Serial.print("Data: ");
// for (int i = 0; i < FRAME_SIZE; i++) {
// Serial.print(frameBuffer[i], HEX);
// Serial.print(" ");
// }
// Serial.println();
// 解析数据
//Serial.println("解析后的测量数据:");
for (int i = 10; i < FRAME_SIZE; i += 15) {
if (i + 15 < FRAME_SIZE) { // 确保不会越界
// 解析距离 distance
uint16_t distance = (frameBuffer[i + 1] << 8) | frameBuffer[i];
f_distance=distance;
// 解析环境噪声 noise
uint16_t noise = (frameBuffer[i + 3] << 8) | frameBuffer[i + 2];
// 解析接收强度 peak
uint32_t peak = (frameBuffer[i + 7] << 24) | (frameBuffer[i + 6] << 16) |
(frameBuffer[i + 5] << 8) | frameBuffer[i + 4];
// 解析置信度 confidence
uint8_t confidence = frameBuffer[i + 8];
// 解析积分次数 intg
uint32_t intg = (frameBuffer[i + 12] << 24) | (frameBuffer[i + 11] << 16) |
(frameBuffer[i + 10] << 8) | frameBuffer[i + 9];
// 解析温度表征值 reftof
uint16_t reftof = (frameBuffer[i + 14] << 8) | frameBuffer[i + 13];
// 打印解析后的数据
//Serial.print("距离: "); Serial.println(distance);
// Serial.print(" | 噪声: "); Serial.print(noise);
// Serial.print(" | 强度: "); Serial.print(peak);
// Serial.print(" | 置信度: "); Serial.print(confidence);
// Serial.print(" | 积分次数: "); Serial.print(intg);
// Serial.print(" | 温度: "); Serial.println(reftof);
}
}
//Serial.println("\n--- End of Frame ---");
}
void Read_distance(uint8_t byteReceived){
if (!capturing) {
// 进入帧头检测
static uint8_t headerBuffer[4] = {0};
headerBuffer[0] = headerBuffer[1];
headerBuffer[1] = headerBuffer[2];
headerBuffer[2] = headerBuffer[3];
headerBuffer[3] = byteReceived;
if (headerBuffer[0] == START_BYTE && headerBuffer[1] == START_BYTE &&
headerBuffer[2] == START_BYTE && headerBuffer[3] == START_BYTE) {
// 发现帧头,开始接收数据
capturing = true;
index_ = 4;
memcpy(frameBuffer, headerBuffer, 4);
}
} else {
// 继续存储数据
frameBuffer[index_++] = byteReceived;
// 收到完整一帧数据
if (index_ >= FRAME_SIZE) {
capturing = false;
printFrame(); // 打印数据帧
if(f_distance>8000){
// 数据无效
}
else{
Serial.print("距离: "); Serial.println(f_distance);
// 在这里去做后续的事情
}
// 完整解析数据后在做动作
}
}
}
void setup() {
Serial.begin(9600); // 电脑串口
Serial2.begin(230400); // 设备串口
}
void loop() {
while (Serial2.available()) {
uint8_t byteReceived = Serial2.read();
Read_distance(byteReceived);
}
// 不要做其他动作干扰数据解析
}
浙公网安备 33010602011771号