找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1736|回复: 0
打印 上一主题 下一主题
收起左侧

Matlab串口波形刷新和数据分析m文件

[复制链接]
跳转到指定楼层
楼主
ID:420572 发表于 2021-9-25 11:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
V7-203_Matlab串口波形刷新和数据分析m文件
  1. % ********************************************************************************************************************
  2. % ********************************************************************************************************************
  3. close all
  4. clear all

  5. %删除所有已经打开的串口,这条很重要,防止之前运行没有关闭串口
  6. delete(instrfindall);  

  7. %打开串口COM1,波特率115200,8位数据位,1位停止位,无奇偶校验,无流控制
  8. s = serial('COM1', 'BaudRate', 115200, 'DataBits', 8, 'StopBits', 1, 'Parity', 'none', 'FlowControl', 'none');
  9. s.ReadAsyncMode = 'continuous';
  10. fopen(s);

  11. fig = figure(1);

  12. % ********************************************************************************************************************
  13. AxisMax =  65536;    %坐标轴最大值
  14. AxisMin = -65536;    %坐标轴最小值
  15. window_width = 800;  %窗口宽度

  16. g_Count =0;          %接收到的数据计数
  17. SOF = 0;             %同步帧标志
  18. AxisValue = 1;       %坐标值
  19. RecDataDisp = zeros(1,100000); %开辟100000个数据单元,用于存储接收到的数据。
  20. RecData = zeros(1,100);        %开辟100个数据单元,用于数据处理。
  21. Axis = zeros(1,100000);        %开辟100000个数据单元,用于X轴。

  22. window = window_width * (-0.9); %窗口X轴起始坐标
  23. axis([window, window + window_width, AxisMin, AxisMax]); %设置窗口坐标范围

  24. %子图1显示串口上传的数据
  25. subplot(2,1,1);
  26. grid on;
  27. title('串口数据接收');
  28. xlabel('时间');
  29. ylabel('数据');

  30. %子图2显示波形的幅频响应
  31. subplot(2,1,2);
  32. grid on;
  33. title( 'FFT');
  34. xlabel( '频率');
  35. ylabel( '幅度');

  36. Fs = 100;        % 采样率
  37. N = 50;         % 采样点数
  38. n = 0:N-1;      % 采样序列
  39. f = n * Fs / N; %真实的频率

  40. % ********************************************************************************************************************

  41. while ishandle(fig)
  42.    
  43.     %设置同步信号标志, = 1表示接收到下位机发送的同步帧
  44.     SOF = 0;  
  45.    
  46.     %发送同步帧
  47.     fwrite(s, 13);
  48.    
  49.     %获取是否有数据
  50.     bytes = get(s, 'BytesAvailable');
  51.     if bytes == 0
  52.          bytes = 1;
  53.     end
  54.    
  55.     %读取下位机返回的所有数据
  56.     RecData = fread(s, bytes, 'uint8');
  57.    
  58.     %检索下位机返回的数据中是否有字符$
  59.     StartData = find(RecData == 13);
  60.    
  61.     %如果检索到$,读取10个字节的数据,也就是5个uint16的数据
  62.     if(StartData >= 1)
  63.         RecData = fread(s, 5, 'uint16');
  64.         SOF =1;
  65.         StartData = 0;
  66.     end
  67.    
  68. %更新接收到的数据波形
  69. if(SOF == 1)
  70.         %更新数据
  71.         RecDataDisp(AxisValue) =  RecData(1);
  72.         RecDataDisp(AxisValue + 1) =  RecData(2);
  73.         RecDataDisp(AxisValue + 2) =  RecData(3);
  74.         RecDataDisp(AxisValue + 3) =  RecData(4);
  75.         RecDataDisp(AxisValue + 4) =  RecData(5);
  76.        
  77.         %更新X轴
  78.         Axis(AxisValue) = AxisValue;
  79.         Axis(AxisValue + 1) = AxisValue + 1;
  80.         Axis(AxisValue + 2) = AxisValue + 2;
  81.         Axis(AxisValue + 3) = AxisValue + 3;
  82.         Axis(AxisValue + 4) = AxisValue + 4;

  83.         %更新变量
  84.         AxisValue = AxisValue + 5;
  85.         g_Count = g_Count + 5;
  86.        
  87.         %绘制波形
  88.         subplot(2,1,1);
  89.         plot(Axis(1:AxisValue-1),  RecDataDisp(1:AxisValue-1), 'r');
  90.         window = window + 5;
  91.         axis([window, window + window_width, AxisMin, AxisMax]);
  92.         grid on;
  93.         title('串口数据接收');
  94.         xlabel('时间');
  95.         ylabel('数据');
  96.         drawnow
  97. end
  98.    
  99. if(g_Count== 50)
  100.    subplot(2,1,2);
  101.    %对原始信号做 FFT 变换
  102.    y = fft(RecDataDisp(AxisValue-50:AxisValue-1), 50);
  103.    
  104.    %求 FFT 转换结果的模值
  105.    Mag = abs(y)*2/N;  
  106.    
  107.    %绘制幅频相应曲线
  108.    plot(f, Mag, 'r');
  109.    grid on;
  110.    title( 'FFT');
  111.    xlabel( '频率');
  112.    ylabel( '幅度');
  113.    g_Count = 0;
  114.    drawnow
  115. end

  116. end

  117. fclose(s);
  118. delete(s);

  119. % ********************************************************************************************************************
复制代码


评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表