天天看點

用兩張圖,詳解FreeModbus在單片機序列槽上的資料收發過程-FreeModbus從站設計(9)

FreeModbus從站設計(9)-詳解FreeModbus在單片機序列槽上的資料收發過程

關鍵詞:FreeModbus STM32F103 CubeMX HAL庫 序列槽

1.引言

在上一篇文章中,主要闡述了vMBPortSerialEnable()這個函數如何基于HAL庫排程單片機序列槽的收發,感覺還是不是很清晰,是以,孔丙火(微信公衆号:孔丙火)在這一篇文章中,重點捋一下序列槽的收發函數調用關系,以求有有一個清晰的脈絡。

2.函數調用的基本架構

直接上圖,更清晰,接收過程如圖1所示,發送過程如圖2所示。

用兩張圖,詳解FreeModbus在單片機序列槽上的資料收發過程-FreeModbus從站設計(9)

圖1

接收過程起源于vMBPortSerialEnable()函數的調用,此時,該函數将序列槽設定位接收狀态,即使能接收中斷,禁止發送中斷。從圖中可以清晰的看出,需要修改的地方就是接收中斷的回調函數和portserial.c和porttimer.c中的幾個函數。至于何時調用vMBPortSerialEnable()函數,孔丙火(微信公衆号:孔丙火)認為,我們是不需要關心的,隻要按照之前的文章,把FreeModbus的代碼添加到keil工程中,FreeModbus協定棧會進行排程。接收過程是一個位元組一個位元組進行接收的,當協定棧檢測到定時器逾時,則認為一個完整的資料幀接收完畢,開始進入資料處理的階段,資料處理完成後,則進行回複資料的發送。

用兩張圖,詳解FreeModbus在單片機序列槽上的資料收發過程-FreeModbus從站設計(9)

圖2

發送過程同樣起源于vMBPortSerialEnable()函數的調用,此時,該函數将序列槽設定位發送狀态,即使能發送中斷,禁止接收中斷。從圖中可以清晰的看出,需要修改的地方就是發送中斷的回調函數和portserial.c中的幾個函數。至于何時調用vMBPortSerialEnable()函數,孔丙火(微信公衆号:孔丙火)認為,我們是不需要關心的,隻要按照之前的文章,把FreeModbus的代碼添加到keil工程中,FreeModbus協定棧會進行排程。發送過程同樣是一個位元組一個位元組進行的,在xMBRTUTransmitFSM()函數中,會檢測是否還有需要發送的資料,若沒有資料需要發送了,則會調用vMBPortSerialEnable()函數,再次将序列槽設定為接收狀态。作為Modbus從站,序列槽大部分時間是處于接收狀态的。

3.總結

在這篇文章中,孔丙火(微信公衆号:孔丙火)接着上一篇文章的思路,用兩張圖把FreeModbus在單片機序列槽上資料收發流程進行了梳理,脈絡更加清晰。有了這樣一個思路,可以更好地了解,移植FreeModbus的時候,為什麼需要修改portserial.c和porttimer.c中的函數,和為什麼需要修改序列槽中斷的回調函數。從這篇文章中,也可以看出,采用HAL庫是比較簡單的,像是中斷處理這些内容庫函數都已經處理好了,很友善,可以提高開發效率。

文章在公衆号(孔丙火)同步推出,歡迎檢視更多系列文章。

單片機、ARM、現場總線、PLC、嵌入式軟硬體的設計經驗分享,秉承“點點滴滴皆智慧”的理念,以實際項目為單元闡述知識點,一起分享,共同交流。

用兩張圖,詳解FreeModbus在單片機序列槽上的資料收發過程-FreeModbus從站設計(9)

繼續閱讀