第4章:数据采集实战——串口配置与连接、触发采集命令、实时数据流读取、保存为二进制文件

说实话,做雷达数据采集这件事,看着简单,坑是真不少。

我最早接触毫米波雷达时,以为接上线、点个按钮就能拿到数据。结果呢?串口没反应、数据断断续续、保存的文件打不开……折腾了一整天。后来我才明白,数据采集是整个雷达系统里最容易被忽视、却又最关键的环节。

这一章,我就带你一步步走通这条路。

4.1 串口配置与连接——别小看这根线

毫米波雷达和电脑之间,最常见的通信方式就是串口。嗯,别笑,虽然它古老,但稳定可靠。

串口参数怎么设?

我习惯先看雷达的硬件手册。不同厂家、不同型号,波特率可能不一样。常见的配置是这样的:

参数 典型值 说明
波特率 921600 / 115200 高速雷达常用921600,低速用115200
数据位 8 几乎都是8位
停止位 1 标准配置
校验位 None 无校验,减少开销
流控制 None 不用硬件流控

我在项目中遇到过一个问题:波特率设对了,但数据还是乱码。后来发现是USB转串口的线质量太差,丢包严重。你想想看,一根几块钱的线和一根几十块的线,在高速数据采集时差别巨大。

我的小技巧: 买串口线时,尽量选带FTDI芯片的。贵一点,但省心。

4.2 触发采集命令——让雷达开始工作

串口连上了,接下来要告诉雷达:“嘿,开始采集数据吧!”

不同雷达的指令格式不一样。有的用ASCII字符串,有的用十六进制帧。我以最常见的TI毫米波雷达为例:

// 发送配置命令(十六进制)
// 这条命令的意思是:启动数据流
0x02 0x01 0x04 0x03 0x00 0x00 0x00 0x00

// 或者用ASCII方式(某些雷达支持)
"sensorStart\n"

这里有个坑:发送命令后,雷达不会立刻响应。它需要时间初始化内部模块。我一般会等200-500毫秒再开始读数据。

注意: 不要连续发送多次启动命令。雷达可能进入异常状态。我曾经因为这个,把一块雷达板搞“死”了,只能断电重启。

4.3 实时数据流读取——别让数据跑掉

雷达一旦开始工作,数据就会像流水一样涌出来。你的任务就是接住它,一滴不漏。

怎么读?

我推荐用轮询+缓冲区的方式。别用中断,也别用阻塞式读取。原因很简单:雷达数据是连续的,你不能停。

// 伪代码示例
while (running) {
    bytes = serialPort.read(buffer, 1024);
    if (bytes > 0) {
        // 把数据追加到环形缓冲区
        ringBuffer.write(buffer, bytes);
    }
    // 别在这里做耗时操作
}

你可能会问:“为什么用环形缓冲区?”

因为数据读取和数据处理是两个不同节奏的事。读取线程要快,处理线程可以慢一点。环形缓冲区正好能解耦它们。

核心要点: 读取线程里不要做任何数据处理!只管读,只管存。数据处理交给另一个线程。

4.4 保存为二进制文件——原始数据最可靠

数据读到了,存成什么格式?

我个人强烈建议:存二进制。别存文本,别存CSV,别存JSON。

为什么?

  • 二进制文件体积小。同样数据,文本可能是二进制的3-5倍。
  • 写入速度快。雷达数据流那么快,你写文本根本跟不上。
  • 精度无损。浮点数在文本转换时会丢失精度。

怎么存?

我习惯在文件头里写一些元信息,方便以后回放时解析:

// 文件结构示例
// [文件头]
// 4字节: 魔数 (0x52414441)  // "RADA"
// 4字节: 数据格式版本号
// 4字节: 每帧字节数
// 8字节: 时间戳 (Unix毫秒)
// [数据体]
// 连续的原始帧数据

这样存的好处是:以后不管过多久,只要知道这个格式,就能把数据读回来。

我的习惯: 文件名里带上日期和时间,比如 "radar_data_2025_01_15_14_30_00.bin"。这样找数据时一目了然。

4.5 完整流程——串起来看

好了,我们把上面几步串起来,看看完整的采集流程:

1. 打开串口 (波特率921600, 8N1)
2. 发送启动命令
3. 等待500ms
4. 创建二进制文件,写入文件头
5. 循环读取数据:
   a. 从串口读1024字节
   b. 写入文件
   c. 更新进度显示
6. 收到停止指令时:
   a. 发送停止命令
   b. 关闭文件
   c. 关闭串口

这个流程看起来简单,但每一步都有细节。我刚开始做的时候,漏掉了等待时间,结果文件头里全是乱数据。

4.6 知识体系总览

下面这张图,帮你把本章的核心逻辑串起来:

数据采集实战核心流程 串口配置与连接 波特率·数据位·校验 触发采集命令 启动雷达数据流 实时数据流读取 环形缓冲区·轮询 保存二进制文件 文件头·原始帧数据 停止与关闭 发送停止·关闭文件 数据复盘分析 回放·解析·可视化 可循环采集多段数据

这张图把整个流程串起来了。你从左边开始,一步步走到右边,再回到左边,就是一个完整的采集闭环。

4.7 避坑指南——我踩过的雷

最后,分享几个我亲身踩过的坑:

  • 串口缓冲区溢出: 有一次我读数据时处理逻辑写得太慢,结果串口缓冲区满了,后面的数据全丢了。解决方案:用单独的读取线程,或者增大系统串口缓冲区。
  • 文件写入太慢: 每读一小段就写一次文件,磁盘IO成了瓶颈。后来我改成每攒够4KB再写一次,速度提升明显。
  • 忘记关闭文件: 程序异常退出时,文件没关闭,导致数据损坏。我后来加了个信号处理函数,确保退出时清理资源。

嗯,这些坑你大概率也会遇到。提前知道,能省不少调试时间。

数据采集这件事,说白了就是“接住数据,存好数据”。看似简单,但每个环节都有讲究。把这一章的内容吃透,后面的数据回放和复盘才能顺利进行。

可可精品资料库