當(dāng)前位置:首頁 > 通信技術(shù) > 通信技術(shù)
[導(dǎo)讀]本文利用Matlab GUI設(shè)計通過串口進(jìn)行數(shù)據(jù)發(fā)送和接收的界面,并利用內(nèi)置于Matlab的串口通信API實現(xiàn)串口數(shù)據(jù)發(fā)送與接收功能。

本文利用Matlab GUI設(shè)計通過串口進(jìn)行數(shù)據(jù)發(fā)送和接收的界面,并利用內(nèi)置于Matlab的串口通信API實現(xiàn)串口數(shù)據(jù)發(fā)送與接收功能。

1 Matlab GUl介紹

啟動Matlab后,運(yùn)行g(shù)uide命令即可以啟動Matlab GUI開發(fā)工具。

新建Blank GUI,如圖2所示。

在新建Blank GUI界面中,包含了一般的界面元素,如菜單、按鈕、坐標(biāo)軸、控件等。添加必要的串口通信參數(shù)設(shè)置按鈕。

運(yùn)行后的界面如圖3所示。


2 串口數(shù)據(jù)發(fā)送與接收功能實現(xiàn)

2.1 建立串口通信流程的基本步驟

Matlab提供了對串口進(jìn)行打開、關(guān)閉、以及串口參數(shù)設(shè)置等操作的一系列函數(shù)。利用這些函數(shù)可以選擇串口號、設(shè)置串口通信參數(shù)(波特率、數(shù)據(jù)位、停止位、校驗位等)、進(jìn)行中斷控制、流控制。從建立串口通信到結(jié)束串口通信的完整流程包括以下幾個步驟:

(1)為應(yīng)用程序創(chuàng)建串口對象。實現(xiàn)該功能的函數(shù)為:


其中參數(shù)port為完整的串口名稱,如cornl。PropertyName為串口通信參數(shù),如baudrate,startbits等。創(chuàng)建串口對象的過程中,也可以忽略PropertyName。其函數(shù)為:


(2)連接打開串口。實現(xiàn)該功能的函數(shù)為:


obj即為使用創(chuàng)建串口對象函數(shù)的返回值。在連接打開串口后,可以對串口通信參數(shù)進(jìn)行修改。

(3)設(shè)置或者修改串口通信參數(shù)。在能夠有效地進(jìn)行串口通信前,必須設(shè)置正確的串口通信參數(shù)。實現(xiàn)該功能的函數(shù)為:


obj即為使用創(chuàng)建串口對象函數(shù)的返回值;PropertyName為串口通信參數(shù),如baudrate,startbits等。

(4)從串口讀寫數(shù)據(jù)。在前面三個步驟正常完成后,即可以從串口讀數(shù)據(jù)或者向串口寫數(shù)據(jù),也就是接收或者發(fā)送數(shù)據(jù)。實現(xiàn)讀串口功能的函數(shù)有多個。其區(qū)別在于根據(jù)到達(dá)串口數(shù)據(jù)的類型選擇合適的讀函數(shù)。主要包括:fgetl,fgets,fread,fscanf。這里主要介紹fread,fread函數(shù)實現(xiàn)從串口讀入二進(jìn)制數(shù)據(jù)。fread的實現(xiàn)形式為:

A=fread(obj,size)

A為讀入的數(shù)據(jù),以數(shù)組的形式存儲,存儲數(shù)據(jù)形式為字節(jié);obj即為使用創(chuàng)建串口對象函數(shù)的返回值;size指定一次讀操作讀入字節(jié)的個數(shù)。實現(xiàn)寫串口的函數(shù)有兩個,分別為fwrite和fprintf。fwrite以二進(jìn)制形式向串口寫入數(shù)據(jù),實現(xiàn)形式為:

fwrite(obj,A)

obj即為使用創(chuàng)建串口對象函數(shù)的返回值;A為寫入的數(shù)據(jù),以數(shù)組形式存儲。fwrite以文本形式向串口寫入數(shù)據(jù),即以ASCII碼的形式向串口寫數(shù)據(jù),實現(xiàn)形式為:

fprintf(obj,'cmd')

