返回> 网站首页
Simulink接收串口数据,并使用S-Function解析
yoours2021-07-26 19:01:24
【MATLAB】
【Simulink】
简介一边听听音乐,一边写写文章。
使用simulink时,有时需要实时采集真实数据进行算法仿真。这里使用串口接收再使用S-Function进行协议解析,最后推送给后续算法模块进行仿真的过程。
1. 配置串口:
数据类型为uint8
2. 类型转换:
S-Function输入输出仅支持double类型(real_T)
Output minimum:[]
Output maximum:[2]
3. S-Function
解析串口数据,并输出解析后的四个数据
// 输入配置
if (!ssSetNumInputPorts(S, 1)) return;//1个输入口
ssSetInputPortWidth(S, 0, 1);//1维
//设置input0的访问方式,true就是临近访问,这样指针的增量后就可以直接访问下个input端口了
ssSetInputPortRequiredContiguous(S, 0, true);
// 设置输入端口的信号是否mdlOutputs函数中使用,这儿设置为1。
ssSetInputPortDirectFeedThrough(S, 0, 1);
// 输出配置
if (!ssSetNumOutputPorts(S, 4)) return;//4个输出口
ssSetOutputPortWidth(S, 0, 1);//宽度为1
ssSetOutputPortWidth(S, 1, 1);//宽度为1
ssSetOutputPortWidth(S, 2, 8);//宽度为8
ssSetOutputPortWidth(S, 3, 1);//宽度为1
// 结果输出
static void mdlOutputs(SimStruct *S, int_T tid)
{
// 输入输出仅支持double类型(real_T)
const real_T *u = (const real_T*) ssGetInputPortSignal(S,0);
real_T *y0 = ssGetOutputPortSignal(S,0);
real_T *y1 = ssGetOutputPortSignal(S,1);
real_T *y2 = ssGetOutputPortSignal(S,2);
real_T *y3 = ssGetOutputPortSignal(S,3);
// 解析串口数据,调用C语言语法编写解析函数
if(ParseData((*u), &ackData))
{
y0[0] = ackData.btCmdNo;
y1[0] = ackData.btCmd;
// 输出一维数组
for(int i=0;i<ssgetoutputportwidth(s, 2);i++)
y2[i] = ackData.btTag[i];
memset(&ackData, 0, sizeof(struct ACK_DATA));
y3[0] = 1;
}else{
y3[0] = 0;
}
}
4. 完成后在命令行串口编译
>> mex unPackData_Q.c
使用 'MinGW64 Compiler (C)' 编译。
MEX 已成功完成。