当前位置: 首页 > wzjs >正文

宁波网站建设使用技巧分享卡盟网站开发

宁波网站建设使用技巧分享,卡盟网站开发,wordpress首页文章内容,自助个人免费网站C语言访问者模式详解与实践 - 传感器数据处理系统 1. 什么是访问者模式? 在嵌入式系统中,我们经常需要对不同传感器的数据进行多种处理,如数据校准、过滤、存储等。访问者模式允许我们在不修改传感器代码的情况下,添加新的数据处…

C语言访问者模式详解与实践 - 传感器数据处理系统

1. 什么是访问者模式?

在嵌入式系统中,我们经常需要对不同传感器的数据进行多种处理,如数据校准、过滤、存储等。访问者模式允许我们在不修改传感器代码的情况下,添加新的数据处理方法。

2. 为什么需要访问者模式?

  • 分离数据采集和处理逻辑
  • 便于添加新的数据处理方法
  • 避免修改现有传感器代码
  • 便于数据处理的复用
  • 结构清晰,易于维护

3. 实际应用场景

  • 多传感器数据处理
  • 数据校准和滤波
  • 传感器状态监控
  • 数据记录和分析
  • 故障诊断系统

4. 代码实现

4.1 头文件 (sensor_visitor.h)

#ifndef SENSOR_VISITOR_H
#define SENSOR_VISITOR_H#include <stdint.h>// 传感器类型
typedef enum {TEMP_SENSOR,HUMIDITY_SENSOR
} SensorType;// 传感器数据结构
typedef struct {uint16_t raw_data;    // 原始数据uint32_t timestamp;   // 时间戳SensorType type;      // 传感器类型
} SensorData;// 温度传感器
typedef struct {SensorData data;float offset;         // 温度补偿值
} TempSensor;// 湿度传感器
typedef struct {SensorData data;uint8_t threshold;    // 湿度阈值
} HumiditySensor;// 访问者接口
typedef struct {void (*visit_temp)(void* self, TempSensor* sensor);void (*visit_humidity)(void* self, HumiditySensor* sensor);void* context;        // 访问者上下文
} SensorVisitor;// 传感器操作接口
void accept_visitor(void* sensor, SensorType type, SensorVisitor* visitor);// 创建传感器
TempSensor* create_temp_sensor(uint16_t raw_data, float offset);
HumiditySensor* create_humidity_sensor(uint16_t raw_data, uint8_t threshold);// 创建访问者
SensorVisitor* create_calibration_visitor(void);   // 校准访问者
SensorVisitor* create_filter_visitor(void);        // 滤波访问者
SensorVisitor* create_alarm_visitor(void);         // 报警访问者// 销毁函数
void destroy_sensor(void* sensor);
void destroy_visitor(SensorVisitor* visitor);#endif // SENSOR_VISITOR_H

4.2 实现文件 (sensor_visitor.c)

