S-Function 允许使用自定义C/C++函数作为传递函数,具有可移植性。也可以同样利用MATLAB函数进行相同的运算,看开发者熟悉程度而定。

项目流程

  1. 由系统串口接收数据包。
  2. 通过S-Function自定义函数解析数据包,得到数据集合。
  3. 数据集合总线输出,分为各部分数据进行可视化显示。

串口接收

首先需要通过MPU6050数据手册将其寄存器的各项输出数据通过UART读出,并将其处理为我们所需要的7项参数(加速度Accl. [X,Y,Z],角加速度Gyro. [X,Y,Z],温度Temp)。

但是这不是本文的重点,因此本文假设已经处理好了上述数据,并且以字符打印的形式通过串口稳定输出,(通过Rasberry Pico PI预处理)如下:

我们需要配置串口接收参数:

COM口以用户本机分配为准

Serial Configuration配置如图

Serial Receive配置如图

注意,由于是以字符char接收,因此选择类型为uint8,Data Size设置缓冲区大小,此处设为128为例。同样可以设置数据包头和数据包尾,我们此处不做设置。

当然,在实际项目中会以更高效率的数据包传输,此处仅为示例作用,因此选用字符接收。

S-Function函数示例

从Library Browser中找到User-Defined functions(用户自定义函数),在系统仿真中这部分是较为常用的。

选择S-Function Builder,双击点开面板。由于是面板端编辑,直接面向对象,逻辑更清晰,但是限制也较多。

填写函数名,选择语言C++,即可Build编译。(初次需要按提示安装MinGW-w64方可编译,且安装目录不能带空格)

注意到,编辑器里面有三个子函数,分别封装S-Function的起始方程,输出方程和终止方程,在本实例中仅用到输出的封装,其他功能请自行学习浏览官方示例。

void xxx_Start_wrapper(void);
void xxx_Outputs_wrapper(const real_T *u0, real_T *y0);
void xxx_Terminate_wrapper(void);

注意到,输入输出参数都是以数组指针的形式传参的,带const表示输入参数,不可更改,不带的即表示输出参数,可更改。函数的目的是按次调用这三个子函数。

我们可以先调试好C++程序再整合。

在本实例中,输入参数为大小为128*1的字符数组(uint8),输出参数为包括三个参数的总线(Bus:gyroData),以结构体形式调用。

在自己工程文件中定义头文件(structure.h),用于类型的转换和结构体的定义等,这部分内容是为了便于程序能在本地调试成功,而由于在Simulink中这部分内容已有定义,因此在Simulink的S-Function Builder中编译的时候是需要将其之注释掉的。

structure.h:

#ifndef _STRUCTURE_H
#define _STRUCTURE_H
typedef char uint8_T;
typedef short int16; struct gyroData{
int16_t accl[3], gyro[3];
double temp;
};
#endif //_STRUCTURE_H

如果不注释掉,在编译时会由于变量类型冲突而编译失败。

在本地C++工程调试成功,即可移植。

调试成功后,将其移植至S-Function Builder中。

注意参数类型、维度都要一一匹配。需要用到的头文件和引入文件也需要在include部分添加进来。

如果C++工程包含其他文件,将工程文件目录添加至INC_PATH,注意文件目录最好不要含有空格,否则再次打开时可能会产生修正而出错。

点击编译,提示ERROR: Bus object for output port 1 gyroData does not exist in workspace,即:总线未被添加至工作区导致编译失败。

手动添加的办法,即打开MODELING中的Bus Editor选项进行添加,注意总线名称Object Name以及元素名称,以及其类型、维度,均设置匹配。当然,也有通过代码区更方便添加的办法请自动查阅相关文档。

添加后请将其保存为.mat文件方便日后直接将设置好的总线导入。

如果没有问题,会显示S-Function编译成功。

这时,我们可以用S-Function模块直接填写函数名,直接调用,模块会自动产生相应数目的输入输出端口,可以供检查。

(虽然S-Function Builder也可直接使用)

这样,我们的S-Function就编写完成。

数据可视化

我们利用Bus Selector模块进行对总线拆分,用Display模块显示文本(数组),用Scope模块进行示波器图像绘制,这些属于基本操作,就不详加叙述了。

这里提到一个调试的方法,即先使用静态文本(此处用了字符串常量String Constant)进行调试,确认S-Function功能无误即可接入动态数据进行观察。

最后

文章末尾,附上相关的工程文件供参考。

  • bus_gyroData.mat gyroData总线
  • getGyroData___ 由S-Function生成的函数
  • receive_test.slxc 接收端Simulink工作区面板
  • gyroDataProcess 用于产生S-Function的C++文件

请访问我的Github URL以下载:https://github.com/Chiron19/Simulink

感谢阅读!欢迎分享。

