找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2541|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

Matlab串口波形刷新和數(shù)據(jù)分析m文件

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:420572 發(fā)表于 2021-9-25 11:58 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
V7-203_Matlab串口波形刷新和數(shù)據(jù)分析m文件
  1. % ********************************************************************************************************************
  2. % ********************************************************************************************************************
  3. close all
  4. clear all

  5. %刪除所有已經(jīng)打開的串口,這條很重要,防止之前運(yùn)行沒(méi)有關(guān)閉串口
  6. delete(instrfindall);  

  7. %打開串口COM1,波特率115200,8位數(shù)據(jù)位,1位停止位,無(wú)奇偶校驗(yàn),無(wú)流控制
  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;    %坐標(biāo)軸最大值
  14. AxisMin = -65536;    %坐標(biāo)軸最小值
  15. window_width = 800;  %窗口寬度

  16. g_Count =0;          %接收到的數(shù)據(jù)計(jì)數(shù)
  17. SOF = 0;             %同步幀標(biāo)志
  18. AxisValue = 1;       %坐標(biāo)值
  19. RecDataDisp = zeros(1,100000); %開辟100000個(gè)數(shù)據(jù)單元,用于存儲(chǔ)接收到的數(shù)據(jù)。
  20. RecData = zeros(1,100);        %開辟100個(gè)數(shù)據(jù)單元,用于數(shù)據(jù)處理。
  21. Axis = zeros(1,100000);        %開辟100000個(gè)數(shù)據(jù)單元,用于X軸。

  22. window = window_width * (-0.9); %窗口X軸起始坐標(biāo)
  23. axis([window, window + window_width, AxisMin, AxisMax]); %設(shè)置窗口坐標(biāo)范圍

  24. %子圖1顯示串口上傳的數(shù)據(jù)
  25. subplot(2,1,1);
  26. grid on;
  27. title('串口數(shù)據(jù)接收');
  28. xlabel('時(shí)間');
  29. ylabel('數(shù)據(jù)');

  30. %子圖2顯示波形的幅頻響應(yīng)
  31. subplot(2,1,2);
  32. grid on;
  33. title( 'FFT');
  34. xlabel( '頻率');
  35. ylabel( '幅度');

  36. Fs = 100;        % 采樣率
  37. N = 50;         % 采樣點(diǎn)數(shù)
  38. n = 0:N-1;      % 采樣序列
  39. f = n * Fs / N; %真實(shí)的頻率

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

  41. while ishandle(fig)
  42.    
  43.     %設(shè)置同步信號(hào)標(biāo)志, = 1表示接收到下位機(jī)發(fā)送的同步幀
  44.     SOF = 0;  
  45.    
  46.     %發(fā)送同步幀
  47.     fwrite(s, 13);
  48.    
  49.     %獲取是否有數(shù)據(jù)
  50.     bytes = get(s, 'BytesAvailable');
  51.     if bytes == 0
  52.          bytes = 1;
  53.     end
  54.    
  55.     %讀取下位機(jī)返回的所有數(shù)據(jù)
  56.     RecData = fread(s, bytes, 'uint8');
  57.    
  58.     %檢索下位機(jī)返回的數(shù)據(jù)中是否有字符$
  59.     StartData = find(RecData == 13);
  60.    
  61.     %如果檢索到$,讀取10個(gè)字節(jié)的數(shù)據(jù),也就是5個(gè)uint16的數(shù)據(jù)
  62.     if(StartData >= 1)
  63.         RecData = fread(s, 5, 'uint16');
  64.         SOF =1;
  65.         StartData = 0;
  66.     end
  67.    
  68. %更新接收到的數(shù)據(jù)波形
  69. if(SOF == 1)
  70.         %更新數(shù)據(jù)
  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('串口數(shù)據(jù)接收');
  94.         xlabel('時(shí)間');
  95.         ylabel('數(shù)據(jù)');
  96.         drawnow
  97. end
  98.    
  99. if(g_Count== 50)
  100.    subplot(2,1,2);
  101.    %對(duì)原始信號(hào)做 FFT 變換
  102.    y = fft(RecDataDisp(AxisValue-50:AxisValue-1), 50);
  103.    
  104.    %求 FFT 轉(zhuǎn)換結(jié)果的模值
  105.    Mag = abs(y)*2/N;  
  106.    
  107.    %繪制幅頻相應(yīng)曲線
  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. % ********************************************************************************************************************
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表