使用100%缩放比例重新启动Visual Studio 界面模糊的解决方案
问题描述建议:如果是刚开始写WinForm项目 ,建议刚开始就去进行一个替换 ,要不然后面会很麻烦的 ,不仅要计算size 还要去 计算 location 的值
昨天碰到了这个问题 ,当时设置完之后界面就非常的模糊 ,虽然说界面变大了 ,但是看着异常难受 ,很模糊
解决方案
新建应用程序清单文件(Application Manifest File) , 保持默认名称 app.manifest,点击添加。
找到这段代码:
12345<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> </windowsSettings></application>
替换DPI相关配置:
1234 ...
04-Modbus RTU通信测试软件开发
前一部分我们写好了一个 Modbus RTU 通信库,但那个库是”没有脸”的——你只能在代码里写死参数去调用,看不到也摸不着。这一部分,我们给它配上一张”脸”:做一个图形界面软件,让你在窗口里点按钮、看数据,真正体验”上位机”是什么感觉。
这一部分用的是 WinForm(而不是 WPF)。WinForm 的特点是”拖控件 + 写代码”,不需要写 XAML,非常适合刚入门的你。我们一边拖控件设计界面,一边写事件代码,把这个测试软件一点点做出来。
先新建一个 WinForm 项目;
把上一部分的通信库加进来(直接复用,不用重写);
拖控件设计界面(4.1);
写”参数初始化 + 串口连接”代码(4.2);
逐个功能写测试代码(4.3 到 4.9);
用 Modbus Slave 模拟从站,跑起来看效果。
Visual Studio(推荐 2022);
已经会一点第 3 部分的内容(知道怎么开串口、怎么调读写方法);
最好装一个 Modbus Slave 软件,用来模拟从站,方便测试。
准备工作:新建 WinForm 项目第一步:用 Visual Studio 新建项目
打 ...
03-C#开发Modbus RTU通信库
Modbus 学习笔记(第三部分)C# 开发 Modbus RTU 通信库恭喜你走到这一步。前面两部分我们都在”纸上谈兵”:先搞懂了协议的概念,再拆解了报文格式。从这一部分开始,我们真正动手写代码,把前面学到的”报文格式”用 C# 一行一行地实现出来。
这一部分的目标非常明确:用 C# 自己写一个 Modbus RTU 通信库。所谓”库”,就是把那些重复要用的功能打包在一起,以后写串口助手、写数据采集程序时,直接调用就行,不用每次重新写一遍。
这一篇我会手把手带着你从零开始:先新建项目,再装依赖,然后一个文件一个文件地把代码敲出来。全程每一步都有详细说明,你照着做,就能自己独立完成,不需要依赖任何现成文件。遇到不认识的 C# 语法,我会先用大白话解释。
电脑上装了 Visual Studio(2019 或更高版本,推荐 2022);
会一点点 C# 基础(变量、循环、判断就够了);
有一颗”照着敲一遍”的耐心。
第一步:从零新建一个项目写代码之前,得先有一个”项目”来装代码。项目就像一本空白的练习本,我们往里面一页页写东西。
方式一:用 Visual Studio 图形界 ...
02-Modbus RTU通信报文分析
Modbus 学习笔记(第二部分)Modbus RTU 通信报文分析上一部分我们知道了 Modbus 的基本概念:主站和从站、四个存储区、功能码、地址模型。这一部分,我们开始”动真格”:把 Modbus RTU 的报文一条一条地拆开看。
这一部分可以说是整个 Modbus 学习里最重要、最核心的一部分。为什么这么说?因为你以后用 C# 写串口助手,本质就是两件事:照着规矩把报文拼出来发出去,再照着规矩把收到的报文拆开读懂。所以每一个功能码的报文长什么样,你必须烂熟于心。
好消息是,Modbus RTU 的报文结构非常规整,学会了第一个,后面的都是”换汤不换药”。我会带着你一个功能码一个功能码地拆,每拆一条都给你配一张字节对照表,确保你彻底看懂。
先记住一个贯穿全篇的结论:所有 Modbus RTU 报文,无论读写,都由”从站地址 + 功能码 + 数据 + CRC 校验”这四大块组成。 下面我们就从这里开始。
2.1 Modbus RTU 通信格式说明2.1.1 一条 RTU 报文的整体结构一条完整的 Modbus RTU 报文,从头到尾依次是这四个部分:
顺序
部分
长度
说明 ...
01-Modbus通信协议基础知识
Modbus 学习笔记(第一部分)通信协议基础知识你好,欢迎来到 Modbus 学习的第一站。
这一部分我们不写一行代码,只做一件事:把 Modbus 协议的”底层逻辑”彻底讲明白。为什么要先学这些?因为后面你要写的串口助手、数据看板,本质上都是在”按照 Modbus 的规矩发消息、收消息”。规矩没弄懂,代码写得再顺也是稀里糊涂的。
我会尽量用大白话和生活中的例子来讲,每一个新概念都从一个具体的问题出发。你不用一次全部记住,跟着我一步步往下走就行。遇到看不懂的地方,停下来读两遍,再继续。
1.1 Modbus 协议背景及发展历程1.1.1 先搞清楚一件事:什么是通信协议在讲 Modbus 之前,我们先花一分钟解决一个更根本的问题:两台设备之间,是怎么"说话"的?
打个比方。两个人打电话,要能听懂对方,必须事先约好三件事:
用什么语言(都说中文,还是都说英语);
先说什么、后说什么(是”喂你好”开头,还是直接说正事);
说完一句怎么表示自己说完了(是停顿一下,还是说一句”完毕”)。
如果没有这些约定,一个人说中文、一个人说英语,或者两个人抢着说,通话就 ...
this.Invoke学习笔记
this.Invoke 学习笔记接上一篇《WinForm 串口助手实战笔记》。上一篇里接收数据那段代码,套了一层 this.Invoke,我当时说”照着抄就行”。这一篇专门把这件事讲透,让你不仅会用,还能明白它到底在干嘛。
一、先认识线程程序运行起来后,其实是一根”线”在从上往下一行行执行代码。这根”线”,就叫线程。
一个程序里可以同时有好几根这样的线在跑,各干各的。我们这个串口助手里,主要有两根:
线程
谁在跑
负责什么
界面线程
程序一启动就在
专门管窗口、按钮、文本框这些界面
后台线程
串口收到数据时临时冒出来
专门盯着串口,数据一来就接住
你可以把界面线程理解成”专门管柜台的人”,把后台线程理解成”专门在仓库搬货的人”。
二、为什么串口收到数据,不能直接改界面这里有一条 C# 的硬规矩,一定要记住:
界面上的控件,只有界面线程能碰。
串口收到数据,是”后台线程”接住的。它手里拿着数据,想去改文本框,但文本框是”界面线程”管的,它碰不了。后台线程硬要去碰,程序就直接报错、闪退。
所以问题就来了:数据在后台线程手里,控件却只能界面线程碰,这个矛盾怎么解?
...
WinForm串口助手实战笔记
接上一篇《串口通信入门笔记》。上一篇把五个参数讲明白了,这一篇动手做一个最简版的串口助手窗口。
目标很明确:做出来的程序能选串口、选波特率、打开串口、发数据、看收到的数据、关闭串口。
一、先想清楚界面长什么样界面分四个区域,从上往下:
顶部:两个下拉框(选串口号、选波特率)+ 两个按钮(打开、关闭)
中间:一个大的文本框,专门显示收到的数据
底部:一个输入框(写要发的内容)+ 一个按钮(发送)
对应关系就是这张表:
界面上的东西
控件类型
作用
串口号选择
下拉框 ComboBox
选 COM 几
波特率选择
下拉框 ComboBox
选速度
打开按钮
按钮 Button
打开串口
关闭按钮
按钮 Button
关闭串口
接收显示区
文本框 TextBox
显示收到的数据
发送输入框
文本框 TextBox
输入要发的内容
发送按钮
按钮 Button
把内容发出去
一共 7 个控件,全部用拖的方式放上去,不用写一行界面代码。
二、第一步:新建项目
打开 Visual Studio
菜单里选「文件」→「新建」→「项目」
找模板「Windo ...
串口通信入门笔记
一、串口通信到底在干嘛串口通信,说白了就是两台设备之间接一根线,让它们按约定好的规则互相传数据。
在工业现场最常见的情况是:你的电脑(叫上位机)通过串口去连一台设备(可能是 PLC、传感器、扫码枪、仪表),从它那里读数据,或者给它发指令。
这根线上跑的东西,本质上是一串一串的高低电平。我们写程序要做的,就是告诉电脑:这些电平要按照什么规则去读、去发。
二、先用一个比喻建立直觉想象两个人用对讲机通话。要能顺利听懂对方,得先约好五件事:
用哪个频道
说话语速多快
一句话里几个字
每句话说完怎么停顿
有没有暗号检查自己有没有听错
任何一项对不上,两个人就聊不起来。
串口通信完全一样。这五件事,就是下面要讲的五个参数,收发双方必须完全一致。
三、逐个讲清楚五个参数先记一个小知识点:计算机里最小的单位叫「位」,英文是 bit。8 个位组成一个字节(byte),一个字节差不多就是一个英文字母或一个数字的大小。后面会一直用到。
1. 串口号(PortName)电脑上可能有好几个串口,编号是 COM1、COM2、COM3 这样往下排。
就像一栋楼有好几个门,你要先知道设备插在哪个门。把 ...
EFCore入门学习笔记
前言:EFCore 到底是个啥先记住一句话:
EFCore 就是一个翻译官,专门帮你把 C# 代码翻译成数据库能听懂的 SQL 语句。
你现在写程序,数据都是存在内存里的,程序一关就没了。做上位机、做数据采集,数据是要长期保存的,比如:
设备台账(每台设备的编号、名称、型号)
采集到的历史数据(温度、压力、产量)
报警记录
这些数据都要存到数据库里。数据库只认一种语言,叫 SQL,长这样:
1SELECT * FROM Products WHERE Price > 20;
这行 SQL 的意思是”把价格大于 20 的产品全查出来”。看着还行,但一旦查询变复杂,SQL 就很长、很难写、还容易拼错。
EFCore 干的事,就是让你不用写 SQL,直接用 C# 就能操作数据库。你写 C#,它在背后帮你翻译成 SQL 发给数据库。
打个比方:数据库是一台只会说”数据库黑话”的机器,EFCore 是站在你身边的翻译官。你说普通话(C#),它替你翻译(生成 SQL),再把结果拿回来给你。
用 EFCore 有三大好处:
不用手写 SQL 语句
用你熟悉的 C# 就能增删改查,写法跟操 ...
Lambda表达式入门学习笔记
前言:Lambda 到底是个啥先把这句话记在心里:
Lambda 就是把一个方法写得更短、更偷懒的一种写法。
它本质上还是一个方法,只是省掉了很多啰嗦的格式,让你把”这件事怎么做”用最精炼的方式表达出来。
打个比方。你在工厂里干活,领导让你”把温度超过 80 度的数据挑出来”。按老办法,你得先起个方法名,再写参数类型,再写返回值类型,折腾半天。而 Lambda 就是让你直接把”超过 80 度”这个条件往那一摆就行了,不用再费劲起名字、写一大堆格式。
它长什么样呢?先看一个最简单的样子,混个脸熟:
1x => x + 1
这行代码的意思就是:给我一个数 x,我还你 x 加 1 的结果。就这么简单。
现在你可能还是一头雾水,没关系。接下来我们一步步从你最熟悉的东西讲起,你很快就会明白为什么它要长成这样。
第一步:先回忆一下,方法是什么你在之前的学习里应该已经接触过”方法”了。方法就是一段有名字的代码,你给它起个名字,需要的时候叫它的名字就行。
看一个最简单的加法方法:
12345678910111213141516using System;class Program{ ...
Prism for WPF 启动逻辑详解 —— 从 App.xaml.cs 说起
在 WPF 项目中引入 Prism 框架后,第一个映入眼帘的通常是自动生成的 App.xaml.cs,里面只有寥寥几行代码。然而,这几行代码背后隐藏着整个应用程序的启动脉络。理解它们,是掌握 Prism 开发的第一步。
1. 默认代码长什么样?123456789101112131415/// <summary>/// App.xaml 的交互逻辑/// </summary>public partial class App : PrismApplication{ protected override Window CreateShell() { return new Shell(); } protected override void RegisterTypes(Prism.Ioc.IContainerRegistry containerRegistry) { // 目前是空的 }}
App 类继承自 PrismApplication( ...
百天打卡
自我投资和发展才能赢得尊重
北の百日打卡
2026-07-16 07:24
第03天打卡 ,不要忘记了自己最开始的一个初心 | 体重:74.5 | 体脂:22 | 下午准备去健身房进行锻炼
2026-07-15 05:55
第02天打卡 ,不要忘记了自己最开始的一个初心 | 体重:75 | 体脂:22 | 下午准备去健身房进行锻炼
2026-07-14 17:41
第01天打卡 ,不要忘记了自己最开始的一个初心 | 体重:76 | 体脂:22 | 下午准备去健身房进行锻炼
Navicat 连接本地 SQLServer
起因:今天安装了下Navicat ,想着使用Navicat去进行操作的话会更加的方便些
第一步:选择文件 -> 新建连接 -> 选择SQL Server
第二步:输入连接名 ,主机这里需要复制SQL Server 中的服务器名称
然后输入用户名 ,密码去
用户名:SQLServer 中的登录名
然后测试连接这个时候就能够发现连接上了
后续就能够使用Navicat去进行一个操作了
轻语问题记录
2026-07 问题记录
Docker环境下Flomo同步失败
开启自动同步设置后格式错误问题













