• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
arduino stm32激光雷达

 


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);
    }

    // 不要做其他动作干扰数据解析
  

    
}

  

posted on 2025-03-15 12:51  MKT-porter  阅读(87)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3