串口屏自制电脑机箱监控副屏-HF035

news2024/11/26 2:51:21

前言

        如果程序员配电脑要干点什么酷酷的事情的话,那就自己DIY一个机箱监控副屏吧。监控副屏在某宝最便宜也要上百块,本文介绍了怎么使用成本几十块的串口屏模块从0开始完成一个酷炫的机箱监控副屏。主要是软件编程较多,仅涉及到一点硬件知识,可放心食用。

先睹为快

环境准备

  • 确保本地有C/C++编译环境, 可下载安装Cygwin或者MinGW。
  • 确保有串口驱动,一般win10都自带。
  • HF035串口屏和USB转TTL模块。
  • 下载安装HF035串口屏的界面设计软件sGUI,和相关开发资料,点击此处下载(报毒请忽略),也可进入厂商官网进行下载:厂商官网。

界面设计

        串口屏厂商一般都会提供一个界面设计的软件,在软件内可以拖拽式的进行界面布局设计,软件使用教程请参考屏幕厂商资料,设计过程此处不详述,与个人审美有关,这里简单的进行了一些组件的排列(又不是不能用)。建议将更多的美化设计下沉到背景底图上,使用PS等专业软件进行底图产出,只使用串口屏的文本、数字等组件用来实现功能。 

         在界面设计好后使用串口下载到屏幕中,此时屏幕上应该就可以显示出界面了。这里需要注意的是在下载过程时选择正确的COM端口,波特率使用默认的115200。TTL调试器的接线需要注意RX和TX是一一对应的,RX接板子的RX,TX接板子的TX,这块屏幕是厂商故意这么设计的,与正常的RX接TX,TX接RX不同。

串口屏语法

        串口屏的程序是使用串口协议发送厂商规定格式的数据到屏幕上进行显示,这块板子使用的是字符串的方式进行数据组织,所以在写程序时比较简单,发送类似如下的字符串到指定COM口即可。

SET_NUM(0,10,2);SET_TXT(0,'KB');\r\n

         其中SET_NUM函数的0代表组件的id,10代表具体的数值,2代表数值总共占两位。其中的SET_TXT函数的0代表组件的id,‘KB’代表具体显示的文本值。多个函数可以多次分开发送,也可连接一起发送,厂商使用‘\r\n’作为分隔符,所以一定需要在末尾带上分隔符,否则串口屏会一直等待接收。其余API可参考串口屏厂商文档。

程序设计

        为了监控硬件和网络信息,我们可以使用非常好用的一款软件:TrafficMonitor,此软件的优点请自行搜索,绝对是小而美的精品软件,官方仓库地址,目前已有27.5k的star,鄙人已使用多年,墙裂推荐。

        TrafficMonitor在v1.82版本新增了插件系统,意味着可以使用其提供的硬件监控数据进行自定义的显示,提供了无限的想象空间。我们可以使用它的插件系统获取硬件数据,然后通过串口将数据发送到屏幕进行显示。程序设计要点可以分为串口自动扫描连接、硬件数据获取与发送两个方面,下面分别进行介绍。

串口自动扫描连接

        串口方面的操作使用的是C++标准库windows.h进行实现,具体代码也是借鉴了他人的一些代码,这里找不到仓库地址了,不过可以直接照搬我的实现,原理都是一样的。主要难点就是扫描串口,我是在注册表Hardware\\DeviceMap\\SerialComm中进行遍历查找串口的。在程序中编写了一个autoConnect方法,主要功能就是扫描注册表,然后逐个进行连接,返回第一个连接成功的串口,这种写法有一定局限,比如不能适应多串口的场景,对于有特殊需求的读者可以自行修改相关代码。


bool SerialPort::autoConnect()
{
    HKEY hkey;
    int result;
    int i = 0;
    result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Hardware\\DeviceMap\\SerialComm", NULL, KEY_READ, &hkey);
    if (ERROR_SUCCESS == result) //打开串口注册表
    {
        do
        {
            TCHAR portName[0x100] = {0}; //portName是注册表名称(不是设备管理器里的前缀),commName就是值 串口名字COMN
            TCHAR commName[0x100] = {0};
            DWORD dwSize = sizeof(portName) / sizeof(TCHAR);
            DWORD dwLong = dwSize;
            result = RegEnumValue(hkey, i, portName, &dwLong, NULL, NULL, (LPBYTE)commName, &dwSize);
            if (ERROR_NO_MORE_ITEMS == result)
            {
                break;
            }                                            //   枚举串口
            // printf("%d %s %s\n", i, portName, commName); //显示名称及值

            char buff[30];
            sprintf(buff, "\\\\.\\%s", commName);
            // printf("try connect %s\n", buff);
            bool state = this->openSerial(buff);
            // printf("state = %d, connected = %d\n", state, this->connected);
            if (state && this->connected)
            {
                break;
            }

            i++;
        } while (TRUE);
        RegCloseKey(hkey); //关闭注册表
    }
    return -1; //没找到特定串口
}