#include "sensor_visitor.h"
#include <stdio.h>
#include <stdlib.h>// 传感器创建函数
TempSensor* create_temp_sensor(uint16_t raw_data, float offset) {TempSensor* sensor = (TempSensor*)malloc(sizeof(TempSensor));sensor->data.raw_data = raw_data;sensor->data.timestamp = 0;  // 实际应用中需要获取真实时间戳sensor->data.type = TEMP_SENSOR;sensor->offset = offset;return sensor;
}HumiditySensor* create_humidity_sensor(uint16_t raw_data, uint8_t threshold) {HumiditySensor* sensor = (HumiditySensor*)malloc(sizeof(HumiditySensor));sensor->data.raw_data = raw_data;sensor->data.timestamp = 0;sensor->data.type = HUMIDITY_SENSOR;sensor->threshold = threshold;return sensor;
}// 校准访问者实现
static void calibrate_temp(void* self, TempSensor* sensor) {float real_temp = sensor->data.raw_data * 0.1f + sensor->offset;printf("温度校准: %.1f°C (原始值: %d, 偏移: %.1f)\n", real_temp, sensor->data.raw_data, sensor->offset);
}static void calibrate_humidity(void* self, HumiditySensor* sensor) {float real_humidity = sensor->data.raw_data * 0.1f;printf("湿度校准: %.1f%% (原始值: %d)\n", real_humidity, sensor->data.raw_data);
}// 滤波访问者实现
static void filter_temp(void* self, TempSensor* sensor) {// 简单的阈值滤波if (sensor->data.raw_data > 1000) {printf("温度数据滤波: 数值异常\n");} else {printf("温度数据滤波: 数值正常\n");}
}static void filter_humidity(void* self, HumiditySensor* sensor) {if (sensor->data.raw_data > 1000) {printf("湿度数据滤波: 数值异常\n");} else {printf("湿度数据滤波: 数值正常\n");}
}// 报警访问者实现
static void alarm_temp(void* self, TempSensor* sensor) {float real_temp = sensor->data.raw_data * 0.1f + sensor->offset;if (real_temp > 50.0f) {printf("温度报警: 温度过高 (%.1f°C)\n", real_temp);}
}static void alarm_humidity(void* self, HumiditySensor* sensor) {if (sensor->data.raw_data > sensor->threshold) {printf("湿度报警: 超过阈值 %d\n", sensor->threshold);}
}// 创建访问者
SensorVisitor* create_calibration_visitor(void) {SensorVisitor* visitor = (SensorVisitor*)malloc(sizeof(SensorVisitor));visitor->visit_temp = calibrate_temp;visitor->visit_humidity = calibrate_humidity;return visitor;
}SensorVisitor* create_filter_visitor(void) {SensorVisitor* visitor = (SensorVisitor*)malloc(sizeof(SensorVisitor));visitor->visit_temp = filter_temp;visitor->visit_humidity = filter_humidity;return visitor;
}SensorVisitor* create_alarm_visitor(void) {SensorVisitor* visitor = (SensorVisitor*)malloc(sizeof(SensorVisitor));visitor->visit_temp = alarm_temp;visitor->visit_humidity = alarm_humidity;return visitor;
}// accept函数实现
void accept_visitor(void* sensor, SensorType type, SensorVisitor* visitor) {switch (type) {case TEMP_SENSOR:visitor->visit_temp(visitor, (TempSensor*)sensor);break;case HUMIDITY_SENSOR:visitor->visit_humidity(visitor, (HumiditySensor*)sensor);break;}
}// 销毁函数
void destroy_sensor(void* sensor) {free(sensor);
}void destroy_visitor(SensorVisitor* visitor) {free(visitor);
}

4.3 使用示例 (main.c)

#include "sensor_visitor.h"
#include <stdio.h>int main() {// 创建传感器TempSensor* temp_sensor = create_temp_sensor(250, -2.5f);  // 25.0°C, -2.5偏移HumiditySensor* humidity_sensor = create_humidity_sensor(650, 800);  // 65.0%, 阈值80%// 创建访问者SensorVisitor* calibration = create_calibration_visitor();SensorVisitor* filter = create_filter_visitor();SensorVisitor* alarm = create_alarm_visitor();// 处理温度传感器数据printf("=== 温度传感器处理 ===\n");accept_visitor(temp_sensor, TEMP_SENSOR, calibration);accept_visitor(temp_sensor, TEMP_SENSOR, filter);accept_visitor(temp_sensor, TEMP_SENSOR, alarm);// 处理湿度传感器数据printf("\n=== 湿度传感器处理 ===\n");accept_visitor(humidity_sensor, HUMIDITY_SENSOR, calibration);accept_visitor(humidity_sensor, HUMIDITY_SENSOR, filter);accept_visitor(humidity_sensor, HUMIDITY_SENSOR, alarm);// 清理资源destroy_sensor(temp_sensor);destroy_sensor(humidity_sensor);destroy_visitor(calibration);destroy_visitor(filter);destroy_visitor(alarm);return 0;
}

5. 代码分析

5.1 关键设计点

  1. 传感器数据结构清晰
  2. 处理逻辑分离
  3. 易于扩展新的处理方法
  4. 资源管理完善

5.2 实现特点

  1. 适合嵌入式系统
  2. 代码简洁高效
  3. 内存占用小
  4. 处理流程清晰

