使用MATLAB App实现STM32用户交互界面(1)——串口通讯实现MATLAB与STM32的连接

        最近几个月,DIY了块板子,选用的芯片是STM32F407,该板子与上位机(也就是电脑)的通讯方式有两种,一是用串口发送程序进程数据,二是用网口发送原始数据。在调试时,需要用XCOM接收串口信息、用XNET接收网口信息。由于这块板子是用来学术研究的,数据每次都要拷到MATLAB中分析,非常的不方便。于是想一步到位,使用 MATLAB App 制作一个GUI实现与单片机的交互。

        本系列文档将记录该用户界面的搭建过程,本人才疏学浅,如有错误,还请指正,废话不多说,直接上本人的移植记录。

一、 MATLAB App设计

        首先打开MATLAB软件,在命令行窗口输入“appdesigner” 打开MATLAB App,该界面还是很友好的,如下图所示,用“文本区域”、“下拉框”、“按钮”组件简单搭建了一个界面。

         网上有不少关于MATLAB与单片机的串口通讯介绍资料,讲的也很详细。MATLAB :【11】一文带你读懂serialport串口收发原理与实现_Alex-YiWang的博客-CSDN博客https://blog.csdn.net/Alex497259/article/details/125922427

         但有一个很奇怪的Bug,在 MATLAB App 中,不管是用 serial 还是 serialport 函数,串口始终跳不进回调函数,同样的代码在.m文件却可以正常运行。本人能力有限,哪位大佬知道原因还请告知。

        不断调试,最终选择了用 serial 函数加上轮询实现与单片机的交互,所设计的串口函数代码如下:

properties (Access = public)
        USART_SerialObj      % 串口结构体
end 


methods (Access = private)
        
        %=========================串口初始化函数==========================
        function USART_startSerial(app, ~)
            delete(instrfindall);                               %删除串口
            app.USART_SerialObj = serial('COM4','BaudRate',115200,'StopBits',1,'Parity','none');       %新建串口
            fopen(app.USART_SerialObj);                         %打开串口
            fprintf(app.USART_SerialObj, '%s', 'USART_OK');     %发送握手信息
        end

        %======================串口接收回调函数轮询=======================
        function USART_readSerial(app,~)
            while app.USART_SerialObj.BytesAvailable == 0                   % 循环检查串口是否有新数据
                pause(0.1);
            end    
            data = fread(app.USART_SerialObj, app.USART_SerialObj.BytesAvailable, 'char');                  % 读取串口接收到的数据
            app.USART_Rev_Data.Value = [app.USART_Rev_Data.Value;convertCharsToStrings(char(data'))];       % 显示接收到的数据 读者根据自身代码修改
            app.USART_readSerial();                                                                         % 继续循环读取数据
        end
end

二、单片机程序设计

        单片机上的串口按正常流程调用串口初始化函数,这里我添加的了一个握手信号,握手程序的代码如下:

u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,	接收完成标志
//bit14,	接收到0x0d
//bit13~0,	接收到的有效字节数目
u16 USART_RX_STA = 0;       //接收状态标记	

#define PHY_USART_PC_HANDSHAKE  "USART_OK"             //定义上位机握手信号

//串口上位机握手
unsigned char PhyUart_PC_handshake(void)
{
    u8 len,t;
    char data_Rev[16];

    if(USART_RX_STA&0x8000)
    {					   
        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
            
        for(t = 0;t<len;t++)
            data_Rev[t] = USART_RX_BUF[t];
        for(t = len;t<16;t++)   
            data_Rev[len] = '\0';
            
        if(strcmp(data_Rev,PHY_USART_PC_HANDSHAKE) == 0)    //与上手机握手验证
        {
            USART_RX_STA=0;
            return 1;
        }
        else
        {
            USART_RX_STA=0;
            return 0;
        }
    }
}

三、程序运行效果

        板子连接上电脑,选择好串口和波特率,点击连接,串口成功接收到了板子发送来的信息。

物联沃分享整理
物联沃-IOTWORD物联网 » 使用MATLAB App实现STM32用户交互界面(1)——串口通讯实现MATLAB与STM32的连接

发表评论