You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:50:38