|
串口接收程序:function Serial() %创建函数
delete(instrfindall); %先关闭串口,否则可能导致出错
global x %全局变量,供串口中断函数使用
global t; %全局变量,这里根据需要绘制图形的个人需要而设
global m;
global i;
t = [0]; %时间轴
m = [0]; %数据轴
i = 0; %用于计数
p = plot(t,m);
axis([i-50 i+50 -1 10]);
grid on;
%%----------------------------配置部分----------------------------
%创建串口对象,直接在命令框输入serial('com1')可查看串口参数
x = serial('com4');
%设置或修改串口通信参数
set(x,'BaudRate',115200);
%设置中断触发方式
set(x,'BytesAvailableFcnMode','Terminator') %ASCII触发,字符触发
set(x,'Terminator','CR/LF') %接收到\r\n后触发中断
% set(x,'BytesAvailableFcnMode','byte') %数据触发,根据发送来的数据长度来触发中断
% set(x,'BytesAvailableFcnCount',1)
x.BytesAvailableFcn = @Callback %定义中断响应函数对象,类似于中断函数名
fopen(x); %打开串口,类似于开关
fwrite(x,255); %发送握手信号0xff,stm32接收到后开始回传数据
pause %需要暂停,来接收回传数据
fclose(x);
end
串口中断服务子程序:
function Callback(obj,event) %创建中断服务函数,绘制图像
global t; %时间
global m; %纵坐标
global i; %时间变化值
%
if i<3000
out = fscanf(obj);
data = str2num(out) %将接收到的字符转换为数值
save('a.mat','data','-ascii','-append');
% x=load('a.mat','-ascii');
% out=fread(obj,5,'uint32');
% data = str2num(out)
%%----------------------以下根据需要自行编写-------------------------------
t = [t i];
m = [m data];
plot(t,m)
xlabel('t');
ylabel('data');
axis([i-50 i+50 0 3.3]);
grid on;
i=i+1;
end
end
对数据进行FFT处理:
% clear all
% close all
% clc
%% Parameter Interface
SampleFre = 1000; %采样频率
SignalData=load('a.mat','-ascii');
% SignalLen = 20000; %数据长度
SignalLen=length(SignalData);
%% Main
%--------------------------------------------------------------------------------------
t = (0:SignalLen-1)/SampleFre; %时间
% SignalData = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); %采样频率>2倍信号最大频率
NoiseData = 2*randn(size(t));
SignalAddNoiseData = SignalData + NoiseData;
plot(1000*t(1:50),SignalAddNoiseData(1:50))
title('信号添加随机噪声')
xlabel('t(毫秒)')
%--------------------------------------------------------------------------------------
FFTData = fft(SignalAddNoiseData);
FFTAmplitude0 = abs(FFTData)/SignalLen; %频谱关于SignalLen/2对称
FFTAmplitude1 = FFTAmplitude0(1:SignalLen/2);
FFTAmplitude0(2:end) = 2*FFTAmplitude0(2:end); %复数域的幅值需要进行变换才能与时域的幅值对应
FFTAmplitude1(2:end) = 2*FFTAmplitude1(2:end);
Frequence0 = SampleFre*(0:(SignalLen-1))/SignalLen;
Frequence1 = SampleFre*((0:(SignalLen/2)-1))/SignalLen;
subplot(2,1,1)
plot(Frequence0,FFTAmplitude0)
title('双边频谱')
xlabel('f(Hz)')
ylabel('FFTAmplitude')
subplot(2,1,2)
plot(Frequence1,FFTAmplitude1)
title('单边频谱')
xlabel('f(Hz)')
ylabel('FFTAmplitude')
|
-
-
mat.zip
11.55 KB, 下载次数: 46, 下载积分: 黑币 -5
内含三个matlab子程序
评分
-
查看全部评分
|