我們以51單片機為例。51中一般針對串口通訊編程,通常采取中斷接受查詢發送的方式。中斷函數在接受數據到達時被重復調用,其實是個重復入棧的過程,所以不宜將函數寫的太長,函數太長一般會導致棧太深占用系統資源,二是處理時間過長,可能導致通訊出錯。為了防止在處理數據過程中不受干擾,通常在處理接受數據前關閉中斷,處理完后再開。
通常的的編程方式如下:
static void UartInterruptService(void) interrupt 4
{
ES = 0;
RI = 0;
uart_process(SBUF);
ES=1;
}
下面重點介紹數據處理函數 uart_process(SBUF);
其實很多時候,對于通訊傳輸的數據處理才是關鍵,尤其對于設計通訊協議而言。筆者在剛剛做的一個系統上就碰到這樣的問題,當系統龐大了,資源十分有限的情況下,數據處理一旦占用資源太多,效率太低將導致系統崩潰而無法運行。
到了這里,很多工程師可能會考慮開個大的緩沖區FIFO將接收到的數據保存在緩沖區,然后對其進行解析、判斷進行下一步程序編寫,當然這在系統資源比較豐富的情況下是沒有問題的,ARM上采取的就是這樣的方式。但如何系統龐大呢,留給的資源缺乏則不行。這樣做的一個很大缺點必須是將數據幀接收完了才能夠判斷,降低了效率和運行速度。
其實還有另外的方式,可以采取在每接收一個字節就對其解析,解析完判斷轉到下一個狀態,并將其中的有用數據存儲在相應的數據結構中去,可以采取狀態機實現。
將狀態機設計為兩個控制狀態,一是串口狀態——uart_state ,一是命令類型狀態——cmd_state 。
(1)狀態機開始狀態:串口狀態為CMD_NO
(2)接受到STX_CMD,狀態變為CMD_START.
(3)接下來將自動進入接受命令幀的狀態,再開啟命令狀態的狀態機,對發送來的有用數據進行解析,保存,校驗等。處理完畢后將uart_state設為CMD_END狀態進行下一步的接受完畢判斷,將cmd_state設置為初始的NO_CMD狀態。
(4)最后進行ETX_CMD判斷,判斷數據接收是否完畢。
void uart_process(U8 u8)
{
if(uart_state == CMD_NO)
{
if(u8 == STX_CMD)
{
uart_state = CMD_START;
}
}
else if(uart_state == CMD_START)
{
switch(cmd_state)
{
case NO_CMD:
cmd_state = u8;
break;
case COST_CMD:
//解析存儲有用數據到相應數據結構中
//進行CRC校驗
……
uart_state = CMD_END;
cmd_state = NO_CMD;
CRC = 0;
break;
……
}
……
}
else if(uart_state == CMD_END)
{
uart_state = CMD_NO;
if(u8 == ETX_CMD)
{
//接受完畢
//可以考慮拋出一個消息main函數循環中進行響應處理。
}
}
}
接下來我們要討論解析后我們數據存儲的問題,其實在資源比較足夠的情況下或者能夠擠出data區的情況下可以考慮用結構體,我們構造好相應結構體,將接收到的數據存儲進去,要應用的時候就十分方便。但這也有個矛盾,一般c51定義的結構體都被存儲在data區,一般通訊的字節量大空間必然不夠,存在一個矛盾,可以采用聯合體union進行存儲效果會好一點。當然也可以在保存數據時采用定義在xdata區(片外)的buffer來存儲。這樣在一定程序上優化了程序的執行效率,在程序處理立即拋出消息處理,提高了通訊數據的處理速度。對于通常資源比較豐富的系統,比如ARM上一般采取的做法是這樣的,將數據存在緩沖區,接收完一幀數據后再轉換成相應的數據結構,再進行分析、校驗。
總體來說,這種采取狀態機實時解析串口通訊數據的方式在一定程序提高了程序運行效率,使軟件架構清晰明了,程序可擴展性大,有利于后續開發。
上一篇:以太網控制器ENC28J60配置單片機“電子郵差”系統
下一篇:51單片機對LED點陣屏的設計
推薦閱讀
史海拾趣
GradConn始終將技術創新作為公司發展的核心驅動力。公司擁有一支專業的研發團隊,致力于開發新型連接器和電纜組件,以滿足不斷變化的市場需求。同時,GradConn的所有工廠均通過了ISO 9001:2015和ISO 14001:2015等國際質量管理體系認證,確保了產品的高質量和環境友好性。這些認證不僅提升了GradConn的品牌形象,還為其在全球市場上贏得了更多客戶的信任和支持。
GradConn Ltd的創立初期,公司便明確了其專注于電子連接器和同軸電纜組件的市場定位。這一戰略選擇使GradConn能夠迅速在通訊、工業、醫療和汽車等領域建立起穩定的客戶基礎。通過不斷研發創新,GradConn推出了一系列高質量的產品,如板對板連接器、電纜組件連接器以及SIM卡連接器等,滿足了市場對精密、可靠連接解決方案的迫切需求。
在快速發展的過程中,DART公司也遇到了不少挑戰和危機。例如,某個時期全球電子元器件供應緊張,導致公司面臨嚴重的原材料短缺問題。面對這一挑戰,DART公司迅速調整采購策略,積極尋找新的供應商和替代品,并加強與現有供應商的合作和溝通。通過這些措施,公司成功度過了危機,并保持了業務的穩定增長。
在競爭激烈的電子行業中,只有不斷創新才能保持領先地位。DART公司深知這一點,因此他們投入大量資金用于研發新的技術和產品。同時,公司也積極開展與高校、研究機構和其他企業的合作,共同探索新的技術路線和市場應用。這些合作不僅為DART公司帶來了更多的技術積累和市場機會,也促進了整個電子行業的進步和發展。
隨著業務的不斷擴展,Continental Industries開始積極尋求全球市場機會。公司在歐洲、北美洲、南美洲和亞洲等多個地區設立了代表處或全資子公司,以更好地服務當地客戶。通過本地化運營和定制化服務,公司成功打開了多個新的市場,實現了業務的快速增長。
ETI Systems深知在電子行業中,單打獨斗很難取得長遠的發展。因此,公司積極尋求與行業內外的合作伙伴建立戰略合作關系。通過與多家知名企業和研究機構的合作,ETI Systems不僅獲得了寶貴的技術支持,還拓展了市場渠道和客戶資源。這種合作與共贏的伙伴關系,為ETI Systems的快速發展奠定了堅實的基礎。
模擬器下是這個波形,使用的標準SDK for WinCE5.0 但是將程序載到wince上就變成了另一副樣子,有嚴重的漂移。 中線會偏下很多~~ 有沒有前輩遇到過~… 查看全部問答∨ |
安裝BSP包后,打開時出現 Errors loading SDK(S): E:E:\\WINCE600\\OSDesigns\\S3C6410_DEMO\\S3C6410_DEMO\\SDKs\\SDK1\\SDK1.sdkcfg does not exist 請問這個怎么解決。 弄了好幾遍,都是這樣,急盼!謝謝啊!… 查看全部問答∨ |
現在我遇到這樣一個問題,想請教一下大家,在網上也沒有收集到相關的資料(不好意思,以前沒用過這些東西,可能說起來比較外行)。 一臺電腦和多臺儀器組成一個分布式控制系統,現在想實現這幾臺儀器能夠同時采集數據,該怎么辦? 現在基本的思路 ...… 查看全部問答∨ |
|
設計資源 培訓 開發板 精華推薦
- Proximus Global旗下公司BICS與兩家新運營商合作,擴展全球獨立5G漫游范圍
- MiR 發布物流行業重磅電子書,以技術創新與智能設備重塑倉儲物流格局
- Nordic Semiconductor nRF9151 蜂窩物聯網模組通過日本NTT DOCOMO LTE-M 網絡使用驗證
- 2025“最能打的中國芯”評選:概述、流程與申報
- 芯原可擴展的高性能GPGPU-AI計算IP賦能汽車與邊緣服務器AI解決方案
- 全球晶圓代工TOP10出爐
- 能用體溫給手表發電,中國研發出新型柔性發電薄膜材料
- 做大做優做強科技產業鏈,海光信息、中科曙光公布重組預案
- 比亞迪攜手阿里云,智能座艙實現語音控制在線服務
- “眾鈉能源發布元鈉輕擎電池,鋰鈉融合技術明年上市”