obj即為使用創(chuàng)建串口對象函數(shù)的返回值;cmd為寫入的文本數(shù)據(jù),以數(shù)組形式存儲。

(5)關(guān)閉串口以及釋放串口對象占用的存儲空間。關(guān)閉串口函數(shù)為:fclose(obj)。釋放串口對象占用的內(nèi)存空間,函數(shù)為:delete(obj)。釋放串口對象在Matlab工作區(qū)中占用的存儲空間,函數(shù)為:clear obj。

以上5步是建立串口通信過程到關(guān)閉串口,釋放串口占用資源的基本步驟。基本步驟可以實現(xiàn)手動收發(fā)數(shù)據(jù)。其例程如下:

運(yùn)行以上語句后,顯示的結(jié)果如下:

串口數(shù)據(jù)接收完畢后,需要關(guān)閉串口,并釋放串口對象占用的資源,使用的命令如下:

2.2 串口中斷設(shè)置及中斷處理函數(shù)要實現(xiàn)自動收發(fā)數(shù)據(jù),還需要定義串口中斷處理函數(shù)以及觸發(fā)串口中斷的方式。定義串口中斷處理函數(shù)也就是定義串口數(shù)據(jù)接收或者發(fā)送函數(shù)。定義觸發(fā)串口中斷的方式其目的是為了在串口檢測到接收數(shù)據(jù)的時候,通知并啟動串口數(shù)據(jù)接收函數(shù)進(jìn)行數(shù)據(jù)接收操作;在串口輸出緩存為空的時候,通知啟動串口數(shù)據(jù)發(fā)送函數(shù)。

(1)觸發(fā)串口中斷的方式。在Matlab串口通信編程中,Matlab通過檢測到串口通信事件,從而觸發(fā)串口中斷。涉及到串口讀寫的事件包括:Bytes available,Output empty。其中Bytes available事件有兩種:一種是接收到的字符數(shù)達(dá)到人工設(shè)定的數(shù)目時,則系統(tǒng)產(chǎn)生該事件;另一種是當(dāng)接收到指定字符時,系統(tǒng)產(chǎn)生該事件。Output erupty事件是在系統(tǒng)檢測到輸出緩存區(qū)為空時,產(chǎn)生該事件。

Bytes available事件需要事先設(shè)置??梢允褂煤瘮?shù):set(obj,'By tesAvailableFcnMode','byte');set(obj,'BytesAvailableFcn-Count',240);以上兩個函數(shù)設(shè)置當(dāng)串口檢測到輸入緩存中到達(dá)了240個字符的數(shù)據(jù)時,則觸發(fā)串口中斷。另外,也可以設(shè)置為當(dāng)系統(tǒng)檢測到某個字符達(dá)到串口,則觸發(fā)串口中斷。其設(shè)置函數(shù)為:set(obj,'BytesAvailableFcnMode','terminator');set(obj,'terminator', 'H')。以上兩個函數(shù)設(shè)置當(dāng)串口檢測到字符H時,則觸發(fā)串口中斷。

輸出緩存為空事件的產(chǎn)生。該事件由系統(tǒng)自動檢測產(chǎn)生,不需要用戶特別設(shè)置。該事件一般在輸出緩存中的最后一個字符發(fā)送完畢后產(chǎn)生。用戶可以定義該事件引起的串口中斷處理函數(shù)。

(2)串口中斷處理函數(shù)。串口中斷處理函數(shù)可以根據(jù)用戶需要自行定義。如串口讀中斷處理函數(shù)可以這樣定義:obj.BytesAvailableF-cn=@reeeiveData。receiveData即為串口讀中斷處理函數(shù)。在讀中斷處理函數(shù)中可以進(jìn)行串口讀操作。即將輸入緩存區(qū)中的數(shù)據(jù)讀到用戶自定義的存儲變量中,以備后續(xù)的數(shù)據(jù)處理與分析。類似可以定義輸出緩存為空時觸發(fā)的串口中斷處理函數(shù):obj.OutputEmptyFcn=@write-Data。

