[導讀]本文介紹如何使用帶FIFO的串口來減少接收中斷次數(shù),通過一種自定義通訊協(xié)議格式,給出幀打包方法;之后介紹一種特殊的串口數(shù)據(jù)發(fā)送方法,可在避免使用串口發(fā)送中斷的情況下,提高系統(tǒng)的響應速度。一種可1.簡介串口由于使用簡單,價格低廉,配合RS485芯片可以實現(xiàn)長距離、抗干擾能力強的局域...
單片機、ARM、嵌入式等硬件、軟件設計經驗的分享,并提供一定的技術支持。我已加入“維權騎士”(rightknights.com)的版權保護計劃" data-from="0">本文介紹如何使用帶FIFO的串口來減少接收中斷次數(shù),通過一種自定義通訊協(xié)議格式,給出幀打包方法;之后介紹一種特殊的串口數(shù)據(jù)發(fā)送方法,可在避免使用串口發(fā)送中斷的情況下,提高系統(tǒng)的響應速度。一種可1. 簡介
串口由于使用簡單,價格低廉,配合RS485芯片可以實現(xiàn)長距離、抗干擾能力強的局域網絡而被廣泛使用。隨著產品功能的增多,需要處理的任務也越來越復雜,系統(tǒng)任務也越來越需要及時響應。絕大多數(shù)的現(xiàn)代單片機(ARM7、Cortex-M3)串口都帶有一定數(shù)量的硬件FIFO,本文將介紹如何使用硬件FIFO來減少接收中斷次數(shù),提高發(fā)送效率。在此之前,先來列舉一下傳統(tǒng)串口數(shù)據(jù)收發(fā)的不足之處:(1)每接收一個字節(jié)數(shù)據(jù),產生一次接收中斷。不能有效的利用串口硬件FIFO,減少中斷次數(shù)。(2)應答數(shù)據(jù)采用等待發(fā)送的方法。由于串行數(shù)據(jù)傳輸?shù)臅r間遠遠跟不上CPU的處理時間,等待串口發(fā)送完當前字節(jié)再發(fā)送下一字節(jié)會造成CPU資源浪費,不利于系統(tǒng)整體響應(在1200bps下,發(fā)送一字節(jié)大約需要10ms,如果一次發(fā)送幾十個字節(jié)數(shù)據(jù),CPU會長時間處于等待狀態(tài))。(3)應答數(shù)據(jù)采用中斷發(fā)送。增加一個中斷源,增加系統(tǒng)的中斷次數(shù),這會影響系統(tǒng)整體穩(wěn)定性(從可靠性角度考慮,中斷事件應越少越好)。(4)針對上述的不足之處,將結合一個常用自定義通訊協(xié)議,提供一個完整的解決方案。2.串口FIFO
串口FIFO可以理解為串口專用的緩存,該緩存采用先進先出方式。數(shù)據(jù)接收FIFO和數(shù)據(jù)發(fā)送FIFO通常是獨立的兩個硬件。串口接收的數(shù)據(jù),先放入接收FIFO中,當FIFO中的數(shù)據(jù)達到觸發(fā)值(通常觸發(fā)值為1、2、4、8、14字節(jié))或者FIFO中的數(shù)據(jù)雖然沒有達到設定值但是一段時間(通常為3.5個字符傳輸時間)沒有再接收到數(shù)據(jù),則通知CPU產生接收中斷;發(fā)送的數(shù)據(jù)要先寫入發(fā)送FIFO,只要發(fā)送FIFO未空,硬件會自動發(fā)送FIFO中的數(shù)據(jù)。寫入發(fā)送FIFO的字節(jié)個數(shù)受FIFO最大深度影響,通常一次寫入最多允許16字節(jié)。上述列舉的數(shù)據(jù)跟具體的硬件有關,CPU類型不同,特性也不盡相同,使用前應參考相應的數(shù)據(jù)手冊。3.數(shù)據(jù)接收與打包
FIFO可以緩存串口接收到的數(shù)據(jù),因此我們可以利用FIFO來減少中斷次數(shù)。以NXP的lpc1778芯片為例,接收FIFO的觸發(fā)級別可以設置為1、2、4、8、14字節(jié),推薦使用8字節(jié)或者14字節(jié),這也是PC串口接收FIFO的默認值。這樣,當接收到大量數(shù)據(jù)時,每8個字節(jié)或者14個字節(jié)才會產生一次中斷(最后一次接收除外),相比接收一個字節(jié)即產生一個中斷,這種方法串口接收中斷次數(shù)大大減少。將接收FIFO設置為8或者14字節(jié)也十分簡單,還是以lpc1778為例,只需要設置UART FIFO控制寄存器UnFCR即可。接收的數(shù)據(jù)要符合通訊協(xié)議規(guī)定,數(shù)據(jù)與協(xié)議是密不可分的。通常我們需要將接收到的數(shù)據(jù)根據(jù)協(xié)議打包成一幀,然后交由上層處理。下面介紹一個自定義的協(xié)議幀格式,并給出一個通用打包成幀的方法。自定義協(xié)議格式如圖3-1所示。- 幀首:通常是3~5個0xFF或者0xEE
- 地址號:要進行通訊的設備的地址編號,1字節(jié)
- 命令號:對應不同的功能,1字節(jié)
- 長度:數(shù)據(jù)區(qū)域的字節(jié)個數(shù),1字節(jié)
- 數(shù)據(jù):與具體的命令號有關,數(shù)據(jù)區(qū)長度可以為0,整個幀的長度不應超過256字節(jié)
- 校驗:異或和校驗(1字節(jié))或者CRC16校驗(2字節(jié)),本例使用CRC16校驗
下面介紹如何將接收到的數(shù)據(jù)按照圖3-1所示的格式打包成一幀。3.1 定義數(shù)據(jù)結構
typedef?struct?
{??
????uint8_t?*?dst_buf;??????????????????//指向接收緩存??
????uint8_t?sfd;????????????????????????//幀首標志,為0xFF或者0xEE??
????uint8_t?sfd_flag;???????????????????//找到幀首,一般是3~5個FF或EE??
????uint8_t?sfd_count;??????????????????//幀首的個數(shù),一般3~5個??
????uint8_t?received_len;???????????????//已經接收的字節(jié)數(shù)??
????uint8_t?find_fram_flag;?????????????//找到完整幀后,置1??
????uint8_t?frame_len;??????????????????//本幀數(shù)據(jù)總長度,這個區(qū)域是可選的??
}find_frame_struct;3.2 初始化數(shù)據(jù)結構,一般放在串口初始化中
/**?
*?@brief????初始化尋找?guī)臄?shù)據(jù)結構?
*?@param????p_fine_frame:指向打包幀數(shù)據(jù)結構體變量?
*?@param????dst_buf:指向幀緩沖區(qū)?
*?@param????sfd:幀首標志,一般為0xFF或者0xEE?
*/??
void?init_find_frame_struct(find_frame_struct?*?p_find_frame,uint8_t?*dst_buf,uint8_t?sfd)??
{??
????p_find_frame->dst_buf=dst_buf;??
????p_find_frame->sfd=sfd;??
????p_find_frame->find_fram_flag=0;??
????p_find_frame->frame_len=10;???????
????p_find_frame->received_len=0;??
????p_find_frame->sfd_count=0;??
????p_find_frame->sfd_flag=0;??
}?3.3 數(shù)據(jù)打包程序
/**?
*?@brief????尋找一幀數(shù)據(jù)??返回處理的數(shù)據(jù)個數(shù)?
*?@param????p_find_frame:指向打包幀數(shù)據(jù)結構體變量?
*?@param????src_buf:指向串口接收的原始數(shù)據(jù)?
*?@param????data_len:src_buf本次串口接收到的原始數(shù)據(jù)個數(shù)?
*?@param????sum_len:幀緩存的最大長度?
*?@return???本次處理的數(shù)據(jù)個數(shù)?
*/??
uint32_t?find_one_frame(find_frame_struct?*?p_find_frame,const?uint8_t?*?src_buf,uint32_t?data_len,uint32_t?sum_len)??
{??
????uint32_t?src_len=0;??
????while(data_len--)??
????{??
????????if(p_find_frame?->sfd_flag==0)????????????????????????
????????{???//沒有找到起始幀首??
????????????if(src_buf[src_len ]==p_find_frame?->sfd)??
????????????{??
????????????????p_find_frame?->dst_buf[p_find_frame?->received_len ]=p_find_frame?->sfd;??
????????????????if( p_find_frame?->sfd_count==5)??????????
????????????????{??
????????????????????p_find_frame?->sfd_flag=1;??
????????????????????p_find_frame?->sfd_count=0;??
????????????????????p_find_frame?->frame_len=10;??
????????????????}??
????????????}??
????????????else??
????????????{??
????????????????p_find_frame?->sfd_count=0;???
????????????????p_find_frame?->received_len=0;???
????????????}??
????????}??
????????else???
????????{???//是否是"長度"字節(jié)??Y->獲取這幀的數(shù)據(jù)長度??
????????????if(7==p_find_frame?->received_len)????????????????
????????????{??
????????????????p_find_frame->frame_len=src_buf[src_len] 5 1 1 1 2;?//幀首 地址號 命令號 數(shù)據(jù)長度 校驗???????
????????????????if(p_find_frame->frame_len>=sum_len)??
????????????????{???//這里處理方法根據(jù)具體應用不一定相同??
????????????????????MY_DEBUGF(SLAVE_DEBUG,("數(shù)據(jù)長度超出緩存!\n"));??
????????????????????p_find_frame->frame_len=?sum_len;???????
????????????????}??
????????????}??
??????????????
????????????p_find_frame?->dst_buf[p_find_frame->received_len ]=src_buf[src_len ];????????????????
????????????if(p_find_frame?->received_len==p_find_frame?->frame_len)??????????????????
????????????{??
????????????????p_find_frame?->received_len=0;??????????????//一幀完成????
????????????????p_find_frame?->sfd_flag=0;??
????????????????p_find_frame?->find_fram_flag=1;???????????????????
????????????????return?src_len;??
????????????}??
????????}??
????}??
????p_find_frame?->find_fram_flag=0;??
????return?src_len;??
}?使用例子:定義數(shù)據(jù)結構體變量:find_frame_struct?slave_find_frame_srt;定義接收數(shù)據(jù)緩沖區(qū):#define?SLAVE_REC_DATA_LEN??128
uint8_t?slave_rec_buf[SLAVE_REC_DATA_LEN];在串口初始化中調用結構體變量初始化函數(shù):init_find_frame_struct(
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
串口作為單片機開發(fā)的一個常用的外設,應用范圍非常廣。大部分時候,串口需要接收處理的數(shù)據(jù)長度是不定的。那么怎么才能判斷一幀數(shù)據(jù)是否結束呢,今天就以STM32單片機為例,介紹幾種接收不定長數(shù)據(jù)的方法。
關鍵字:
單片機
串口
STM32
單片機誕生于1971年,經歷了SCM、MCU、SoC三大階段。單片機由以前的1位、4位、8位、16位,發(fā)展到現(xiàn)在的32位甚至64位。當前國內MCU廠商已有上百家,對標進口芯片的情況非常嚴重,導致國內MCU產品將陷入同質化...
關鍵字:
單片機
MCU
市場
(微控制單元 MCU(Microcontroller Unit),又稱單片機,是把中央處理器(CentralProcess Unit; CPU)的頻率與規(guī)格做適當縮減,并將內存(memory)、計數(shù)器(Timer)、US...
關鍵字:
單片機
芯片
CPU
在疫情的影響下,出門后、用餐前使用酒精消毒已成了人們的日常,而酒精噴霧機也因此變得十分熱銷。為了避免交叉感染的風險,自動酒精噴霧器也就應運而生。不同于傳統(tǒng)手動噴霧器不美觀、手部接觸不衛(wèi)生的bug,此款自動感應酒精噴霧器使...
關鍵字:
芯嶺技術
方案開發(fā)
解決方案
單片機
在實際的單片機控制系統(tǒng)中,有時候會使用數(shù)字邏輯芯片對單片機和受控元件進行隔離,以保護單片機,或者令單片機更好地對后級進行控制。
關鍵字:
單片機
數(shù)字邏輯芯片
受控元件
MH32F103AVET6使用高性能的32位內核,內置了多達2個高級定時器、10個通用定時器、2個基本定時器、3個12位的ADC、2個12位的DAC,還包含標準和先進的通信接口包括:3個SPI接口、2個I2S接口、2個I...
關鍵字:
單片機
MCU
最近由于換季,天氣突然的轉涼,大家也是直呼好冷。天冷了自然是要注意防寒保暖。一個能夠當充電寶用的暖手寶會是你最好的陪伴。暖手寶是一種非常便捷易用的發(fā)熱工具,并且體形小巧,可以隨身攜帶并輕易握在手中,也可以放置在身上的其它...
關鍵字:
芯嶺技術
方案開發(fā)
解決方案
單片機
XL32F003 系列微控制器采用高性能的 32 位 ARM?Cortex?- M0+ 內核,寬電壓工作范圍的MCU。嵌入高達64 Kbytes flash和8 Kbytes SRAM存儲器,最高工作頻率32 MHz。包...
關鍵字:
單片機
MCU
電動洗鼻器是一種全新的鼻腔清潔工具,一般是通過水壓將生理鹽水送進鼻腔,借助于生理鹽水的殺菌作用及水流的沖擊力,將鼻腔內已聚集的致病菌及污洉排出,從而使鼻腔恢復正常的生理環(huán)境,恢復鼻腔的自我排毒功能,達到保護鼻腔的目的。讓...
關鍵字:
芯嶺技術
方案開發(fā)
解決方案
單片機
大家好,我是小舒,今天我?guī)砹艘粋€開源項目。學習單片機的小伙伴,對J-link一定不會陌生。J-link可以使用JATA和SWD接口進行在線Debug和程序的燒錄,曾經一段時間,某寶上J-Link鋪天蓋地,各種各樣,價格...
關鍵字:
開源項目
J-link
單片機
51單片機是對兼容英特爾8051指令系統(tǒng)的單片機的統(tǒng)稱。51單片機廣泛應用于家用電器、汽車、工業(yè)測控、通信設備中。因為51單片機的指令系統(tǒng)、內部結構相對簡單,所以國內許多高校用其進行單片機入門教學。
關鍵字:
51
單片機
51單片機論壇
單片機又稱單片微控制器,它不是完成某一個邏輯功能的芯片,而是把一個計算機系統(tǒng)集成到一個芯片上。相當于一個微型的計算機,和計算機相比,單片機只缺少了I/O設備。概括的講:一塊芯片就成了一臺計算機。它的體積小、質量輕、價格便...
關鍵字:
單片機
微控制器
芯片
前幾天直播間不小心給物聯(lián)網開發(fā)板通入了12V電源。原本開發(fā)板的供電要求是5V。不小心將拾音磁流體的適配器12V插了進去。瞬間板子出現(xiàn)燒焦的味道,馬上斷電。當時并沒有發(fā)現(xiàn)是哪里出現(xiàn)發(fā)熱,首先害怕是WiFi模塊燒壞,因為這個...
關鍵字:
單片機
物聯(lián)網
從事計算機和或電子行業(yè)相關領域工作的朋友,一般都聽說過單片機和嵌入式。但是要問單片機和嵌入式兩者之間有什么聯(lián)系,大多數(shù)人都不能很好的解釋清楚。想要弄清楚嵌入式和單片機有什么聯(lián)系,首先就要弄明白什么是嵌入式,什么是單片機。...
關鍵字:
嵌入式
單片機
自從芯片漲價潮以來,國產芯片,尤其是單片機類芯片猶如雨后春筍般發(fā)展起來,其中也不乏一些優(yōu)秀的產品。今天來盤點一下一些有特點的單片機。這里所說的單片機,是指通用型的MCU,像ESP32等SOC芯片就不在本次討論范圍內了。而...
關鍵字:
芯片
單片機
很多RTOS之所以可以用于資源很少的單片機,是因為它們可以配置,一般可以使用宏定義來選擇需要的功能,而裁剪掉不必要的功能,以減少對硬件的資源占用。
關鍵字:
RTOS
單片機
C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用于底層開發(fā)。C語言能以簡易的方式編譯、處理低級存儲器。C語言是僅產生少量的機器語言以及不需要任何運行環(huán)境支持便能運行的高效率程序設計語言。盡管C語言提供了許多低級...
關鍵字:
C語言
單片機
單片機(Single-Chip Microcomputer)是一種集成電路芯片,是采用超大規(guī)模集成電路技術把具有數(shù)據(jù)處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統(tǒng)、定時器/計數(shù)器等...
關鍵字:
單片機
寄存器
從二十世紀九十年代開始,單片機技術就已經發(fā)展起來,隨著時代的進步與科技的發(fā)展,目前該技術的實踐應用日漸成熟,單片機被廣泛應用于各個領域。
關鍵字:
單片機
電子產品