MATLAB串口通讯实验(一)

2024-06-04 4348阅读

文章目录

    • 前言
    • 虚拟串口建立
    • 串口调试助手充当传感器发送数据
    • MATLAB充当上位机接收并解析数据
      • Step 1. 进行串口配置
      • Step 2. 数据处理
      • 实验结束
      • 总结

        前言

        因工作原因需要通过串口进行数据采集并分析,考虑到经常使用的数据分析工具是MATLAB,而网上关于MATLAB串口实验相关的帖子均写的不清不楚,最终导致我采了很多的坑,因此特意将MATLAB串口相关的操作进行总结并记录,也希望能帮到大家。

        MATLAB串口数据接收仿真实验

        串口函数使用serialport及serial两种

        软件工具包括:串口调试助手 + 虚拟串口工具 + MATLAB

        本文所设计到的虚拟串口驱动,串口调试助手及MATLAB代码我已经按照0积分进行打包上传至我的资源,链接在这,如有需要可以下载使用。

        虚拟串口建立

        Step 1. 打开虚拟串口配置工具,然后使用它生成配对的虚拟串口,选择两个串口号,点击“添加串口”该驱动就会生成两个已经连接的虚拟串口。

        MATLAB串口通讯实验(一) 第1张

        串口调试助手充当传感器发送数据

        Step 1. 为了进行测试,这边使用串口助手发送三角波数据,具体为:4 6 8 10 12 14 16 18 20 18 16 14 12 10 8 6 4 2 。

        Step 2. 使用串口助手打开端口26(选择自己设置的虚拟串口中的一个),并设置波特率,我这边选择的是115200。

        Step 3. 打开“定时发送后”,点击“发送”按钮串口调试助手就会不断发送数据了。

        MATLAB串口通讯实验(一) 第2张

        MATLAB充当上位机接收并解析数据

        Step 1. 进行串口配置

        clc;clear all;close all;
        %% 串口配置
        %---- 使用serialport进行串口配置 ----%
        Port_List = serialportlist("available")   % 显示可用的串口信息
        SerialObj = serialport("COM25",115200);   % 串口参数配置
        data = read(SerialObj,300,"uint8" );  
        % 一次读取一个字节,将每个字节解释为一个 8 位无符号整数 (uint8),并返回一个 double 数组
        % 此处读取了300个字节
        % data_hex = dec2hex(data);
        delete(SerialObj);                    % 使用完一定记得删除串口占用
        %---- 使用serial进行串口配置 ----%
        instrfind                             % 查看已有的串口信息
        delete(instrfind);                    % 关闭遗忘的串口
        port = 'COM25';                       % 端口号选择dataport
        baudrate = 115200;                    % 波特率设置921600bit等于115200个字节
        S = serial(port,'baudrate',baudrate); % 串口设置
        S.InputBufferSize = 300;              % 输入串口缓冲区上限10000字节               
        S.Timeout = 5;                        % Timeout为完成读取或写入操作的等待时间,如果未指定其他值,则使用默认值 10 秒
        try
          fopen(S);                           % 打开串口对象
        catch err
          fclose(instrfind);                  % 关闭被占用的串口
          error('请确认选择了正确的串口');      % 输出错误提示
        end
        instrfind                             % 查看已有的串口信息(牢记使用虚拟串口时打开后需要记得关闭)
        data = fread(S);                      % 直接将所有的数据进行接收,除非数据长度超过了数据缓存区的长度,超过即不显示,又或者超出等待时间
        fclose(S)
        delete(S)                             % 使用完一定记得删除串口占用
        

        这边一共介绍了两种串口配置方式,选择使用一种即可。第一种是使用“serialport”函数进行配置。

        本文仅配置了串口号及波特率,其余的均设置为默认值。

        使用该函数配置的串口可以配合“read”函数进行串口数据的读取,该函数是一次读取一个字节,并将每个字节解释为一个 8 位无符号整数 (uint8),最后返回一个 double 数组(返回的类型和接收的长度可以自己设置)。这边的逻辑就是接收到指定长度才会停止接收。如图所示,代码中设置的300,所以工作区data矩阵的长度是300。

        MATLAB串口通讯实验(一) 第3张

        第二种方式是采用“serial”函数进行配置,该函数的使用方式和“serialport”是不一样的,其配置方式详见代码,关键参数是等待时间及输入缓冲区的大小。和“serial”不一致的地方在于,这两个参数任意一个到达预设值,都会停止采集,例如:等待时间10s,但是缓冲区大小仅为5,那么在接收到5个字节后就会停止接收数据,又或者等待时间1s,缓冲区大小为50000,那么在接收到1s数据后就会停止,并不会等待缓冲区塞满。

        假设参照代码执行的话最终会接收到245个字节

        MATLAB串口通讯实验(一) 第4张

        注意:使用完串口一定要记得删除串口的占用,否则后续使用虚拟串口驱动删除串口是删除不了的。

        Step 2. 数据处理

        由于MATLAB在接收到数据后是直接按照10进制进行展示的,而此处的串口助手在发送数据时则是按照字符进行发送。为了清晰地展示数据还需要进行相应的处理。例如上文发送的是4 6 8 10 12 14 16 18 20 18 16 14 12 10 8 6 4 2,那么MATLAB接收到数据则是52 32 54 32 56 32 …,这边转换规则是按照ASCII表进行,具体如下图所示:

        MATLAB串口通讯实验(一) 第5张

        52对应的是4,32对应的是空格,54对应的6…,所以需要按照相应的规则将数据进行解析处理,我这边写的处理代码如下:

        %% 串口数据解析及展示
        line = 1;
        colum = 1;
        for i = 1 : length(data)
            if (data(i) == 13 || data(i) == 10) %排除换行及回车
               continue; 
            end
            
            if (data(i) == 32)                  %空格间隔数据
               line = line + 1; 
               colum = 1;
               continue;
            end
            
            Data_matrix(line , colum) = data(i);
            colum = colum + 1;
        end
        for i = 1 : size(Data_matrix,1)
            for j = 1 : 2
                Data_matrix(i,j) = Data_matrix(i,j) - 48;
            end
        end
        Data_real(size(Data_matrix,1),1) = 0;
        for i = 1 : size(Data_matrix,1)
            if (Data_matrix(i,2) == -48)
                Data_real(i,1) = Data_real(i,1) + Data_matrix(i,1);
            else
                Data_real(i,1) = Data_matrix(i,2) + Data_matrix(i,1) * 10;
            end   
        end
        figure;
        plot(Data_real);
        xlabel('Serial Number');ylabel('Amplitude')
        

        最终可以成功将发送的数据成功接收并进行绘制展示,具体如下图所示:

        MATLAB串口通讯实验(一) 第6张

        实验结束

        在测试完成后记得删除串口占用并删除配置的虚拟串口。

        总结

        本文介绍了两种方式进行串口的配置,并通过仿真详细展示了具体的操作步骤,下一篇文章将展示如何利用MATLAB充当便携的上位机来发送指定的数据,从而可以配合相应的移动设备实现相应的功能。


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]