硬件数据获取与发送

        TrafficMonitor的插件系统会定时回调OnMonitorInfo函数,会传递进来一个包含监控数据的对象,我们只需实现OnMonitorInfo函数,然后解析获取想要的监控数据即可,关于插件编写的细节具体可参考官方的插件开发指南。在获取到数据后按照串口的数据格式要求进行组装,这里我们使用sprintf将所有数据组合后一次性发送。在实测过程中串口屏的刷新率比较低,达到了200ms,所以有明显的刷屏视觉感知,我们在刷屏时将刷新的内容乱序发送,可以减少一些人眼的刷屏感知时间。


void HF035::OnMonitorInfo(const MonitorInfo& monitor_info)
{
    // 日志调试
	// FILE* fp = fopen("hf035.log", "a+");
    char buf[255];
    // 上行网速
    this->formatSpeed(monitor_info.up_speed, this->speedStr1);
    // 下行网速
    this->formatSpeed(monitor_info.down_speed, this->speedStr2);
    // 乱序格式化串口数据,注意末尾必须‘\r\n’
    sprintf(buf, "SET_TXT(8,'%s');SET_TXT(9,'%s');SET_NUM(0,%d,2);SET_TXT(11,'%s');SET_NUM(1,%d,2);SET_TXT(10,'%s');SET_NUM(2,%d,2);SET_NUM(7,%d,2);SET_NUM(3,%d,2);SET_NUM(6,%d,2);SET_NUM(4,%d,2);SET_NUM(5,%d,2);\r\n",
        //上行网速尾标
        this->getSpeedPix(monitor_info.up_speed),
        //下行网速尾标
        this->getSpeedPix(monitor_info.down_speed),
        // CPU使用率
        this->formatUsage(monitor_info.cpu_usage),
        this->speedStr2,
        // CPU温度
        this->formatUsage(monitor_info.cpu_temperature),
        this->speedStr1,
        // GPU使用率
        this->formatUsage(monitor_info.gpu_usage),
        // 硬盘温度
        this->formatUsage(monitor_info.hdd_temperature),
        // GPU温度
        this->formatUsage(monitor_info.gpu_temperature),
        // 硬盘使用率
        this->formatUsage(monitor_info.hdd_usage),
        // 内存使用率
        this->formatUsage(monitor_info.memory_usage),
        // 主板温度
        this->formatUsage(monitor_info.main_board_temperature));

    // 如果已连接则进行发送,否则进行自动重连
    if(this->serialPort->isConnected()){
        // 发送串口数据
        this->serialPort->writeSerialPort(buf, strlen(buf));
    }else{
        // fwrite("autoConnect\n", 1, 13, fp);
        // 自动扫描连接串口
        this->serialPort->autoConnect();
    }

	// 关闭文件
	// fclose(fp);
    // printf("cpu: %d \n", monitor_info.cpu_usage);
}

/* 格式化使用率,保证数值长度不超过2位,避免界面超出 */
int HF035::formatUsage(int num)
{
    return num < 0 ? 0 : (num > 99 ? 99 : num);
}

/* 格式化网速,最大显示99MB,最小显示0.1KB*/
void HF035::formatSpeed(unsigned long long speed, char * buf)
{
    float temp = 0.1f;
    if(speed > 103809024){
        // 99 MB
        temp = 99.0f;
    }else if(speed > 104858){
        // MB
        temp = speed / 1048576.0f;
    }else if(speed > 103){
        // 0.1KB
        temp = speed / 1024.0f;
    }
    // 数值大于2位时不显示小数,避免界面超出
    if(temp > 9.9f){
        sprintf(buf, "%d", (int)temp);
    }else{
        sprintf(buf, "%.1f", temp);
    }
}

/* 获取网速后缀 */
char * HF035::getSpeedPix(unsigned long long  speed)
{
    if(speed > 1048576){
        // MB
        return "M";
    }
    return "K";
}

