【星云 Orbit ? STM32F4】10. 在串口接收中斷里即時解析數據頭的程序框架

【星云 Orbit ? STM32F4】10. 串口中斷中即時解析數據頭的程序開發:實現高效實時數據處理


摘要

在嵌入式開發中,串口中斷處理是實現高效實時數據傳輸的關鍵技術之一。本文將詳細介紹如何在STM32F407微控制器上開發一個在串口接收中斷中即時解析數據頭的程序框架。通過本教程,你將掌握如何在中斷服務函數中快速解析數據頭,實現高效的數據接收與處理。


關鍵詞

STM32F407、串口中斷、數據頭解析、實時數據處理、嵌入式開發


1. 引言

本教程旨在幫助嵌入式開發小白從零開始,學習如何在STM32F407微控制器上實現一個在串口接收中斷里即時解析數據頭的特殊程序框架。該程序能夠通過中斷方式接收串口數據,并在接收到數據頭后立即解析后續數據內容,支持基本的錯誤檢測和數據處理功能。教程內容涵蓋基礎知識、配置步驟、HAL庫函數詳解,并提供配套例程和代碼注釋。

2. 硬件準備

  • STM32F407開發板
  • 串口調試工具(如串口助手)

3. 軟件準備

  • Keil MDK-ARM開發環境
  • STM32F407標準庫

4. 知識儲備

在開始編程之前,需要了解以下基礎知識:

  • STM32F407的串口(USART)外設
  • 基本的串口通信知識(波特率、數據位、停止位、校驗位)
  • C語言編程基礎
  • 中斷服務函數的基本概念

5. 程序設計:從需求到實現

5.1 程序功能概述

程序的主要功能包括:

  • 初始化STM32F407的串口外設
  • 通過中斷方式接收串口數據
  • 在中斷服務函數中即時解析數據頭
  • 存儲接收到的數據到緩沖區
  • 提供數據處理接口
5.2 程序模塊劃分

程序分為以下幾個模塊:

  • main.c:主程序文件,負責初始化和程序運行邏輯
  • usart.husart.c:串口驅動文件,負責串口的初始化和數據收發
  • protocol.hprotocol.c:協議處理模塊,負責數據幀的解析和校驗
5.3 程序流程圖

在這里插入圖片描述

程序流程圖

  • 系統初始化:程序開始時進行系統初始化,包括時鐘配置、GPIO配置等。
  • 串口初始化:配置串口參數(如波特率、數據位、停止位等),使串口準備好接收數據。
  • 等待中斷觸發:程序進入等待狀態,等待串口接收到數據后觸發中斷。
  • 接收數據:中斷觸發后,程序從串口接收數據。
  • 檢測數據頭:檢查接收到的數據是否包含有效的數據頭,以確保數據的完整性。
  • 解析數據幀:根據數據幀結構,解析接收到的數據,提取數據類型、數據長度、數據內容和校驗碼等信息。
  • 存儲數據:將解析后的數據存儲到內存或外部存儲器中。
  • 數據處理:對存儲的數據進行進一步的處理,如計算、分析等,處理完成后返回等待中斷觸發狀態,繼續接收新的數據

6. 代碼實現:從初始化到數據處理

