matlab+stm32通讯,matlab与stm32之间利用串口通信记录
1、涉及到的函數
serial,fopen,fclose,
instrfindall,instrhwinfo,
fprintf,fscanf,fwrite,fread,isempty
1.1 串口函數
scom = serial('com6','BaudRate',115200,'BytesAvailableFcnMode','byte');
fopen(scom);
.
fclose(scom);
或者對串口屬性單獨設置,如下:
scom = serial(com);
scom.BaudRate = 115200;
scom.InputBufferSize = 512;
scom.BytesAvailableFcnMode = 'terminator'; % 'byte'
scom.terminator = CR/LF ;
scom.Timeout = 50; %read or write wait time
fopen(scom);
.
fclose(scom);
通常會在關閉串口后刪除串口,在matlab工作空間中清除串口數據:
delete(scom);
clear scom;
問題1.:matlab剛打開后,第一次可以成功打開串口,第二次再打開就會報錯如下:
>> scom = serial('com6','BaudRate',115200,'BytesAvailableFcnMode','byte');
>> fopen(scom)
Error using serial/fopen (line 72)
Open failed: Port: COM6 is not
available. Available ports: COM1.
Use INSTRFIND to determine if other
instrument objects are connected to the
requested device.
處理方法:個人理解是關閉串口后,串口并沒有被完全清理,就像有些軟件卸載后第二次再安裝就會失敗,所以需要在重新打開串口之前刪除之前對串口的所有設置,如下:
>> scom = serial('com6','BaudRate',115200,'BytesAvailableFcnMode','byte');
>> fopen(scom);
Error using serial/fopen (line 72)
Open failed: Port: COM6 is not
available. Available ports: COM1.
Use INSTRFIND to determine if other
instrument objects are connected to the
requested device.
>> delete(instrfindall('Type','serial'));
>> scom = serial('com6','BaudRate',115200,'BytesAvailableFcnMode','byte');
>> fopen(scom);
>> fclose(scom)
>> help instrfindall
instrfindall Find all communication interface objects with specified
property values.
instrfindall函數可以找出所有與matlab通信的接口,也可以找出符合特定參數的接口。
1.2 serial 參數理解
通過>> s=get(scom) 可以過得串口的所有參數以及當前的值,其中主要設置的有:
BaudRate,波特率
ByteOrder,數據大端或者小端模式,默認小段
DataBits,數據位,通常默認8位
Parity,校驗位,默認none
StopBits,停止位,默認1
Timeout,matlab串口發送或者讀取數據等待時長
ReadAsyncMode,異步讀取數據的方式,連續或者手動,默認連續continue
----------
BytesAvailableFcnMode
BytesAvailableFcnCount
BytesAvailableFcn
Terminator
BytesAvailable
表示數據有效的觸發方式,相當于c中的中斷觸發事件:默認值terminator,表示串口接收到特定的終止符時,觸發bytes-available event,參數自動加一,并進入由指向的回調函數,相當于c中的中斷函數;可選值byte,表示串口收到一個字節時,觸發bytes-available event,自動加一,當收到
個字節時進入回調函數。
終止符通常是回車或者換行符,也可以自己設定,根據通信協議自定義,[Windows、Linux和MAC的CR, LF, CR/LF換行符](http://blog.csdn.net/cckit/article/details/41604771)。
matlab搜索可用串口端口函數instrhwinfo :
>> info = instrhwinfo('serial')
info =
HardwareInfo with properties:
AvailableSerialPorts: {2x1 cell}
JarFileVersion: 'Version 3.7'
ObjectConstructorName: {2x1 cell}
SerialPorts: {2x1 cell}
Access to your hardware may be provided by a support package. Go to the Support Package Installer to learn more.
>> info.SerialPorts
ans =
'COM1'
'COM6'
>> info.AvailableSerialPorts
ans =
'COM1'
'COM6'
>> str = char(info.SerialPorts(2))
str =
COM6
>> scom=serial(str);
我在電腦設備管理器查看,用的是串口’COM6’, ‘COM1’還不知道時接的是什么,所以這里想用matlab自動選擇串口的功能還沒有實現。
1.3 數據讀寫函數
matlab:
fprintf(scom,'%d\n', data,'async' );
data = fscanf(scom,'%d');
c:
scanf("%d",&data);
printf("%d\r\n",data);
note1:c中scanf、printf函數默認從終端打印讀取數據,這里需要重定向fputc、fgetc函數。
note2:c中scanf函數在讀取到有效數據前會一直運行不退出。
問題2:在stm32的串口中斷函數中調用scanf函數,讀取matlab發送的數據,matlab中用fprintf(scom,’%d\r\n’, data,’async’ )發送數據,當stm32進入中斷讀取數據后,總是會再次進入中斷并進入scanf函數出不來。
處理方法:matlab中發送數據的格式 '%d\r\n',即回車加換行,個人理解是串口發送完一字節后也把'\r'即 回車符也發送出去,所以stm32的串口接收緩存中scanf函數讀取數據后,由回車符又引起接收中斷。
將matlab發送函數中數據格式改為'%d\n' 后,stm32可以正常讀取數據。
matlab:
fwrite(scom,data,'uint8','async');
cmd_ack = fread(scom,1,'uint8');
c:
rec = USART_ReceiveData( DEBUG_USART );
Usart_SendByte(DEBUG_USART,data);
note1:fwrite和fread是以二進制的格式發送數據,而上面的fprintf和fscanf是以ASCII碼的格式發送。
例如:data為十進制數123,其十六進制為0x7b,底層二進制數據流就是0111 1011,以ASCII碼發送是0x31,0x32,0x33,底層數據流是0011 0001,0011 0010,0011 0011。
matlab如果用fwrite和fread函數,串口參數也要改為byte。
記錄時間:2017.12.10 晚
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的matlab+stm32通讯,matlab与stm32之间利用串口通信记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: it 部门的建议_应对IT项目阻力的8个
- 下一篇: matlab7.0停止工作,matlab