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

C++开发的智能电表读数程序:支持485与计算机读取电量并存功能

C++开发的智能电表读数程序,可用485和计算机读取电量并存

最近在搞一个C++开发的智能电表读数程序,主要是通过485接口和计算机通信,读取电量并存到数据库里。说实话,这玩意儿一开始还挺让人头疼的,毕竟涉及到硬件通信和数据处理,搞不好就各种bug满天飞。不过,经过一番折腾,总算搞定了,今天就来聊聊这个过程。

首先,485通信这块儿,C++里用到了libmodbus这个库。这个库挺方便的,封装了底层的通信细节,直接调用API就能搞定。先来看一下初始化485通信的代码:

#include <modbus/modbus.h> modbus_t *ctx; ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1); if (ctx == NULL) { fprintf(stderr, "Unable to create the libmodbus context\n"); return -1; } if (modbus_connect(ctx) == -1) { fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); modbus_free(ctx); return -1; }

这段代码主要是初始化一个modbust对象,指定了串口设备、波特率、校验位等参数。如果初始化失败,程序就直接退出了。modbusconnect函数用来建立连接,失败的话也会退出并释放资源。

接下来就是读取电表数据的部分了。电表的数据一般存储在寄存器里,通过读取寄存器来获取电量信息。我们假设电量的寄存器地址是0x0001,数据类型是16位无符号整数。代码如下:

uint16_t tab_reg[1]; int rc = modbus_read_registers(ctx, 0x0001, 1, tab_reg); if (rc == -1) { fprintf(stderr, "Failed to read registers: %s\n", modbus_strerror(errno)); modbus_close(ctx); modbus_free(ctx); return -1; } uint16_t power = tab_reg[0]; printf("Current power: %d kWh\n", power);

modbusreadregisters函数用来读取寄存器数据,参数分别是上下文、寄存器地址、读取数量和存储数据的数组。如果读取失败,程序会打印错误信息并退出。成功的话,数据会存储在tab_reg数组中,我们取出第一个元素就是当前的电量值。

C++开发的智能电表读数程序,可用485和计算机读取电量并存

读取到电量后,下一步就是存到数据库里了。这里我用的是SQLite,因为它轻量级,不需要额外的数据库服务器。先来看一下数据库的初始化代码:

#include <sqlite3.h> sqlite3 *db; char *err_msg = 0; int rc = sqlite3_open("power.db", &db); if (rc != SQLITE_OK) { fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return -1; } char *sql = "CREATE TABLE IF NOT EXISTS PowerLog (id INTEGER PRIMARY KEY AUTOINCREMENT, power INTEGER, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP);"; rc = sqlite3_exec(db, sql, 0, 0, &err_msg); if (rc != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", err_msg); sqlite3_free(err_msg); sqlite3_close(db); return -1; }

这段代码打开了一个SQLite数据库文件power.db,如果文件不存在会自动创建。然后执行了一个SQL语句,创建了一个PowerLog表,用来存储电量数据。表中有三个字段:id是自增主键,power是电量值,timestamp是记录时间,默认是当前时间。

最后一步就是把读取到的电量存到数据库里:

char sql_insert[100]; sprintf(sql_insert, "INSERT INTO PowerLog (power) VALUES (%d);", power); rc = sqlite3_exec(db, sql_insert, 0, 0, &err_msg); if (rc != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", err_msg); sqlite3_free(err_msg); } sqlite3_close(db);

这里用sprintf动态生成了一条SQL插入语句,把电量值插入到PowerLog表中。如果插入失败,程序会打印错误信息。最后别忘了关闭数据库连接。

整个过程就是这样了,从485通信到读取数据,再到存储到数据库,虽然步骤不少,但每个环节都还算清晰。当然,实际项目中可能会遇到更多问题,比如通信不稳定、数据格式复杂等等,这就需要根据具体情况来调整了。不过,掌握了这些基本操作,后续的优化和扩展就会容易很多。

http://www.jsqmd.com/news/387359/

相关文章:

  • 2026年自组网设备权威推荐榜:单兵/无人机/车载/船载自组网与抗干扰模块 - 速递信息
  • 光伏mppt扰动观察法并网模型,添加了储能模块,实现了最大功率点的稳定追踪,程序可以正常运行
  • 2026年2月反无人机与低空防御系统权威推荐榜:反无/反反无/频谱感知/融合探测/导航诱骗 - 速递信息
  • iptables 核心动作命令详解
  • GTK4 剪贴板功能实现实战
  • GTK4 拖放功能实现实战
  • 2026年高压电力电缆选购攻略:YJV22厂家实力对比,YTTW防火电缆,高压电力电缆供应厂家哪家靠谱 - 品牌推荐师
  • 2026年杭州优质的GEO优化广告公司口碑推荐,GEO优化/GEO优化AI搜索/GEO服务,GEO优化广告公司找哪家 - 品牌推荐师
  • Reactor 模型全解析 - 教程
  • 不诈骗经济学:有钱为什么他自己不赚,要让给你
  • 2026铝合金高压压铸领域,哪些供货厂家实力出众?精密铝压铸/铝压铸件/铝压铸,铝合金高压压铸产品推荐排行榜 - 品牌推荐师
  • 导师又让重写?AI论文软件 千笔·专业学术智能体 VS 云笔AI,专科生专属神器!
  • Day35仿新浪固定头部
  • 学术论文辅导机构对比:2026年学生反馈分析,考博面试辅导/考博择校指导/申博辅导,学术论文辅导公司推荐排行 - 品牌推荐师
  • C#-使用OpenTK渲染3D模型
  • 毕业论文神器!更贴合继续教育的降AI率网站 千笔·专业降AIGC智能体 VS 灵感ai
  • 用数据说话 10个AI论文写作软件测评:研究生毕业论文+开题报告高效工具推荐
  • 看完就会:AI论文网站 千笔 VS 灵感风暴AI,研究生写作更高效!
  • 发布园子的第一个B站视频!提前祝大家春节快乐!
  • 主流盒马鲜生礼品卡回收方式 - 京顺回收
  • [LangGraph] Command指令
  • 好用还专业!9个降AI率工具测评:本科生必看的降AI率神器
  • 别再瞎找了!10个降AIGC工具测评:自考降AI率全攻略
  • 柑橘叶子病害检测数据集VOC+YOLO格式1102张4类别
  • 07]Delphi10.3中Richedit中的链接可以点击
  • 2026船用减压阀选购指南:这些品牌备受好评,船用减压阀/船用防浪阀/船用疏水阀/船用安全阀,船用减压阀企业推荐 - 品牌推荐师
  • tj
  • 看完就会:10个AI论文软件测评!专科生毕业论文+开题报告神器推荐
  • 研究生必看!全网爆红的AI论文工具 —— 千笔·专业学术智能体
  • 深度测评 8个AI论文写作软件:研究生毕业论文与科研写作必备工具全解析