6.1 串口初始化 (usart.c)
#include "usart.h"void USART_Init(uint32_t baudrate) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 使能GPIO和USART時鐘RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);// 配置GPIO引腳GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置USARTUSART_InitStructure.USART_BaudRate = baudrate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);// 使能USARTUSART_Cmd(USART1, ENABLE);// 配置 NVIC 優先級NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
6.2 協議處理模塊 (protocol.c)
#include "protocol.h"#define DATA_BUFFER_SIZE 100
#define HEADER_SIZE 3
#define HEADER_1 0xEB
#define HEADER_2 0x00
#define HEADER_3 0x55static uint8_t data_buffer[DATA_BUFFER_SIZE];
static uint16_t buffer_index = 0;
static uint8_t header_received = 0;void Protocol_Init(void) {buffer_index = 0;header_received = 0;
}void USART1_IRQHandler(void) {if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {uint8_t received_data = USART_ReceiveData(USART1);if (header_received < HEADER_SIZE) {if (received_data == header[header_received]) {header_received++;if (header_received == HEADER_SIZE) {// 數據頭檢測完成,開始接收數據buffer_index = 0;}} else {header_received = 0;}} else {if (buffer_index < DATA_BUFFER_SIZE) {data_buffer[buffer_index++] = received_data;}}}
}uint8_t* GetDataBuffer(void) {return data_buffer;
}uint16_t GetBufferDataLength(void) {return buffer_index;
}
6.3 主程序 (main.c)
#include "usart.h"
#include "protocol.h"int main(void) {// 系統時鐘配置SystemClock_Config();// 初始化串口USART_Init(9600);// 初始化協議處理模塊Protocol_Init();while (1) {// 主循環可以添加其他任務}
}

7. 使用示例:快速上手的實踐指南

7.1 初始化串口

main.c 中調用 USART_Init 函數,配置串口參數:

USART_Init(9600); // 配置波特率為9600
7.2 初始化協議處理模塊

調用 Protocol_Init 函數,初始化協議處理模塊:

Protocol_Init();
7.3 數據接收與處理

在中斷服務函數 USART1_IRQHandler 中,接收到的數據會被存儲到 data_buffer 中。主程序可以通過以下函數獲取接收到的數據:

uint8_t* data = GetDataBuffer();
uint16_t data_length = GetBufferDataLength();

8. 狀態圖:直觀理解程序運行機制

在這里插入圖片描述

串口收發狀態圖

  • 系統初始化:程序開始時進行系統初始化,包括時鐘配置、GPIO配置等。
  • 串口初始化:初始化完成后,進入串口初始化狀態,配置串口參數。
  • 等待中斷觸發:串口配置完成后,進入等待中斷觸發狀態,等待串口接收到數據后觸發中斷。
  • 接收數據:中斷觸發后,進入接收數據狀態,從串口接收數據。
  • 檢測數據頭:接收到數據后,進入檢測數據頭狀態,檢查數據頭的有效性。
  • 解析數據幀:如果數據頭有效,進入解析數據幀狀態,解析數據內容。
  • 存儲數據:解析完成后,進入存儲數據狀態,將數據存儲到緩沖區。
  • 數據處理:存儲完成后,進入數據處理狀態,對數據進行進一步處理。
  • 返回等待中斷觸發:數據處理完成后,返回等待中斷觸發狀態,繼續接收新的數據。
  • 錯誤處理:如果在數據處理過程中發生錯誤,返回系統初始化狀態,重新初始化系統。
  • 數據頭無效:如果檢測到數據頭無效,返回等待中斷觸發狀態,重新開始接收數據。

9. 總結

通過本教程,讀者可以掌握如何在STM32F407上實現一個在串口接收中斷里即時解析數據頭的特殊程序框架。程序通過中斷方式接收數據,并在接收到數據頭后立即解析后續數據內容,支持基本的錯誤檢測和數據處理功能。教程內容從零開始,詳細講解了串口配置、數據接收、中斷處理等關鍵步驟,并提供了完整的代碼示例和注釋,幫助讀者快速上手。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896929.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據倉庫的特點

數據倉庫的主要特點可以概括為&#xff1a;面向主題、集成性、非易失性、時變性、高性能和可擴展性、支持復雜查詢和分析、分層架構以及數據質量管理。 1. 面向主題&#xff08;Subject-Oriented&#xff09; 數據倉庫是面向主題的&#xff0c;而不是面向事務的。這意味著數據…

SAP MDG —— MDG on S/4HANA 2023 FPS03 創新匯總

文章目錄 MDG 基于SAP S/4HANA 2023 FPS03的創新BP/C/S&#xff1a;消息控制BP/C/S&#xff1a;手工分配數據控制者MDG-F&#xff1a;使用S/4擴展數據校驗功能生成式AI可用于協助自定義對象的數據變更/同時可總結批量變更的內容 MDG 基于SAP S/4HANA 2023 FPS03的創新 由于從S…

抽獎系統(從0-1)(上)

hu項目的開發流程介紹 1. 項目啟動階段 ? 項?概述&#xff1a;介紹項?的背景、?標和預期成果。 ? 團隊組建&#xff1a;建跨職能團隊&#xff0c;包括產品經理、UI/UX 設計師、開發?員、測試?員等。 ? ??定義&#xff1a;明確團隊中各個??的職責和?作內容。 2. 需…

vim 調整字體

vim: 在vim 面板單擊右鍵&#xff0c;選擇references: terminal :也是單擊右鍵,選擇references:

UniApp 使用 u-loadmore 完整步驟

文章目錄 一、前期準備1. 安裝 uView - UI 二、使用 u-loadmore組件1. 創建頁面2. 編寫頁面代碼模板部分&#xff08;loadmore-demo.vue&#xff09;樣式部分腳本部分 三、要點補充1. u-loadmore 狀態說明2. 數據請求優化3. 性能優化4. 兼容性問題 在 UniApp 開發中&#xff0c…

Libgdx游戲開發系列教程(3)——通過柏林噪音算法地圖隨機地形

在B站刷到了隨機地圖生成的視頻,隨手學習下并做下記錄 注: 本篇使用javafx應用作演示,算是了解這個算法的使用,后續會再出篇libgdx生成地圖的示例 說明 拋開算法實現,首先認知柏林噪音算法 一般我們想要隨機數,會指定個范圍,如0.0-1.0之間任意小數,而柏林算法的結果范圍就是[…

LeetCode熱題100JS(20/100)第四天|?41. 缺失的第一個正數?|?73. 矩陣置零?|?54. 螺旋矩陣?|?48. 旋轉圖像?

41. 缺失的第一個正數 題目鏈接&#xff1a;41. 缺失的第一個正數 難度&#xff1a;困難 刷題狀態&#xff1a;1刷 新知識&#xff1a; 解題過程 思考 示例 1&#xff1a; 輸入&#xff1a;nums [1,2,0] 輸出&#xff1a;3 解釋&#xff1a;范圍 [1,2] 中的數字都在數組中…

e2studio開發RA2E1(17)---- ADC掃描多通道采樣

e2studio開發RA2E1.17-- ADC掃描多通道采樣 概述視頻教學樣品申請硬件準備參考程序源碼下載ADC屬性配置回調函數主程序演示結果 概述 在嵌入式系統中&#xff0c;ADC&#xff08;模數轉換器&#xff09;是一個非常重要的組件&#xff0c;它將模擬信號轉換為數字信號。為了提高…

FPGA標準庫-Open Logic

在現代技術發展的浪潮中&#xff0c;開源項目已經成為了推動技術創新和發展的核心力量。無論是人工智能、區塊鏈、云計算&#xff0c;還是傳統的嵌入式開發、操作系統&#xff0c;開源項目都在其中扮演著至關重要的角色。它們不僅促進了技術的快速迭代&#xff0c;也為全球開發…

FineReport 操作注意

1.父單元格重復的時候&#xff0c;如何取消合并 效果如下&#xff1a; 只需要在單元格中&#xff0c;將數據設置為【列表】即可。 2.待定

開源之夏經驗分享|Koupleless 社區黃興抗:在開源中培養工程思維

開源之夏經驗分享&#xff5c;Koupleless 社區黃興抗&#xff1a;在開源中培養工程思維 文|黃興抗 電子信息工程專業 Koupleless 社區貢獻者 就讀于南昌師范學院&#xff0c;電子信息工程專業的大三學生。 本文 2634 字&#xff0c;預計閱讀 7? 分鐘? 今天 SOFAStack 邀…

Ollama存在安全風險的情況通報及解決方案

據清華大學網絡空間測繪聯合研究中心分析&#xff0c;開源跨平臺大模型工具Ollama默認配置存在未授權訪問與模型竊取等安全隱患。鑒于目前DeepSeek等大模型的研究部署和應用非常廣泛&#xff0c;多數用戶使用Ollama私有化部署且未修改默認配置&#xff0c;存在數據泄露、算力盜…

線代[9]|線性代數主要內容及其發展簡史(任廣千《線性代數的幾何意義》的附錄1)

文章目錄 向量行列式矩陣線性方程組二次型 向量 向量又稱為矢量&#xff0c;最初應用與物理學。很多物理量如力、速度、位移以及電場強度、磁感應強度等等都是向量。大約公元前350年前&#xff0c;古希臘著名學者亞里士多德就知道了力可以表示成向量&#xff0c;兩個力的組合作…

H20半精度推理報錯:Floating point exception (core dumped)

Nvidia H20 顯卡在執行bf16&#xff0c;f16推理時程序異常中斷 時間是 2025年3月4日 課題組新到的8卡H20服務器在使用過程中&#xff0c;torch加載模型進行bf16的推理時&#xff0c;出現Floating point exception (core dumped)錯誤 當時一頭霧水&#xff0c;后來苦苦尋找&…

服務是否設置為開機自啟動

在 Linux 系統中&#xff0c;可以通過以下幾種方法檢查服務是否設置為開機自啟動&#xff1a; 方法 1&#xff1a;使用 systemctl 命令&#xff08;適用于 systemd 系統&#xff09; systemctl 是 systemd 系統的命令行工具&#xff0c;用于管理系統服務。以下是具體步驟&…

QT——基于 QListWidget 和 QStackedWidget 的頁面切換

Qt 練習題&#xff1a;基于 QListWidget 和 QStackedWidget 的頁面切換 Qt 練習題&#xff1a;基于 QListWidget 和 QStackedWidget 的頁面切換 題目描述&#xff1a; 請使用 Qt 設計一個窗口&#xff0c;其中包含一個 QListWidget 和一個 QStackedWidget。要求實現以下功能&a…

DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)示例2: 分頁和排序

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏+關注哦 ?? 目錄 DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)示例2: 分頁和排序??前言??頁面效果??指令…

C語言文件操作學習筆記:從基礎到實踐

在C語言的知識體系中&#xff0c;文件操作是極為關鍵的一環&#xff0c;它賦予了程序存儲和讀取外部數據的能力&#xff0c;對于開發各類實用程序至關重要。近期&#xff0c;借助課程的學習&#xff0c;我對C語言文件操作進行了系統且深入的學習&#xff0c;下面將我的學習心得…

VLM-E2E:通過多模態駕駛員注意融合增強端到端自動駕駛

25年2月來自香港科大廣州分校、理想汽車和廈門大學的論文“VLM-E2E: Enhancing End-to-End Autonomous Driving with Multimodal Driver Attention Fusion”。 人類駕駛員能夠利用豐富的注意語義&#xff0c;熟練地應對復雜場景&#xff0c;但當前的自動駕駛系統難以復制這種能…

第十天-字符串:編程世界的文本基石

在編程的廣闊領域中&#xff0c;字符串是極為重要的數據類型&#xff0c;它就像一座橋梁&#xff0c;連接著人類的自然語言和計算機能夠理解與處理的數字信息。下面&#xff0c;讓我們深入探索字符串的世界。 一、字符串簡介 字符串是由零個或多個字符組成的有序序列&#xff…