编译运行

        TrafficMonitor要求编译为dll后放到插件目录,然后重启软件即可自动加载插件运行,如果一切正常就可以看到屏幕上的内容每两秒会更新一次。

编译命令:

g++ HF035.cpp SerialPort.cpp  -lstdc++ -shared -o HF035.dll

将HF035.dll放到插件目录C:\Program Files\TrafficMonitor\plugins,重启软件即可看到插件加载成功:

 完整项目地址:https://github.com/printlin/computerMonitorScreen

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/616221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在迷茫之中找到职业发展的方向!软件测试人员的迷茫

目录 出现迷茫或焦虑的原因是什么&#xff1f; 1、敏捷和DevOps开发模式的推行 2、测试的天花板比较低&#xff0c;自己上升的空间比较小 3、35岁是一个门槛&#xff0c;许多人也担心到了这个年龄 4、测试工作被机器人替代 如何走出迷茫&#xff1f; 1、坚守现在的测试岗位&am…

解决鞋业管理难题:低代码平台的应用与实践

如今&#xff0c;低代码平台正在逐渐发展成为一个重要的系统开发方式。与传统的编码方式相比&#xff0c;低代码平台更加注重“可视化”和“快速开发”。在这种情况下&#xff0c;低代码平台的应用范围也在不断拓展。在鞋业管理中&#xff0c;低代码平台也逐渐成为一种重要的技…

从小白到大神之路之学习运维第34天---第三阶段---mysql数据库之优化数据库、数据库备份、win10客户端连接

第三阶段基础 时 间&#xff1a;2023年6月6日 参加人&#xff1a;全班人员 内 容&#xff1a; Mysql数据库 目录 前提环境配置 优化 MySQL 数据库备份 Win10客户端连接 前提环境配置 关闭防火墙 &#xff08;systemtl stop firewalld、iptables -F、setenforce 0&#xff09;…

Linux线程互斥与同步

目录 &#x1f351;一、线程互斥 1.1、进程线程间互斥相关背景概念 1.2、互斥量mutex 1.3、互斥量的接口 1.4、互斥量使用 1.5、互斥量实现原理探究 1.6、RAII风格的设计加锁 1.7、可重入VS线程安全 &#x1f351;二、常见锁概念 2.1、死锁 &#x1f351;三、Linux线…

HTML 标签的学习

1.HTML 的结构 前端三剑客: HTML CSS JS,本章我们学习的是HTML HTML > 超文本标记语言 HTML代码是由"标签"构成的. 形如 <body>hello</body>标签名 (body) 放到 < > 中大部分标签成对出现. 为开始标签, 为结束标签.少数标签只有开始标签…

Windows系统图标混乱(丢失)

1. 进入文件夹选项设置显示隐藏系统文件 2. &#xff08; Win7&#xff09;进入 C:\\Users\\%username%\\AppData\\Local 删除&#xff1a;IconCache.db (Win10/Win8.1) 进入 C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Windows\\Explorer\\ 删除一系列iconcache…

网络协议——STP协议是什么?是如何实现的?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、STP协议是什么 二、为什么需要STP协议 三、STP的实现过程 ​编辑 1、选举跟桥 2、给非跟桥交换机选举跟端口 3、给每个网段选…

高性能计算究竟是不是好的职业方向?

你只恍惚听人说高性能计算小众&#xff0c;你却不知道前因后果 你只仿佛听人说高性能计算很难&#xff0c;你却不曾尝试过并行 你只知道国内高性能计算就业机会不算很多&#xff0c;你却不知道国外早已如火如荼 你不知道自己的路怎么走&#xff0c;却忘记该看看别人的路怎么…

活动预告 | 中国数据库联盟(ACDU)中国行定档深圳,一起揭秘数据库前沿技术

在当今数字化时代&#xff0c;数据库是各行各业中最核心的信息管理系统之一。随着技术的飞速发展&#xff0c;数据库领域也不断涌现出新的前沿技术和创新应用。数据库运维和开发人员需要紧跟前沿技术&#xff0c;才能保持竞争力&#xff0c;并实现更高效、更智能、更人性化的应…

oGSP运维服务分论坛精彩回顾 | openGauss Developer Day 2023