6. 编译和运行

gcc -c sensor_visitor.c -o sensor_visitor.o
gcc -c main.c -o main.o
gcc sensor_visitor.o main.o -o sensor_demo

7. 注意事项

  1. 内存使用要谨慎
  2. 避免过度设计
  3. 考虑实时性要求
  4. 错误处理要完善

8. 改进建议

  1. 添加数据存储功能
  2. 实现数据平滑处理
  3. 添加更多传感器类型
  4. 支持批量数据处理

9. 总结

这个例子展示了访问者模式在嵌入式系统中的实际应用。通过将传感器数据采集和处理逻辑分离,我们可以灵活地添加新的数据处理方法,同时保持代码的清晰和可维护性。

参考资料

  1. 《嵌入式系统设计》
  2. 《C语言程序设计》
  3. 《传感器技术手册》

文章转载自:

http://4RhTfdX9.rnnts.cn
http://bZ7EwdBO.rnnts.cn
http://1xZr0HYb.rnnts.cn
http://J6DlbAQv.rnnts.cn
http://FunP6Yqo.rnnts.cn
http://lF9Wz3M7.rnnts.cn
http://Ymjnz2th.rnnts.cn
http://m0QwtUkS.rnnts.cn
http://KHD2QXXF.rnnts.cn
http://MLyeiGF9.rnnts.cn
http://MVS9A8G2.rnnts.cn
http://Xe0EZc8U.rnnts.cn
http://lrsGgFeH.rnnts.cn
http://wQin8plp.rnnts.cn
http://zqCe32X9.rnnts.cn
http://o0PIWYeC.rnnts.cn
http://q0AabYbe.rnnts.cn
http://eUznQtUD.rnnts.cn
http://b3G76dqH.rnnts.cn
http://TEfMyx4P.rnnts.cn
http://neJcHJkH.rnnts.cn
http://MIFeghoP.rnnts.cn
http://mFJdbFcJ.rnnts.cn
http://t9BmNDIG.rnnts.cn
http://4gDVesuH.rnnts.cn
http://zrcyytej.rnnts.cn
http://EHnCKcVB.rnnts.cn
http://O8n55fxL.rnnts.cn
http://Z3EqdncX.rnnts.cn
http://v5SeVlKj.rnnts.cn
http://www.dtcms.com/wzjs/681311.html

相关文章:

  • 用ps做网站首页顶部图片关键词优化ppt
  • apache新建网站潍坊企业宣传片制作公司
  • 网站建设和网站搭建哪个好网站建设网页设计培训学校
  • 代加工接订单网站如何建立公司网站?
  • 手表网站哪个最好知乎网站设计一般包括什么
  • 自己的网站如何优化禹州做网站的
  • dw做网站设计建设银行校园招聘网站
  • 东莞外贸公司网站建设免费网站软件制作
  • 中国门户网站排行域名cn是个什么网站
  • 贵阳网站如何推广网站建站安全需求
  • 百度网盟 网站定向外国网页设计免费模板
  • 徐州网站建设方案维护软文代写服务
  • 雄县有做网站的吗做效果图的网站有哪些软件
  • 网站设计评价经典网站设计
  • html个人网站设计模板公司网站后台上怎么上传图片呢
  • 建高铁站赚钱吗军事新闻最新消息11
  • 郑州营销网站托管公司哈尔滨制作网站企业
  • 做视频网站收入wordpress 默认html5
  • 泰州网站开发百度竞价课程
  • 深圳罗湖高端网站建设wordpress安卓版5
  • 织梦网站字体大小重庆手机微信网站建设
  • 定制营销型网站公司网站内外链建设
  • 保定哪有做网站的东莞做网站优化的公司
  • 企业网站建设合同书html5下载教程
  • 简述建站流程有什么好的书写网站
  • 上海网站建设开发公司哪家好网络认证登录页面
  • 比较好的网站开发公司学校学生网站模板下载
  • 单页型网站ifm网站做啥的
  • 网站建设现在市场大不大手机硬件开发
  • 寒亭区建设局网站dede 手机网站插件