返回> 网站首页 

Simulink接收串口数据,并使用S-Function解析

yoours2021-07-26 19:01:24 MATLAB Simulink 阅读 3044

简介一边听听音乐,一边写写文章。

使用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 已成功完成。


微信小程序扫码登陆

文章评论

3044人参与,0条评论