在simulink中使用串口模块接收数据并解帧延迟性问题解决

时间:2024-05-18 12:16:31

山重水复疑无路,柳暗花明又一村。

最近在simulink中搭了一个模型,需要通过串口将外部惯导模块的数据读进来,解帧后输入模型中进行计算,算是半物理仿真。
起初烦恼于不知道如何将这种实时更新的数据实时解算并输出,在请大佬帮忙后,解算的问题解决了,但又遇到了解帧数据更新缓慢,延迟性大的问题。中间因为项目进度缓慢,被老板训斥了一顿。好在经过不断尝试,终于解决了解算数据更新延迟的问题。

一、起初接收解算串口数据的思路
刚开始我甚至不知道simulink模块有串口接收模块,试图通过在simulink中写matlab function调用Serial函数的方式实现串口数据的接收与解算,事实证明是行不通的。
后来查到,simulink中原来有专门的串口模块,晕,早知道就不费那么大周折了,然后在大佬的指导下搭建了下面的模型。

在simulink中使用串口模块接收数据并解帧延迟性问题解决
其思路是:从串口每次一个读取数据,根据我的传感器的串口通信协议,每11个数据为一帧,所以加一个buffer模块,相当于将连续发送的串口数据分割为一帧一帧(每帧11个数据),到状态机中根据帧头判断是什么数据(加速度/角速度)后解帧,我在后边加了scope用来查看输出的数据。

二、遇到的问题
经过实验,数据的准确性上没有问题,但实现不了实时更新,而且随着仿真时间的增长,数据更新延迟越来越严重,从起初的2s,逐渐增加到5,10,15,30…这样还做个毛线的半物理仿真,就失去串口通信的意义了。
然后就是苦思冥想,问题到底出在哪?
起初是觉得状态机的问题,或许是解算耗时,从而延缓了数据的更新,解算程序没法改啊,改了设置又好像没用。
或许是仿真设置的问题?改成定步长或许会快一些?也没用。
又或者是电脑性能的问题?又研究了下Matlab的多核并行计算,也还是没有起色。
没有师兄的孩子就是这么苦逼,没人带问了几个同学也都说没搞过,去论坛发帖也没人回。眼看时间一天天过去了,啊迟迟没有进度,我都有点怀疑自己了,不过没有放弃尝试。

三、尝试解决
终于,在我删去buffer模块,并直接在串口更改Data size为[11 1]后,实时性的问题终于得到解决。
在simulink中使用串口模块接收数据并解帧延迟性问题解决
在simulink中使用串口模块接收数据并解帧延迟性问题解决
现在我终于可以丝滑而且几乎无延时的看到数据更新了!
在simulink中使用串口模块接收数据并解帧延迟性问题解决

四、反思与总结