STM32收發數據包中間件——ProtoFlow,更方便的打包解包助手

引言

在嵌入式開發中,數據包封裝是不可或缺的一環。手動編寫協議不僅耗時,還容易出錯。ProtoFlow 的出現,就是為了讓數據包封裝變得簡單、高效、可靠。它不僅占用資源少,還能適配多種場景,是你項目的理想助手。
項目地址:Github倉庫:https://github.com/nanwanuser/ProtoFlow

項目簡介

ProtoFlow 是一個專為數據包封裝和解析設計的輕量級協議棧,旨在幫助嵌入式開發者快速、高效地處理數據打包需求。無論你的項目使用串口、SPI、I2C,還是 CAN 等通信方式,ProtoFlow 都能提供靈活、可配置的數據包封裝功能,讓你專注于核心開發,而無需為通信細節操心。

為什么選擇 ProtoFlow?

在嵌入式開發中,數據包封裝是不可或缺的一環。手動編寫協議不僅耗時,還容易出錯。ProtoFlow 的出現,就是為了讓數據包封裝變得簡單、高效、可靠。它不僅占用資源少,還能適配多種場景,是你項目的理想助手。

ProtoFlow 的核心亮點

  • 專注于數據包封裝:提供靈活的幀結構,支持動態長度數據包(最大 256 字節)。
  • 輕量高效:協議棧占用不到 2KB Flash,適合資源有限的 MCU。
  • 多場景適用:支持串口、SPI、I2C、CAN 等多種通信方式的數據包封裝。
  • 可靠傳輸:可選 CRC16 校驗,確保數據完整性。
  • 簡單易用:直觀的 API 和示例代碼,快速集成到 STM32 項目中。

ProtoFlow 項目

特性

  • 輕量級協議棧(<2KB Flash)
  • 支持動態長度數據包(最大 256 字節)
  • 可配置幀頭幀尾(默認 0xAA55/0x55AA)
  • 支持 CRC16 校驗(可選啟用)
  • 狀態機驅動解析(9 種解析狀態)
  • 全中斷驅動設計(零阻塞)
  • 自動重同步機制
  • 多通信方式支持:不僅限于串口,可擴展到 SPI、I2C、CAN 等
  • 適用于多種數據通信場景

快速開始

1. 添加文件到工程

# 復制以下文件到 STM32 工程目錄
protoflow.h protoflow.c

2. 協議配置(protoflow.h)

// 幀結構配置
#define FRAME_HEADER      0xAA55      // 2 字節幀頭
#define FRAME_END         0x55AA      // 2 字節幀尾
#define MAX_DATA_LENGTH   256         // 最大數據長度
#define USE_CRC16         1           // 啟用 CRC16 校驗(0-禁用 1-啟用)// 硬件抽象聲明(用戶必須實現)
void user_transmit(uint8_t *data, uint16_t len);  // 通信發送函數(支持多種通信方式)

3. 示例代碼集成(以串口為例)

// main.c
#include "protoflow.h"int main(void) {// HAL 初始化MX_USART1_UART_Init();protoflow_init();  // 協議棧初始化while(1) {// 主循環處理}
}// 串口接收中斷回調
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if(huart->Instance == USART1) {uint8_t data = huart->Instance->DR;parse_byte(data);  // 字節解析}
}

API 說明

數據打包發送

/*** @brief  打包并發送數據* @param  cmd    : 命令字(1 字節)* @param  data   : 有效載荷數據指針* @param  len    : 數據長度(0~MAX_DATA_LENGTH)* @retval 實際發送的數據包長度*/
uint16_t pack_data_transmit(uint8_t cmd, uint8_t *data, uint16_t len);

數據解析

/*** @brief  解析接收字節(將接收到的字節傳入,解析后在 user_package_handler 中使用數據包)* @param  byte : 接收到的字節*/
void parse_byte(uint8_t byte);

回調函數(用戶實現)

/*** @brief  完整數據包回調* @param  cmd  : 接收到的命令字* @param  data : 數據緩沖區指針* @param  len  : 有效數據長度*/
void user_package_handler(uint8_t cmd, uint8_t *data, uint16_t len);

典型應用場景

數據發送(以串口為例)

// 發送溫濕度傳感器數據
void send_sensor_data(float temp, float humidity) {uint8_t payload[4];// 轉換為 16 位整型(0.1℃ 精度)uint16_t temp_raw = (uint16_t)(temp * 10);uint16_t humi_raw = (uint16_t)(humidity * 10);payload[0] = temp_raw >> 8;payload[1] = temp_raw & 0xFF;payload[2] = humi_raw >> 8;payload[3] = humi_raw & 0xFF;pack_data_transmit(0x01, payload, sizeof(payload));  // 自動發送
}

數據接收處理

