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

如何设计算法在C#中按指定间隔采集MCU传入的串口传感器数据

实现方案

1. 优化现有报文解析逻辑

原有解析代码存在索引越界风险,先修正为带合法性校验的版本,同时提前定义所需的全局/类成员变量:

// 存储最新有效传感器数据
private int _latestDistance = 0;
private float _latestDimension = 0f;
// 间隔采集参数,可根据实际需求修改间隔值
private int _distanceInterval = 10; // 距离间隔触发阈值,单位和报文的距离值一致
private int _lastTriggerDistance = 0; // 上次触发采集时的距离值

else if(s.StartsWith(":"))
{
    string[] parts = s.Split(';', StringSplitOptions.RemoveEmptyEntries);
    // 报文合法性校验,避免非法格式导致程序报错
    if(parts.Length >=3 
        && int.TryParse(parts[1], out int currentDistance) 
        && float.TryParse(parts[2], out float currentDimension))
    {
        // 更新最新传感器数据
        _latestDistance = currentDistance;
        _latestDimension = currentDimension;
        
        // 检查是否满足间隔触发条件
        CheckTriggerRule();
    }
}

2. 间隔触发逻辑实现

根据你的常见需求提供两种可选实现:

按距离间隔触发(每走指定距离采集一次)

private void CheckTriggerRule()
{
    // 距离差达到设定阈值时触发采集
    if(Math.Abs(_latestDistance - _lastTriggerDistance) >= _distanceInterval)
    {
        // 调用你需要执行的业务函数
        ProcessData(_latestDistance, _latestDimension);
        // 更新上次触发的距离标记
        _lastTriggerDistance = _latestDistance;
    }
}

// 自定义的采集后处理逻辑
private void ProcessData(int distance, float dimension)
{
    // 此处写你需要的业务逻辑,比如存储、显示、上传等
    Console.WriteLine($"触发采集:距离={distance},传感器读数={dimension}");
}

按时间间隔触发(每过指定时间采集一次最新数据)

如果需要按固定时间间隔采样,直接用定时器实现即可:

// 初始化定时器,示例为每500ms触发一次
private System.Timers.Timer _collectTimer = new System.Timers.Timer(500);

// 程序初始化阶段执行定时器配置
_collectTimer.Elapsed += (sender, e) =>
{
    // 直接使用最新收到的传感器数据处理即可
    ProcessData(_latestDistance, _latestDimension);
};
_collectTimer.Start();

注意事项

  • 串口数据属于多线程接收场景,如果你的处理逻辑涉及UI更新,需要通过调度器切换到UI线程执行,避免跨线程报错
  • 间隔阈值可以根据业务需求动态修改,直接给_distanceInterval或者定时器的Interval属性赋值即可

内容的提问来源于stack exchange,提问作者Teo Laferla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:27:04