5月26日&#xff0c;以“聚数成峰&#xff0c;共赢未来”为主题的openGauss Developer Day 2023在北京举办 &#xff0c;oGSP&#xff08;oGSP全称为openGauss Service Partner&#xff09;运维服务分论坛作为大会重要环节&#xff0c;也在26日下午成功举行。 出席此次活动的领…

跨境电商独立站搭建-跨境电商源码网站开发部署,独立站技术

跨境电商独立站是指在国际互联网上建立并拥有自己独立的电商网站&#xff0c;在该网站上进行跨境电商业务&#xff0c;包括产品展示、交易处理、支付结算、物流配送等全流程。相较于在第三方平台上开店&#xff0c;跨境电商独立站具有更高的自主权和品牌形象&#xff0c;能够更…

Tomcat优化

目录 Tomcat 优化Tomcat 配置文件参数优化内核优化Tomcat JVM优化 Tomcat 优化 Tomcat默认安装下的缺省配置并不适合生产环境&#xff0c;它可能会频繁出现假死现象需要重启&#xff0c;只有通过不断压测优化才能让它最高效率稳定的运行。 优化主要包括三方面&#xff0c;分别…

安装 linux系统–Ubuntu 20.04(实体机安装)

安装 linux系统–Ubuntu 20.04(实体机安装) 一、刻录操作系统镜像到U盘 使用Rufus刻录软件进行刻录&#xff0c;采用默认设置&#xff0c;以ISO模式写入等 二、开机F12(我是dell笔记本&#xff0c;其他笔记本自行百度相应选项)&#xff0c;进入Boot Options选项 选择开机启动…

「少即是多」商业策略的背后,隐藏着怎样的客户洞察?

奉行极简主义的年轻人们口中总是叨念这样一句话&#xff1a; “Less is more&#xff08;少即是多&#xff09;。” 它最早是由德国现代建筑大师路密斯凡德罗提出的一种设计理念&#xff0c;而后逐渐演变成一种生活方式&#xff0c;甚至一种商业策略。 比如&#xff0c;知名零售…

【业务功能篇17】Springboot +shedlock锁 实现定时任务

业务场景&#xff1a;我们在业务开发过程时&#xff0c;有时需要用到一些定时功能&#xff0c;定期的执行一些数据处理&#xff0c;比如每天固定时间去执行数据&#xff0c;判断是否有符合逻辑的情况&#xff0c;就生成一个告警单&#xff0c;提供给业务查看。 这里接着上一篇技…

async函数用法

目录 1.概念 2.本质 3.语法 4.特点 5.async基本使用 6.async里的await普通函数返回值 7.async里的await Promise函数成功返回值 8.async里的await Promise函数失败返回值 9.解决async里的await Promise函数失败后不执行下面内容 1.概念 真正意义上解决异步回调的问题&am…

okta/sf平台实现saml2.0单点登录集成实战(详细步骤+完整代码)

目录 第一步&#xff1a;注册okta账号 第二步&#xff1a;配置okta应用信息 第三步&#xff1a;下载Idp.xml文件 第四步&#xff1a;okta特定配置 第五步&#xff1a;集成测试 基于SuccessFactors的单点登录实现 Github工程代码链接 小结 笔者以前写过一篇关于saml2.0单…

Barra模型因子的构建及应用系列六之Book-to-Price因子

一、摘要 在前期的Barra模型系列文章中&#xff0c;我们构建了Size因子、Beta因子、Momentum因子、Residual Volatility因子和NonLinear Size因子&#xff0c;并分别创建了对应的单因子策略&#xff0c;其中Size因子和NonLinear Siz因子具有很强的收益能力。本节文章将在该系列…

AI 协助办公 |记一次用 GPT-4 写一个消息同步 App

GPT-4 最近风头正劲&#xff0c;作为 NebulaGraph 的研发人员的我自然是跟进新技术步伐。恰好&#xff0c;现在有一个将 Slack channel 消息同步到其他 IM 的需求&#xff0c;看看 GPT-4 能不能帮我完成这次的信息同步工具的代码编写工作。 本文记录了我同 GPT 主要的交互过程…

不定积分练习

不定积分练习 在看视频的时候遇到了一道比较有趣的题&#xff0c;在这里给大家分享一下。 题目 计算 ∫ ( 1 x − 1 x ) e x 1 x d x \int(1x-\dfrac 1x)e^{x\frac 1x}dx ∫(1x−x1​)exx1​dx 解&#xff1a; \qquad 原式 ∫ e x 1 x d x ∫ x ( 1 − 1 x 2 ) e x 1…