项目场景:
使用深圳维特智能科技有限公司
的JY61
模块,获取运动小车的航向角。
应用场景:将JY61
模块通过串口接入Linux开发板,使用程序读取角度数据
问题描述:
小车实际角度变化,程序读取的角度数据却没有立刻跟着变,而是过一会才会变,读取的角度数据表现出明显的滞后性。
得到的帮助:
询问客服后,客服告知了以下两点:
1.JY61模块是主动输出测试数据的
2.JY61模块的角度测量原理大概为:角加速度在时间上的积分。
问题解决
定位问题:
将JY61接模块接入PC,使用官方软件读取JY61的角度数据,发现小车转动的时候,程序读取的数据滞后于实际角度;而PC上的软件读取的角度于实际角度一样,没有滞后现象;可知问题出在程序,导致读取数据出现滞后问题。
分析问题
读取程序结构如下:
//串口设备文件描述符号
int fd = -1;
int main()
{
//设置串口参数
csdn_init_serial();
while(1)
{
//读取角度数据
csdn_get_angle();
//延时
sleep(1);
}
}
尝试将sleep(1)
改为usleep(1000)
,重新读取数据后,程序读取的角度数据与实际角度相比更为接近,但仍具有滞后性。
问题解决
怀疑程序读取的数据不是实时的测试数据,而是读取了缓冲区中过时的数据,那我在读取角度数据前,先清空缓冲区,再读取
,就可以获得JY61新鲜出炉的角度数据,于是修改代码如下:
//串口设备文件描述符号
int fd = -1;
int main()
{
//设置串口参数
csdn_init_serial();
while(1)
{
//清空串口的缓冲区,注:tcflush是系统函数
tcflush(fd, TCIFLUSH);
//读取角度数据
csdn_get_angle();
//延时
sleep(1);
}
}
清空输入缓冲区后,读取到的角度数据正常(JY61主动发送数据进去),且数据实时性很好,不再具有滞后现象。
tcflush函介绍:(资料来源:Linux系统的man手册)
问题总结
1.JY61模块正常工作时,会主动地、不断地往外输出角度数据,该数据会被暂存到串口的缓冲区,而程序读取角度数据时间间隔越长,缓冲区累积的数据越多。
2.缓冲区数据存取方式为选入先出
,这会导致程序读取到的角度数据为最早存入缓冲区中的数据,不是实时的角度数据,从而出现了程序得到的角度数据滞后于实际角度的现象。