前言

如果程序员配电脑要干点什么酷酷的事情的话,那就自己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就是值 串口名字COMNTCHAR 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 MBtemp = 99.0f;}else if(speed > 104858){// MBtemp = speed / 1048576.0f;}else if(speed > 103){// 0.1KBtemp = 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){// MBreturn "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

串口屏自制电脑机箱监控副屏-HF035相关推荐

  1. aida64副屏背景图_仅需100元!电脑监控副屏超傻瓜解决方案

    [前言] 最近看到很多关于利用AIDA 64软件打造机箱内系统监控副屏的文章,看来灯大灯闪亮已经不能满足追求炫酷感的DIY玩家了.作为装机的老司机,自然免不了跟风想要富有未来科技感的台式机,于是攒了套 ...

  2. android 系统截屏原理,Android 系统副屏截屏功能

    收到一个客户需求,要求对双屏设备的副屏进行截图.查询资料后发现,系统截图有两种方法,一种是通过SurfaceControl.screenshot提供的接口调用,还有一种是通过screencap 命令获 ...

  3. 基于树莓派的机箱硬件监控副屏

    一.简介 监控器效果如图所示: 电脑端的服务器ui: 思路就是在电脑端建立一个小服务器读取硬件数据,然后通过局域网发送给树莓派上的客户端用以显示. 二.原理 首先读取硬件数据可以使用OpenHardw ...

  4. Linux终端怎么锁屏,自制Linux 终端 锁屏防窃助手

    很多时候我们不能一直守护在自己的电脑旁边,而且有些文件并不想让别人知道.那么这时候来个锁屏,是再合适不过的了.今天分享一个自制的锁屏工具,如下. 准备 操作系统 : 我这里是ElementaryOS虚 ...

  5. 双屏鼠标经常跑到副屏_1+1gt;2,让ipad变成你的电脑副屏

    1+1>2,让ipad变成你的电脑副屏 办公场景中,一台电脑拥有两个显示屏,在工作效率上将极大提升.不过除非专业用户,普通办公室给每个人配上两台显示器,显得过于奢侈了,因此,利用好手头的设备,打 ...

  6. 应用指定显示到副屏_广电演播领域与舞台LED租赁显示屏如何去选择LED小间距屏...

    在广电演播领域,LED小间距显示屏因不断成熟的工艺可靠性及广电级品质逐步替代传统拼接屏的存量市场,有效提升收视率与栏目播出效果.那么在该领域中,我们如何去选择一块合适的LED小间距屏? 一.细腻真实的 ...

  7. 如何将笔记本作为另一台电脑的副屏显示

    背景说明 台式电脑一个显示器不够我使用,而手头又没有多的显示器.我的笔记本有屏幕,但是不能直接连HDMI线给台式拓展屏幕.研究一段时间后发现,利用spacedesk软件可以基本完美解决这个问题. 效果 ...

  8. win7在扩展屏/副屏显示任务栏

    效果图 右边是主屏,左边是副屏 下载地址 Dual Monitor Taskbar-Dual Monitor Taskbar(双显示器任务栏工具)下载 v1.22绿色版--pc6下载站Dual Mon ...

  9. android 副屏,安卓收银机双屏(副屏)异显,主副屏通讯

    更新记录 1.0.3(2021-04-29) 1.兼容Android 8.0. 1.0.1(2020-12-08) 测试机型商米D1是,安卓版本7.1.2 查看更多 平台兼容性 Android iOS ...

最新文章

  1. 笔记本电脑的有线和无线网络同时使用,如何设置?
  2. Excel 如何使某一列的值同时乘以某一个数
  3. Linux入门-7 Linux管道、重定向以及文本处理
  4. 无法定位软件包 docker-ce_初三一模考试结束后,如何准确给孩子定位,平衡自招和裸考的关系...
  5. php运行速度检测软件,PHP执行慢分析工具xdebug + webgrind
  6. 数据结构:二叉树(BinaryTree)原理及其java实现
  7. 以前的学习笔记整理:第二层交换和生成树协议(STP)
  8. 基于JAVA+SpringBoot+Mybatis+MYSQL的快递管理系统
  9. linux下强行umount卸载设备
  10. 《iOS应用安全攻防实战》第六章:无法销毁的文件
  11. IOS应用之一--异常处理(UncaughtExceptionHandler)
  12. linux下设备树spi的节点查询,已解决: 关于ZYNQ-Linux中设备树SPI节点的疑问 - Community Forums...
  13. Java贪吃蛇游戏开发
  14. 物联网5种无线传输协议特点大汇总
  15. 浅析智能视频分析技术及其作用
  16. 【应用统计学】简单随机抽样的区间估计和样本容量的确定
  17. Java全栈工程实践
  18. 校园报修管理系统的不足与探讨
  19. 北邮矩阵论- 第1章 1.3两个特殊的线性空间
  20. 什么样的条件能够满足游戏音效制作

热门文章

  1. iOS 多线程: 信号量
  2. Vue前端npm编译报错问题总结
  3. 2022施工员-土建方向-岗位技能(施工员)试题模拟考试平台操作
  4. 简历里项目经历怎么写,没有项目经历怎么办?
  5. 【一起入门MachineLearning】中科院机器学习第*课-聚类算法:层次聚类
  6. ladybug5 ubuntu ros驱动安装说明
  7. logitech g27 matlab,HiPole 模拟赛车入门神器Logitech G27测评
  8. 多媒体信息发布终端盒的应用和功能
  9. WPF border属性
  10. 国庆临近,字节后端开发3+4面,终于拿到秋招第一个offer