本文開發(fā)的串口通信程序用于接收采集IMU(InerTIal Measurement Unit)輸出的加速度計和陀螺的測量數(shù)據(jù)。通過定義串口讀中斷事件和串口中斷處理函數(shù),實現(xiàn)了數(shù)據(jù)的自動采集,并以Matlab圖形方式實時顯示數(shù)據(jù)。

最近做了一個康復(fù)輔助設(shè)備的小項目,其中一部分設(shè)計串口通信及其對應(yīng)知識,也是整個項目挺重要的一部分,故單獨(dú)摘出來寫成筆記以加強(qiáng)記憶。如有錯誤之處望諸君指正。

串口通訊初始化

串口通訊的第一步便是初始化,即配置串口參數(shù)與打開串口。

matlab中,我們可以通過調(diào)用幾個簡單的指令來實現(xiàn)這一步驟。

首先是配置串口參數(shù):

一般來講,串口參數(shù)包括:串口名、波特率、奇偶校驗位(起始位)、數(shù)據(jù)位、停止位這幾項。

串口名是指:串口在系統(tǒng)中的名稱,一般以COM加數(shù)字命名。如:COM2、COM11。

波特率是指:上位機(jī)與下位機(jī)通訊時的傳輸速度。常見的波特率有9600、14400、115200等,其單位為波特/秒,即b/s。

需要注意區(qū)分的一點是波特率不是比特率,比特率的單位是比特/s,即bit per second-bps/s;波特率中的波特與比特存在這樣的關(guān)系,如果發(fā)送的內(nèi)容有1位起始位、1位終止位、8位數(shù)據(jù)位,那么1波特便等于10比特。

如果下位機(jī)的采樣頻率過快(數(shù)據(jù)小于等于8位),比如達(dá)到了10kHZ,那么就要求在1秒以內(nèi)上傳10000個數(shù),需要10000個波特,在這種情況下9600的波特率就不滿足要求了,我們便需要更大的波特率。

另外順便區(qū)分一下比特bit與字節(jié)Byte,在一般情況下1Byte=2^8bit,即一個字節(jié)由256個比特組成。在串口通訊中,如果設(shè)置數(shù)據(jù)位為8,那么我們一個波特所能攜帶的數(shù)最大便為11111111,因此對超過8位的數(shù)據(jù)我們需要將其拆分成高低位發(fā)送。

奇偶校驗位(起始位)、數(shù)據(jù)位、停止位是指:每一個波特中所含的這些有不同含義的數(shù)的位數(shù)。一般奇偶校驗位為0,數(shù)據(jù)位為8,停止位為1。

以上配置串口參數(shù)的過程可以用簡單的matlab語句實現(xiàn):

s=serial("COM8");%設(shè)置串口的句柄

set(s,'BaudRate',14400,'DataBits',8,'StopBits',1,'Parity','none');

%配置串口參數(shù) 波特率14400 無起始位 1終止位 8數(shù)據(jù)位

123

其次是打開串口:

在matlab中可用簡單語句實現(xiàn):

fopen(s);%配置并打開串口

1

這樣,便完成了串口通訊的初始化,接下來便是發(fā)送數(shù)據(jù)和接收數(shù)據(jù)了。

串口發(fā)送數(shù)據(jù)

在matlab中,發(fā)送數(shù)據(jù)的函數(shù)有fprintf、fwrite、fscanf等,由于這次我使用的是fwrite,故下文只介紹fwrite。

先上代碼:

fwrite(s, D, 'uint8'); %對定義的串口s發(fā)送該數(shù)據(jù)

1

fwrite一般以上述形式使用,第一位是串口名的句柄,第二位是所要發(fā)送的數(shù)據(jù),第三位位發(fā)送數(shù)據(jù)的數(shù)據(jù)類型。

因為做的是上下位機(jī)之間的指令型通訊,所以一般采用的數(shù)據(jù)類型是uint8。而設(shè)置指令D的方法如下:

Str ='20';%字符串定義需要發(fā)送的十六進(jìn)制內(nèi)容

D = sscanf(Str,'%2x'); %將字符串轉(zhuǎn)換成十六進(jìn)制數(shù)據(jù) 其中x是16進(jìn)制的意思

12

