如何设计算法在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
相关产品推荐
相关产品推荐

