1、實驗1:
從電腦COM2口讀取數(shù)據(jù),并將數(shù)據(jù)保存在TXT文件中,方便數(shù)據(jù)分析,下面是M腳本:
%名稱:Matlab串口-Lab1
%描述:串口讀,并寫入txt文件中
s=serial(‘com2’);
s.BytesAvailableFcnMode=‘byte’;%串口設(shè)置
s.InputBufferSize=4096;
s.OutputBufferSize=1024;
s.BytesAvailableFcnCount=100;
s.Terminator=‘CR’;
fopen(s);%打開串口
out=fread(s,10,‘uint8’);%一次讀出10個字符
fprintf(‘%3c’,out);%一個字符占三位輸出,%c字符,%d整型
fid=fopen(‘serial_data.txt’,‘w+’);%‘a(chǎn)+’讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之
fprintf(fid,‘%3c’,out);%寫入文件中
fclose(fid);
fclose(s);
delete(s);
2、實驗2:
同樣的功能,用函數(shù)寫更規(guī)范,代碼如下:
%打開串口
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,‘a(chǎn)sync’);%異步方式
end
%讀串口回調(diào)函數(shù)
functionReadFcn_Com2(obj,~)
n=get(obj,‘BytesAvailable’);
ifn
a=fread(obj,n,‘uchar’);
c=char(a‘);
fprintf(’%s\n‘,c);
end
end
%關(guān)閉串口
functionCloseSerial(scom)
try
fclose(scom);
catcherr
fprintf(’%s關(guān)閉失敗。‘,scom.Name);
return
end
delete(scom);
end
仿真如下,使用虛擬串口連接串口2和3,打開串口調(diào)試助手,以默認(rèn)方式打開com3
在matlab命令框中如下輸入命令打開串口com2
》》scom=OpenSerial(‘com2’,@ReadFcn_Com2);
com2成功打開。
向com2寫
》》WriteSerial(scom,‘Hello!’);
串口調(diào)試助手收到信息
用串口調(diào)試助手回復(fù)matlab,點上圖中的手動發(fā)送(發(fā)送的信息已英文句號。結(jié)束),matlab中收到信息
Hello,Matlab.
》》
關(guān)閉串口
》》CloseSerial(scom)
9
3、matlab串口采集數(shù)據(jù)
底層stm32利用下面格式發(fā)送數(shù)據(jù)
sprintf(uartdata,“%2.4f”,adcdata);
UARTprintf(uartdata);
UARTprintf(“=”);
matlab利用如下程序接收數(shù)據(jù)
%在matlab命令框中如下輸入命令打開串口com2
%scom=OpenSerial(‘com2’,@ReadFcn_Com2);
%輸入如下命令發(fā)送數(shù)據(jù)
%WriteSerial(scom,‘Hello!’);
%在如下函數(shù)中更改數(shù)據(jù)處理方式
%ReadFcn_Com2.m
%輸入如下命令關(guān)閉串口
%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,‘a(chǎn)sync’);%異步方式
end
ReadFcn_Com2.m
%讀串口回調(diào)函數(shù)
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
%關(guān)閉串口
functionCloseSerial(scom)
try
fclose(scom);
catcherr
fprintf(‘%s關(guān)閉失敗?!?,scom.Name);
return
end
delete(scom);
end
需要注意的是,當(dāng)stm32發(fā)送數(shù)據(jù)過快時,接收緩沖區(qū)會有過多數(shù)據(jù),本文中只使用了n》6的判斷,當(dāng)數(shù)據(jù)長度變化的時候會有問題。所以stm32最好指定好數(shù)據(jù)的長度。
matlab默認(rèn)的結(jié)束符是兩個字節(jié){LF,LF},前一個字節(jié)是讀取結(jié)束符,第二個字節(jié)是發(fā)送結(jié)束符。stm32可以通過UARTprintf(“%f\n”,x);來發(fā)送數(shù)據(jù),這樣matlab就不用更改結(jié)束符。
評論