学习过程:学习光流相关通信协议,知道光流数据怎么解析并发送给飞控,串口接收265数据完成替换
释:匿名光流本身很稳定,但担心地面光线问题,不得不多准备265方案。
一:学习光流相关数据
如图:从光流接收的数据还不少,有三个模式,原始的融合的都有。各个数据代表的含义在图中都有解释。协议和匿名总体通讯协议是一样的,第一次接触可以B站茶不思的视频进行学习。
总之,光流数据没有奇特之处,只不过多了一点,通过数据内容的第一字节来判断数据的模式。
二:知道光流数据怎么解析并发送给飞控
初步解析
// An highlighted block
void AnoOF_GetOneByte(uint8_t data)
{
static u8 _data_len = 0, _data_cnt = 0;
static u8 rxstate = 0; //移位标志
if (rxstate == 0 && data == 0xAA) //数据帧头为0XAA
{
rxstate = 1;//进下一位
_datatemp[0] = data;//第0字节 帧头
}
// 移位1 0x61和 0xff广播模式
else if (rxstate == 1 && (data == HW_TYPE || data == HW_ALL))
{
rxstate = 2;
_datatemp[1] = data;//第1字节 目标地址通常为0xff
}
else if (rxstate == 2)
{
rxstate = 3;
_datatemp[2] = data;//第2字节 功能码0X51
}
//下面就是通信格式,数据内容长度+前4个检验位
// 因为u8为1字节 避免数据饱和过度这里减去后判断是否小于250
else if (rxstate == 3 && data < 250)
{
rxstate = 4;
_datatemp[3] = data;
_data_len = data; //1字节的数据长度 以MODE=0为例,长度为5
_data_cnt = 0; //长度计数
}
//附件判断 数据长度>0
else if (rxstate == 4 && _data_len > 0)
{
//这里把数据内容通过数据长度不等0,持续赋值给datatemp
_data_len--;
_datatemp[4 + _data_cnt++] = data;
//data_len=0,赋值完毕
if (_data_len == 0)
rxstate = 5;
}
//接收和校验
else if (rxstate == 5)
{
rxstate = 6;
_datatemp[4 + _data_cnt++] = data;
}
//接收附加校验
else if (rxstate == 6)
{
rxstate = 0;
_datatemp[4 + _data_cnt] = data;
AnoOF_DataAnl(_datatemp, _data_cnt + 5); //
}
else
{
rxstate = 0;
}
}
这个函数就是按照匿名的通信协议进行初步解析,解析完成后在rxstate=6时,对数据进行深度解析,调用AnnOF_DataAnl()函数。运用这个函数需要在光流对应的串口中进行调用,凌霄使用的是Uart4,对于凌霄的用户,这里我提醒一下,串口4是专接光流串口,串口5被数传发送占用,这两个串口不能随便用,用的时候注意
// 深度解析光流数据函数
/static void AnoOF_DataAnl(uint8_t *data, uint8_t len)
{
u8 check_sum1 = 0, check_sum2 = 0;
if (*(data + 3) != (len - 6)) //判断数据长度是否正确
return;
//和校验 附加校验
for (u8 i = 0; i < len - 2; i++