????????最近幾個(gè)月,DIY了塊板子,選用的芯片是STM32F407,該板子與上位機(jī)(也就是電腦)的通訊方式有兩種,一是用串口發(fā)送程序進(jìn)程數(shù)據(jù),二是用網(wǎng)口發(fā)送原始數(shù)據(jù)。在調(diào)試時(shí),需要用XCOM接收串口信息、用XNET接收網(wǎng)口信息。由于這塊板子是用來學(xué)術(shù)研究的,數(shù)據(jù)每次都要拷到MATLAB中分析,非常的不方便。于是想一步到位,使用 MATLAB App 制作一個(gè)GUI實(shí)現(xiàn)與單片機(jī)的交互。
????????本系列文檔將記錄該用戶界面的搭建過程,本人才疏學(xué)淺,如有錯(cuò)誤,還請(qǐng)指正,廢話不多說,直接上本人的移植記錄。
一、 MATLAB App設(shè)計(jì)
????????首先打開MATLAB軟件,在命令行窗口輸入“appdesigner” 打開MATLAB App,該界面還是很友好的,如下圖所示,用“文本區(qū)域”、“下拉框”、“按鈕”組件簡(jiǎn)單搭建了一個(gè)界面。
?????????網(wǎng)上有不少關(guān)于MATLAB與單片機(jī)的串口通訊介紹資料,講的也很詳細(xì)。MATLAB :【11】一文帶你讀懂serialport串口收發(fā)原理與實(shí)現(xiàn)_Alex-YiWang的博客-CSDN博客https://blog.csdn.net/Alex497259/article/details/125922427
? ? ? ? ?但有一個(gè)很奇怪的Bug,在 MATLAB App 中,不管是用 serial 還是 serialport 函數(shù),串口始終跳不進(jìn)回調(diào)函數(shù),同樣的代碼在.m文件卻可以正常運(yùn)行。本人能力有限,哪位大佬知道原因還請(qǐng)告知。
? ? ? ? 不斷調(diào)試,最終選擇了用 serial 函數(shù)加上輪詢實(shí)現(xiàn)與單片機(jī)的交互,所設(shè)計(jì)的串口函數(shù)代碼如下:
properties (Access = public)
USART_SerialObj % 串口結(jié)構(gòu)體
end
methods (Access = private)
%=========================串口初始化函數(shù)==========================
function USART_startSerial(app, ~)
delete(instrfindall); %刪除串口
app.USART_SerialObj = serial('COM4','BaudRate',115200,'StopBits',1,'Parity','none'); %新建串口
fopen(app.USART_SerialObj); %打開串口
fprintf(app.USART_SerialObj, '%s', 'USART_OK'); %發(fā)送握手信息
end
%======================串口接收回調(diào)函數(shù)輪詢=======================
function USART_readSerial(app,~)
while app.USART_SerialObj.BytesAvailable == 0 % 循環(huán)檢查串口是否有新數(shù)據(jù)
pause(0.1);
end
data = fread(app.USART_SerialObj, app.USART_SerialObj.BytesAvailable, 'char'); % 讀取串口接收到的數(shù)據(jù)
app.USART_Rev_Data.Value = [app.USART_Rev_Data.Value;convertCharsToStrings(char(data'))]; % 顯示接收到的數(shù)據(jù) 讀者根據(jù)自身代碼修改
app.USART_readSerial(); % 繼續(xù)循環(huán)讀取數(shù)據(jù)
end
end
二、單片機(jī)程序設(shè)計(jì)
????????單片機(jī)上的串口按正常流程調(diào)用串口初始化函數(shù),這里我添加的了一個(gè)握手信號(hào),握手程序的代碼如下:
u8 USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個(gè)字節(jié).
//接收狀態(tài)
//bit15, 接收完成標(biāo)志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字節(jié)數(shù)目
u16 USART_RX_STA = 0; //接收狀態(tài)標(biāo)記
#define PHY_USART_PC_HANDSHAKE "USART_OK" //定義上位機(jī)握手信號(hào)
//串口上位機(jī)握手
unsigned char PhyUart_PC_handshake(void)
{
u8 len,t;
char data_Rev[16];
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的數(shù)據(jù)長(zhǎng)度
for(t = 0;t<len;t++)
data_Rev[t] = USART_RX_BUF[t];
for(t = len;t<16;t++)
data_Rev[len] = '\0';
if(strcmp(data_Rev,PHY_USART_PC_HANDSHAKE) == 0) //與上手機(jī)握手驗(yàn)證
{
USART_RX_STA=0;
return 1;
}
else
{
USART_RX_STA=0;
return 0;
}
}
}
三、程序運(yùn)行效果
????????板子連接上電腦,選擇好串口和波特率,點(diǎn)擊連接,串口成功接收到了板子發(fā)送來的信息。文章來源:http://www.zghlxwxcb.cn/news/detail-696764.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-696764.html
到了這里,關(guān)于基于MATLAB App搭建STM32用戶交互界面(1)——MATLAB與STM32串口通訊的實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!