数字信号采集
从电脑COM2口读取数据,并将数据保存在TXT文件中,方便数据分析,下面是M脚本:
%名称:Matlab串口-Lab1
%描述:串口读,并写入txt文件中
s=serial(‘com2’);
s.BytesAvailableFcnMode=‘byte’;%串口设置
s.InputBufferSize=4096;
s.OutputBufferSize=1024;
s.BytesAvailableFcnCount=100;
s.ReadAsyncMode=‘continuous’;
s.Terminator=‘CR’;
fopen(s);%打开串口
out=fread(s,10,‘uint8’);%一次读出10个字符
fprintf(‘%3c’,out);%一个字符占三位输出,%c字符,%d整型
fid=fopen(‘serial_data.txt’,‘w+’);%‘a+’读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之
fprintf(fid,‘%3c’,out);%写入文件中
fclose(fid);
fclose(s);
delete(s);
%打开串口
functionscom=OpenSerial(sname,HReadFcn)
scom=serial(sname);
scom.BytesAvailableFcnMode=‘terminator’;
scom.Terminator=‘。’;
scom.BytesAvailableFcn=HReadFcn;
try
fopen(scom);
catcherr
fprintf(‘%s打开失败。\n’,sname);
end
fprintf(‘%s成功打开。\n’,sname);
end
%写串口
functionWriteSerial(scom,str)
fprintf(scom,str,‘async’);%异步方式
end
%读串口回调函数
functionReadFcn_Com2(obj,~)
n=get(obj,‘BytesAvailable’);
ifn
a=fread(obj,n,‘uchar’);
c=char(a‘);
fprintf(’%s\n‘,c);
end
end
%关闭串口
functionCloseSerial(scom)
try
fclose(scom);
catcherr
fprintf(’%s关闭失败。‘,scom.Name);
return
end
delete(scom);
end
在matlab命令框中如下输入命令打开串口com2
》》scom=OpenSerial(‘com2’,@ReadFcn_Com2);
com2成功打开。
向com2写
》》WriteSerial(scom,‘Hello!’);
串口调试助手收到信息
用串口调试助手回复matlab,点上图中的手动发送(发送的信息已英文句号。结束),matlab中收到信息
Hello,Matlab.
》》
关闭串口
》》CloseSerial(scom)
9
底层stm32利用下面格式发送数据
sprintf(uartdata,“%2.4f”,adcdata);
UARTprintf(uartdata);
UARTprintf(“=”);
matlab利用如下程序接收数据
%在matlab命令框中如下输入命令打开串口com2
%scom=OpenSerial(‘com2’,@ReadFcn_Com2);
%输入如下命令发送数据
%WriteSerial(scom,‘Hello!’);
%在如下函数中更改数据处理方式
%ReadFcn_Com2.m
%输入如下命令关闭串口
%CloseSerial(scom);
%打开串口
functionscom=OpenSerial(sname,HReadFcn)
scom=serial(sname);
scom.BaudRate=9600;
scom.BytesAvailableFcnMode=‘terminator’;
scom.Terminator=‘=’;
scom.BytesAvailableFcn=HReadFcn;
try
fopen(scom);
catcherr
fprintf(‘%s打开失败。\n’,sname);
end
fprintf(‘%s成功打开。\n’,sname);
end
WriteSerial.m
%写串口
functionWriteSerial(scom,str)
fprintf(scom,str,‘async’);%异步方式
end
ReadFcn_Com2.m
%读串口回调函数
functionReadFcn_Com2(obj,~)
n=get(obj,‘BytesAvailable’);
ifn》6
a=fread(obj,n,‘uchar’);
c=char(a(end-5:end-1));
x=num2double(c);
fprintf(‘%f\n’,x);
end
end12345678910
CloseSerial.m
%关闭串口
functionCloseSerial(scom)
try
fclose(scom);
catcherr
fprintf(‘%s关闭失败。’,scom.Name);
return
end
delete(scom);
end
需要注意的是,当stm32发送数据过快时,接收缓冲区会有过多数据,本文中只使用了n》6的判断,当数据长度变化的时候会有问题。所以stm32最好指定好数据的长度。
matlab默认的结束符是两个字节{LF,LF},前一个字节是读取结束符,第二个字节是发送结束符。stm32可以通过UARTprintf(“%f\n”,x);来发送数据,这样matlab就不用更改结束符。
全部0条评论
快来发表一下你的评论吧 !