可將字符串中的數(shù)字轉(zhuǎn)化為16進(jìn)制數(shù)字(數(shù)字本身不改變)并由fwrite發(fā)送。

串口讀取數(shù)據(jù)

串口讀取數(shù)據(jù)的方式有很多種,本質(zhì)上都是通過fread函數(shù)接受數(shù)據(jù)并進(jìn)一步處理。但由于下位機(jī)發(fā)送的方式不同,接收的方式也有所不同。

有些下位機(jī)是以一個數(shù)據(jù)一個數(shù)據(jù)的形式發(fā)送的,這種發(fā)送方法在低速通信的時候沒有什么問題;但如果發(fā)送的速度較快,上位機(jī)的代碼運(yùn)行時間較長,很容易發(fā)生丟失數(shù)據(jù)的現(xiàn)象,這對于需要將第八位與高八位拼接的讀取方式來說是致命的。

因此,我推薦下位機(jī)將一次需要發(fā)送的數(shù)據(jù)以一個數(shù)組一個數(shù)組的方式發(fā)送。這樣,上位機(jī)可一個一個數(shù)組的讀取,在一定程度上可以有效避免上述問題。

這里略加一句,在Labview中,由于串口讀取是以字符串的形式進(jìn)行的,那么就會存在一個問題。平常情況下讀取的字符串是一個字母一個字節(jié),但是由于Labview直接將下位機(jī)發(fā)送的8位16進(jìn)制數(shù)識別成了字符串,那么對于這個字符串來說,就變成了2個字母占1個字節(jié);這就造成了普通的字符串轉(zhuǎn)數(shù)字控件無法工作,需要將其轉(zhuǎn)換為1個字母占1個字節(jié)的形式才可以工作。不過,好在matlab并不存在這個問題。

對于我這次的項目,由于下位機(jī)發(fā)送數(shù)據(jù)的方式是這樣的:

所以根據(jù)下位機(jī)發(fā)送數(shù)據(jù)的方式,我使用了一種兼顧顯示和采集的讀取方式。下面給出我這次項目串口讀取部分使用的代碼:

%-------讀取串口數(shù)據(jù)

for i=1:20

data=fread(s,4,'uint8');

data2=fread(s2,4,'uint8');%提取串口數(shù)據(jù)

if(data(1)==32&&data2(1)==32)

wave(1,:)=data(2)+data(3)*256;

wave(2,:)=data2(2)+data2(3)*256;

waveform=[waveform,wave];

end

end

%------------------

1234567891011

這個for循環(huán)是在一個大的for循環(huán)或者while循環(huán)下的。首先,使用fread語句讀取串口數(shù)據(jù)(注意的是每次讀取了4個字節(jié),與下位機(jī)發(fā)送的數(shù)組字節(jié)數(shù)相符);之后用if循環(huán)尋找起始標(biāo)志,再根據(jù)順序判斷出高低位并將其合成一個數(shù);最后將每次讀取到的數(shù)動態(tài)依次合成到同一個數(shù)組中。

另外,由于考慮到波形顯示問題,我并沒有每次都把波形數(shù)組輸出。這是因為雖然這么做能讓圖像顯示看起來更流暢,但是由于plot函數(shù)耗時較長,會造成上位機(jī)運(yùn)行跟不上下位機(jī)發(fā)送,造成圖像顯示遲滯現(xiàn)象。因此,我選擇了讓它循環(huán)20次即獲取20個點后再刷新圖像。

串口波形的圖像顯示

本質(zhì)上是使用plot函數(shù)將同一數(shù)組中的數(shù)據(jù)以兩通道的形式顯示出來。

不過需要注意的一點是,plot函數(shù)只會機(jī)械的將你需要顯示的數(shù)組顯示出來,并不具有類似Labview波形圖標(biāo)控件那樣自動調(diào)整橫坐標(biāo),使波形只有最近的一段顯示,給人波形在滾動的感覺,也就是我們在示波器中看到的那樣(如果不加干涉,波形只會越來越長,越來越小)。

聲明:該篇文章為本站原創(chuàng),未經(jīng)授權(quán)不予轉(zhuǎn)載,侵權(quán)必究。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