请详细解析TFminireadData函数
TFmini::readData函数主要用于从TFmini激光测距传感器的串口读取数据,解析出距离和信号强度等信息。函数具体实现如下:
bool TFmini::readData(uint16_t timeout) {
uint32_t startTime = millis(); // 获取当前时间
uint16_t index = 0; // 数据缓存数组的索引
bool hasData = false; // 是否读取到有效数据标志位
// 等待读取到完整的一帧数据或超时
while (millis() - startTime < timeout) {
if (_serial->available()) { // 如果串口有数据可读
char c = _serial->read(); // 读取一个字符
if (index == 0 && c != 0x59) continue; // 如果第一个字符不是0x59,则跳过该字符
if (index == 1 && c != 0x59) { // 如果第二个字符不是0x59,则重新开始读取
index = 0;
continue;
}
if (index == 8) { // 如果已经读取到第9个字符,即一帧数据读取完成
_distance = _buf[2] + _buf[3] * 256; // 解析距离数据
_strength = _buf[4] + _buf[5] * 256; // 解析信号强度数据
_crc = _buf[6] + _buf[7] * 256; // 解析校验码数据
if (checkCRC()) hasData = true; // 校验数据是否有效
index = 0; // 重新开始读取下一帧数据
continue;
}
_buf[index++] = c; // 将读取到的字符存入缓存数组
}
}
return hasData; // 返回是否读取到有效数据
}
具体解析如下:
-
首先获取当前时间,作为超时的起始时间。
uint32_t startTime = millis(); -
定义一个数据缓存数组的索引变量 index,初始值为 0,表示数据缓存数组的第一个元素。
uint16_t index = 0; -
定义一个标志位变量 hasData,初始值为 false,表示当前还没有读取到有效数据。
bool hasData = false; -
使用一个 while 循环等待读取到完整的一帧数据或超时。如果超时,则跳出循环。
while (millis() - startTime < timeout) { // ... } -
在 while 循环中,首先判断串口是否有数据可读。如果没有,则继续等待。
if (_serial->available()) { // ... } -
如果串口有数据可读,则调用 _serial->read() 函数读取一个字符。如果该字符是一帧数据的第一个字符(即 0x59),则将 index 设置为 0,并继续等待读取下一个字符。如果该字符是一帧数据的第二个字符(即也是 0x59),则说明已经读取到一帧数据的起始位置,可以开始读取完整的一帧数据了。如果该字符不是 0x59,则说明读取的数据不是一帧有效数据,需要重新开始读取。
char c = _serial->read(); // 读取一个字符 if (index == 0 && c != 0x59) continue; // 如果第一个字符不是0x59,则跳过该字符 if (index == 1 && c != 0x59) { // 如果第二个字符不是0x59,则重新开始读取 index = 0; continue; } -
如果已经读取到一帧数据的第 9 个字符(即一帧数据读取完成),则解析出距离、信号强度和校验码等数据,并调用 checkCRC() 函数校验数据是否有效。如果数据有效,则设置 hasData 为 true,表示已经读取到有效数据,否则需要重新开始读取下一帧数据。
if (index == 8) { // 如果已经读取到第9个字符,即一帧数据读取完成 _distance = _buf[2] + _buf[3] * 256; // 解析距离数据 _strength = _buf[4] + _buf[5] * 256; // 解析信号强度数据 _crc = _buf[6] + _buf[7] * 256; // 解析校验码数据 if (checkCRC()) hasData = true; // 校验数据是否有效 index = 0; // 重新开始读取下一帧数据 continue; } -
最后将读取到的字符存入缓存数组,并将 index 加 1,表示已经读取到下一个字符。
_buf[index++] = c; // 将读取到的字符存入缓存数组 -
循环结束后,返回 hasData 的值,表示是否读取到有效数据。
return hasData;
原文地址: https://www.cveoy.top/t/topic/bQ64 著作权归作者所有。请勿转载和采集!