第4章:数据采集实战——串口配置与连接、触发采集命令、实时数据流读取、保存为二进制文件
说实话,做雷达数据采集这件事,看着简单,坑是真不少。
我最早接触毫米波雷达时,以为接上线、点个按钮就能拿到数据。结果呢?串口没反应、数据断断续续、保存的文件打不开……折腾了一整天。后来我才明白,数据采集是整个雷达系统里最容易被忽视、却又最关键的环节。
这一章,我就带你一步步走通这条路。
4.1 串口配置与连接——别小看这根线
毫米波雷达和电脑之间,最常见的通信方式就是串口。嗯,别笑,虽然它古老,但稳定可靠。
串口参数怎么设?
我习惯先看雷达的硬件手册。不同厂家、不同型号,波特率可能不一样。常见的配置是这样的:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 波特率 | 921600 / 115200 | 高速雷达常用921600,低速用115200 |
| 数据位 | 8 | 几乎都是8位 |
| 停止位 | 1 | 标准配置 |
| 校验位 | None | 无校验,减少开销 |
| 流控制 | None | 不用硬件流控 |
我在项目中遇到过一个问题:波特率设对了,但数据还是乱码。后来发现是USB转串口的线质量太差,丢包严重。你想想看,一根几块钱的线和一根几十块的线,在高速数据采集时差别巨大。
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毫秒)
// [数据体]
// 连续的原始帧数据
这样存的好处是:以后不管过多久,只要知道这个格式,就能把数据读回来。
4.5 完整流程——串起来看
好了,我们把上面几步串起来,看看完整的采集流程:
1. 打开串口 (波特率921600, 8N1)
2. 发送启动命令
3. 等待500ms
4. 创建二进制文件,写入文件头
5. 循环读取数据:
a. 从串口读1024字节
b. 写入文件
c. 更新进度显示
6. 收到停止指令时:
a. 发送停止命令
b. 关闭文件
c. 关闭串口
这个流程看起来简单,但每一步都有细节。我刚开始做的时候,漏掉了等待时间,结果文件头里全是乱数据。
4.6 知识体系总览
下面这张图,帮你把本章的核心逻辑串起来:
这张图把整个流程串起来了。你从左边开始,一步步走到右边,再回到左边,就是一个完整的采集闭环。
4.7 避坑指南——我踩过的雷
最后,分享几个我亲身踩过的坑:
- 串口缓冲区溢出: 有一次我读数据时处理逻辑写得太慢,结果串口缓冲区满了,后面的数据全丢了。解决方案:用单独的读取线程,或者增大系统串口缓冲区。
- 文件写入太慢: 每读一小段就写一次文件,磁盘IO成了瓶颈。后来我改成每攒够4KB再写一次,速度提升明显。
- 忘记关闭文件: 程序异常退出时,文件没关闭,导致数据损坏。我后来加了个信号处理函数,确保退出时清理资源。
嗯,这些坑你大概率也会遇到。提前知道,能省不少调试时间。
数据采集这件事,说白了就是“接住数据,存好数据”。看似简单,但每个环节都有讲究。把这一章的内容吃透,后面的数据回放和复盘才能顺利进行。