// 接收控制指令(示例:PWM 控制)
void user_package_handler(uint8_t cmd, uint8_t *data, uint16_t len) {switch(cmd) {case 0xA1:  // 電機控制if(len == 4) {uint16_t speed = (data[0] << 8) | data[1];uint16_t duration = (data[2] << 8) | data[3];set_motor(speed, duration);}break;case 0xA2:  // LED 亮度調節if(len == 2) {uint16_t brightness = (data[0] << 8) | data[1];set_led_brightness(brightness);}break;}
}

移植指南

必須實現的硬件接口

ProtoFlow 支持多種通信方式,用戶需根據具體硬件實現發送函數。例如:

串口:

void user_transmit(uint8_t *data, uint16_t len) {HAL_UART_Transmit(&huart1, data, len, 100);
}

SPI:

void user_transmit(uint8_t *data, uint16_t len) {HAL_SPI_Transmit(&hspi1, data, len, 100);
}

I2C:

void user_transmit(uint8_t *data, uint16_t len) {HAL_I2C_Master_Transmit(&hi2c1, DEVICE_ADDR, data, len, 100);
}

配置步驟

  1. 在 protoflow.h 中配置協議參數(幀頭、幀尾、最大數據長度、CRC16 等)
  2. 根據通信方式實現 user_transmit 發送函數
  3. 實現 user_package_handler 數據回調函數
  4. 在通信接收中斷中調用 parse_byte()(如串口接收中斷)
  5. 調用 protoflow_init() 初始化協議棧

注意事項

  • 幀結構:Header(2) + Length(2) + Cmd(1) + Data(n) + CRC16(2) + End(2)
  • 數據長度字段:包含命令字(1 字節)+ 數據長度
  • CRC16:啟用時數據包增加 2 字節校驗碼
  • DMA 建議:使用 DMA 傳輸時,保持緩沖區有效直到發送完成

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

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

相關文章

Xcode16.1使用MonkeyDev運行Tiktok報錯分析

問題1&#xff1a; Build input files cannot be found: /usr/lib/libc.dylib, /usr/lib/libstdc.dylib. Did you forget to declare these files as outputs of any script phases or custom build rules which produce them? 解決辦法&#xff1a;在TARGETS的dylib中的Bui…

R語言交互項-formula

R語言交互項-formula 交互項的模型交互項的幾種情形連續變量和連續變量連續變量和分類變量分類變量和分類變量總結交互項的模型 統計中的交互和相關是完全不同的兩個概念,交互項是指兩個或者多個變量對因變量的協同效應,關注變量對因變量的聯合影響,比如變量X對Y的影響是否因…

圖解AUTOSAR_SWS_IPDUMultiplexer

AUTOSAR IPDUMultiplexer模塊詳解 PDU復用器模塊架構與實現分析 目錄 1. IPDU Multiplexer概述2. 模塊配置模型 2.1 配置結構概述2.2 配置類詳解2.3 配置關系說明3. 架構設計 3.1 模塊位置與接口3.2 內部組件結構3.3 接口交互模式4. 操作序列 4.1 PDU傳輸流程4.2 PDU傳輸流程詳…

手機怎么換網絡IP有什么用?操作指南與場景應用?

在數字化時代&#xff0c;手機已經成為我們日常生活中不可或缺的一部分&#xff0c;無論是工作、學習還是娛樂&#xff0c;手機都扮演著至關重要的角色。而在手機的使用過程中&#xff0c;網絡IP地址作為設備在互聯網上的唯一標識符&#xff0c;其重要性和作用不容忽視。本文將…

CH32V208GBU6沁恒協議棧BUG:在主機Write的同一包notify會造成主機一直Write不成功

從事嵌入式單片機的工作算是符合我個人興趣愛好的,當面對一個新的芯片我即想把芯片盡快搞懂完成項目賺錢,也想著能夠把自己遇到的坑和注意事項記錄下來,即方便自己后面查閱也可以分享給大家,這是一種沖動,但是這個或許并不是原廠希望的,盡管這樣有可能會犧牲一些時間也有哪天原…

unsloth微調QwQ32B(4bit)

unsloth微調QwQ32B(4bit) GPU: 3090 24G unsloth安裝部署 pip 安裝 pip install unsloth --index https://pypi.mirrors.usrc.edu.cn/simplesource /etc/network_turbopip install --force-reinstall --no-cache-dir --no-deps githttps://github.com/unslothai/unsloth.git?…

JavaScript案例0322

以下是一些涵蓋不同高級JavaScript概念和應用的案例&#xff0c;每個案例都有詳細解釋&#xff1a; 案例1&#xff1a;實現 Promise/A 規范的手寫 Promise class MyPromise {constructor(executor) {this.state pending;this.value undefined;this.reason undefined;this.o…

Dify 0.15.3 輸入變量無法被重新賦值問題-解決方法

目錄 一、問題描述 二、解決方法 2.1 原因 2.2 修改源碼 2.3 重新打包 dify-api 鏡像 2.4 修改 docker-compose.yaml 文件 2.5 重啟啟動鏡像 一、問題描述 Dify 0.15.3 是一個比較穩定的版本&#xff0c;Dify 1.0 是一個大版本更新&#xff0c;目前還有很多 Bug。但是&a…

SQL Server查詢計劃操作符(7.3)——查詢計劃相關操作符(11)

7.3. 查詢計劃相關操作符 98&#xff09;Table Scan&#xff1a;該操作符從查詢計劃參數列確定的表中獲取所有數據行。如果其參數列中出現WHERE:()謂詞&#xff0c;則只返回滿足該謂詞的數據行。該操作符為邏輯操作符和物理操作符。該操作符具體如圖7.3-98節點1所示。 圖 7.3-…

數據庫練習2

目錄 1.向heros表中新增一列信息&#xff0c;添加一些約束&#xff0c;并嘗試查詢一些信息 2.課堂代碼練習 插入語句 INSERT INTO 刪除語句DELETE和TRUNCATE 更新語句UPDATE和replace 查詢語句SELECT 條件查詢 select語句中的特殊情況 ???查詢排序 order by 分組查詢…

Java架構師成長之路

概述 本教程主要從6個方面&#xff0c;全面講解Java技術棧的知識。 1.性能調優 深入理解MySQL底層原理、索引邏輯&#xff0c;數據結構與算法。使用Explain進行優化分析MVCC原理剖析日志機制解析 2.框架源碼 掌握Spring底層原理帶你手寫一個Spring解析IOC、AOP源碼、以及事…

資金管理策略思路

詳細描述了完整交易策略的實現細節&#xff0c;主要包括輸入參數、變量定義、趨勢判斷、入場與出場條件、止損與止盈設置等多個方面。 輸入參數&#xff08;Input&#xff09;&#xff1a; EntryFrL (.6)&#xff1a;多頭入場的前一日波動范圍的倍數。 EntryFrS (.3)&#xff1…

k8s--集群內的pod調用集群外的服務

關于如何讓同一個局域網內的Kubernetes服務的Pod訪問同一局域網中的電腦上的服務。 可能的解決方案包括使用ClusterIP、NodePort、Headless Service、HostNetwork、ExternalIPs&#xff0c;或者直接使用Pod網絡。每種方法都有不同的適用場景&#xff0c;需要逐一分析。 例如&…

數據模型,數據建模,組件,核心價值,使用,意義

數據模型 一組由符號,文本組成的集合, 用以準確表達信息景觀, 達到有效交流,溝通的目的 數據建模 是發現,分析和確定數據需求的過程,是一種稱為數據模型的精確形式表示和傳遞這些需求 數據模型的組件 實體, 關系, 屬性和域 數據模型的核心價值 交流性 精確性 數據模型的…

【QA】外觀模式在Qt中有哪些應用?

1. QWidget及其布局管理系統 外觀模式體現 QWidget 是Qt中所有用戶界面對象的基類&#xff0c;而布局管理系統&#xff08;如 QVBoxLayout、QHBoxLayout、QGridLayout 等&#xff09;就像是一個外觀類。客戶端代碼&#xff08;開發者編寫的界面代碼&#xff09;通常不需要直接…

解鎖云原生后端開發新姿勢:騰訊云大模型API實戰攻略

目錄 云原生后端與大模型融合的開篇之章? 探秘云原生后端開發? 云原生后端是什么? 云原生后端架構核心要素? 微服務架構? 容器化技術? 服務發現與配置管理? Kubernetes 編排? 走進騰訊云大模型知識引擎? 引擎獨特功能與優勢? DeepSeek - R1、V3 兩款模型 …

AWS NoSQL解決方案全景圖

&#xff08;技術架構對比表&#xff09; 服務名稱數據模型協議兼容性核心架構特性適用場景DynamoDB鍵值/文檔原生API分布式SSD、自動分片高并發事務處理DocumentDB文檔型MongoDB 4.0存儲計算分離、6副本日志體系JSON數據聚合分析MemoryDB鍵值流數據Redis 6.2多AZ持久化、微秒…

【拒絕算法PUA】LeetCode 2116. 判斷一個括號字符串是否有效

目錄 系列文章目錄 專題總結&#xff1a; C刷題技巧總結&#xff1a; 題目 2116. 判斷一個括號字符串是否有效 難度 描述 解題方法1 系列文章目錄 專題總結&#xff1a; 【拒絕算法PUA】0x00-位運算【拒絕算法PUA】0x01- 區間比較技巧【拒絕算法PUA】0x02- 區間合并技…

常見中間件漏洞攻略-Tomcat篇

一、 CVE-2017-12615-Tomcat put方法任意文件寫入漏洞 第一步&#xff1a;開啟靶場 第二步&#xff1a;在首頁抓取數據包&#xff0c;并發送到重放器 第三步&#xff1a;先上傳嘗試一個1.txt進行測試 第四步&#xff1a;上傳后門程序 第五步&#xff1a;使用哥斯拉連接 二、后…

《精益創業》第十三章《尾聲:杜絕浪費》總結

核心思想&#xff1a; “杜絕浪費”是精益創業的終極目標與核心理念&#xff0c;其本質是通過系統性識別并消除一切不創造用戶價值的活動&#xff0c;將有限資源聚焦于真正驅動增長的“價值流”。浪費不僅指物質損耗&#xff0c;更包括時間、人力與機會成本的隱性流失。 一、精…