C语言中合并多组UART传感器数据至单缓冲区以利用WirePas带宽
实现WirePas多组传感器数据合并发送的方法
核心逻辑
- 先计算单包最大容纳量:
102 ÷ 27 = 3组(3×27=81字节,剩余21字节不足以存一组) - 用静态/全局缓冲区累积数据,搭配计数器记录已存入的组数
- 每次读取传感器数据后追加到缓冲区,计数器达标(3组)时一次性发送,随后重置状态
- 处理边界场景:比如设备断电前、紧急上报时,强制发送当前累积的所有数据(哪怕不足3组)
代码示例
#include <stdint.h> #include <string.h> // 假设已有的WirePas发送接口,根据实际SDK调整参数 void wirepas_send(uint8_t *data, uint16_t len); // 假设已实现的传感器数据读取函数,返回0表示读取成功 int read_sensor_data(uint8_t *out_data); // 常量定义 #define MAX_PACKETS_PER_WIREPAS 3 // 单WirePas包最多装3组传感器数据 #define SENSOR_DATA_LEN 27 // 每组传感器数据长度 #define WIREPAS_BUF_SIZE 102 // WirePas缓冲区上限 // 累积数据用的静态变量,保证函数调用间状态不丢失 static uint8_t g_wirepas_buf[WIREPAS_BUF_SIZE]; static uint8_t g_stored_packets = 0; void handle_sensor_data(void) { uint8_t sensor_data[SENSOR_DATA_LEN]; // 读取一组传感器数据 if (read_sensor_data(sensor_data) != 0) { // 读取失败,可添加错误处理(比如日志打印) return; } // 将新数据追加到累积缓冲区 memcpy(g_wirepas_buf + g_stored_packets * SENSOR_DATA_LEN, sensor_data, SENSOR_DATA_LEN); g_stored_packets++; // 达到最大组数,触发发送 if (g_stored_packets >= MAX_PACKETS_PER_WIREPAS) { wirepas_send(g_wirepas_buf, g_stored_packets * SENSOR_DATA_LEN); // 重置状态,准备下一轮累积 g_stored_packets = 0; memset(g_wirepas_buf, 0, WIREPAS_BUF_SIZE); } } // 强制发送剩余数据的函数(可在超时、设备关机等场景调用) void flush_remaining_data(void) { if (g_stored_packets > 0) { wirepas_send(g_wirepas_buf, g_stored_packets * SENSOR_DATA_LEN); g_stored_packets = 0; memset(g_wirepas_buf, 0, WIREPAS_BUF_SIZE); } }
关键注意点
- 确认
wirepas_send接口支持发送非102字节的数据包,如果SDK要求必须填满缓冲区,可在剩余空间填充0或自定义标识字节 - 若在多线程/RTOS环境中使用,需给缓冲区和计数器加互斥锁,避免并发写入导致数据错乱
- 建议添加超时机制:比如设置定时器,超过指定时间(如10秒)没凑够3组数据,就调用
flush_remaining_data发送,防止数据长期积压
内容的提问来源于stack exchange,提问作者Hob12
相关产品推荐
相关产品推荐