Simulink S-Function的使用(以串口接收MPU6050六轴陀螺仪参数为实例)的更多相关文章

  1. STM32串口接收不定长数据原理与源程序(转)

    今天说一下STM32单片机的接收不定长度字节数据的方法.由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的A ...

  2. zigbee学习之路(十):串口(接收)

    一.前言 上次我们学习了串口的发送,今天我们要学习串口的接收,要实现的功能是接收电脑发来的数据,控制LED 灯闪烁,而且将收到的数据发回给电脑显示出来.而且要采用不占用cpu资源的中断. 二原理与分析 ...

  3. stm32的串口接收字符串以十六进制数

      #include "pbdata.h"   uint8_t TxBuffer1[] = "USART Interrupt Example: This isUSART1 ...

  4. STM32 ucosii 串口接收数据 遇到的问题及解决思路

    写一个程序,用到了ucos ii ,串口在中断中接收数据(一包数据 8个字节 包含: 1byte包头 5byte数据 1byte校验和 1byte 包尾 ) ,数据由上位机每隔500ms发送一次,在串 ...

  5. 基于Verilog的带FIFO输出缓冲的串口接收接口封装

    一.模块框图及基本思路 rx_module:串口接收的核心模块,详细介绍请见“基于Verilog的串口接收实验” rx2fifo_module:rx_module与rx_fifo之间的控制模块,其功能 ...

  6. [转]C# serialPort 串口接收中this.Invoke的使用

    本文转自:https://blog.csdn.net/hjk216/article/details/72677596 转载地址:http://www.ciast.net/post/20160752.h ...

  7. 基于Verilog的串口接收程序

    一.模块框图及基本思路 detect_module:检测输入引脚的下降沿,以此判断一帧数据的开始 rx_bps_module:波特率时钟产生模块 rx_control_module:串口接收的核心控制 ...

  8. 2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9490616.html 本文用的是VS2013MFC写串口数据接收: 第一步:首先建立一个MFC ...

  9. STM32 HAL库使用中断实现串口接收不定长数据

    以前用DMA实现接收不定长数据,DMA的方法接收串口助手的数据,全部没问题,不过如果接收模块返回的数据,而这些数据如果包含回车换行的话就会停止接收,例如接收:AT\r\nOK\r\n,就只能接收到AT ...

随机推荐

  1. Python处理utf-8 添加和删除BOM头

    以下代码只处理了assic和utf8文件.其它文件编码为保险起见并未加入支持. 参数 exts 需要处理文件的扩展名 folders 需要处理的文件夹及子目录 处理目录为当前目录运行:添加bom头 p ...

  2. 【剑指Offer】10- I. 斐波那契数列 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 递归 动态规划 日期 题目地址:htt ...

  3. 1122 机器人走方格 V4

    1122 机器人走方格 V4 基准时间限制:1 秒 空间限制:131072 KB  四个机器人a b c d,在2 * 2的方格里,一开始四个机器人分别站在4个格子上,每一步机器人可以往临近的一个格子 ...

  4. SpringBoot集成MyBatis-Plus自定义SQL

    1.说明 本文介绍Spring Boot集成MyBatis-Plus框架后, 基于已经创建好的Spring Boot工程, 添加自定义的SQL实现复杂查询等操作. 自定义SQL主要有两种方式, 一种是 ...

  5. Swoole 中使用 WebSocket 异步服务器、WebSocket 协程服务器

    WebSocket 异步风格服务器 WebSocket\Server 继承自 Http\Server,所以 Http\Server 提供的所有 API 和配置项都可以使用. # ws_server.p ...

  6. CSS基础 清除浮动

    1.单伪元素清除法:清除浮动 .clearfix::after{             content: '.';             display: block;             c ...

  7. 『无为则无心』Python函数 — 34、lambda表达式

    目录 1.lambda的应用场景 2.lambda语法 3.快速入门 4.示例:计算a + b 5.lambda的参数形式 6.lambda的应用 lambda表达式的主要作用就是化简代码. 匿名函数 ...

  8. Python_元类

    什么是元类 我们知道,实例对象是由类创建的,那么类又是由什么创建的呢? 答案就是元类. 元类基本不会用到,但是就算不用,也应该去熟悉一下概念. 理解类也是对象 在大多数编程语言中,类就是一组用来描述如 ...

  9. 不用下载Axure RP Extension for Chrome插件查看原型文件的方法

    Axure RP Extension for Chrome是一款谷歌插件,主要可以用来查看原型文件.以前安装插件的时候总是找半天资源,很麻烦,最近发现了一种新方法可以不用下载插件资源.其实在原型文件中 ...

  10. Centos7 logrotate日志切割

    https://www.cnblogs.com/kevingrace/p/6307298.html 在当前目录下 vim  *****  文件 需要切的日志  /home/soft/app/logs/ ...