V7-203_Matlab串口波形刷新和數(shù)據分析m文件
- % ********************************************************************************************************************
- % ********************************************************************************************************************
- close all
- clear all
- %刪除所有已經打開的串口,這條很重要,防止之前運行沒有關閉串口
- delete(instrfindall);
- %打開串口COM1,波特率115200,8位數(shù)據位,1位停止位,無奇偶校驗,無流控制
- s = serial('COM1', 'BaudRate', 115200, 'DataBits', 8, 'StopBits', 1, 'Parity', 'none', 'FlowControl', 'none');
- s.ReadAsyncMode = 'continuous';
- fopen(s);
- fig = figure(1);
- % ********************************************************************************************************************
- AxisMax = 65536; %坐標軸最大值
- AxisMin = -65536; %坐標軸最小值
- window_width = 800; %窗口寬度
- g_Count =0; %接收到的數(shù)據計數(shù)
- SOF = 0; %同步幀標志
- AxisValue = 1; %坐標值
- RecDataDisp = zeros(1,100000); %開辟100000個數(shù)據單元,用于存儲接收到的數(shù)據。
- RecData = zeros(1,100); %開辟100個數(shù)據單元,用于數(shù)據處理。
- Axis = zeros(1,100000); %開辟100000個數(shù)據單元,用于X軸。
- window = window_width * (-0.9); %窗口X軸起始坐標
- axis([window, window + window_width, AxisMin, AxisMax]); %設置窗口坐標范圍
- %子圖1顯示串口上傳的數(shù)據
- subplot(2,1,1);
- grid on;
- title('串口數(shù)據接收');
- xlabel('時間');
- ylabel('數(shù)據');
- %子圖2顯示波形的幅頻響應
- subplot(2,1,2);
- grid on;
- title( 'FFT');
- xlabel( '頻率');
- ylabel( '幅度');
- Fs = 100; % 采樣率
- N = 50; % 采樣點數(shù)
- n = 0:N-1; % 采樣序列
- f = n * Fs / N; %真實的頻率
- % ********************************************************************************************************************
- while ishandle(fig)
-
- %設置同步信號標志, = 1表示接收到下位機發(fā)送的同步幀
- SOF = 0;
-
- %發(fā)送同步幀
- fwrite(s, 13);
-
- %獲取是否有數(shù)據
- bytes = get(s, 'BytesAvailable');
- if bytes == 0
- bytes = 1;
- end
-
- %讀取下位機返回的所有數(shù)據
- RecData = fread(s, bytes, 'uint8');
-
- %檢索下位機返回的數(shù)據中是否有字符$
- StartData = find(RecData == 13);
-
- %如果檢索到$,讀取10個字節(jié)的數(shù)據,也就是5個uint16的數(shù)據
- if(StartData >= 1)
- RecData = fread(s, 5, 'uint16');
- SOF =1;
- StartData = 0;
- end
-
- %更新接收到的數(shù)據波形
- if(SOF == 1)
- %更新數(shù)據
- RecDataDisp(AxisValue) = RecData(1);
- RecDataDisp(AxisValue + 1) = RecData(2);
- RecDataDisp(AxisValue + 2) = RecData(3);
- RecDataDisp(AxisValue + 3) = RecData(4);
- RecDataDisp(AxisValue + 4) = RecData(5);
-
- %更新X軸
- Axis(AxisValue) = AxisValue;
- Axis(AxisValue + 1) = AxisValue + 1;
- Axis(AxisValue + 2) = AxisValue + 2;
- Axis(AxisValue + 3) = AxisValue + 3;
- Axis(AxisValue + 4) = AxisValue + 4;
- %更新變量
- AxisValue = AxisValue + 5;
- g_Count = g_Count + 5;
-
- %繪制波形
- subplot(2,1,1);
- plot(Axis(1:AxisValue-1), RecDataDisp(1:AxisValue-1), 'r');
- window = window + 5;
- axis([window, window + window_width, AxisMin, AxisMax]);
- grid on;
- title('串口數(shù)據接收');
- xlabel('時間');
- ylabel('數(shù)據');
- drawnow
- end
-
- if(g_Count== 50)
- subplot(2,1,2);
- %對原始信號做 FFT 變換
- y = fft(RecDataDisp(AxisValue-50:AxisValue-1), 50);
-
- %求 FFT 轉換結果的模值
- Mag = abs(y)*2/N;
-
- %繪制幅頻相應曲線
- plot(f, Mag, 'r');
- grid on;
- title( 'FFT');
- xlabel( '頻率');
- ylabel( '幅度');
- g_Count = 0;
- drawnow
- end
- end
- fclose(s);
- delete(s);
- % ********************************************************************************************************************
復制代碼
|