使用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 ...
CSharp字符串与数值类型相互转换
字符串和数字互相转换,上位机几乎天天要用。
为什么需要互转?因为两边的「身份」不一样。
界面输入框里,用户敲进 25.6,程序拿到的是字符串 string,不是数字,没法直接做加减乘除。
PLC 通过 Modbus 传来的温度是数字,但显示到屏幕上、写进日志里,又得变成字符串。
所以必须学会两个方向:数字变字符串、字符串变数字。
本篇目标:会用 ToString 把数字变字符串,会用 Parse、TryParse 把字符串变数字,知道字符串转数字最大的坑,能用 TryParse 写出不崩溃的代码。
一、数值转字符串(简单方向)数字变字符串很简单,两个办法。
办法一:用加号拼接1234567891011121314151617using System;class Program{ static void Main() { double temp = 25.6; int count = 100; // 数字和字符串用 + 连,数字自动变成字符串 string s1 = " ...
CSharp数值类型的自动转换和强制转换
类型转换就是把一种类型的数据,变成另一种类型。
上位机里这种需求天天有:PLC 读上来的原始值常常是 int,换算工程量要用 double,算完又要显示成文字给操作员看。这一路就得不断做类型转换。这篇就讲两种转换:自动转换和强制转换。
本篇目标:分清「自动转换」和「强制转换」什么时候发生、会不会丢数据,能自己写转换代码,知道两个最容易踩的坑。
一、先打个比方:大杯子和杯子记住这个比喻,整篇都靠它。
想象两个杯子:
小杯子倒进 大杯子:水不会洒,安全,随便倒。
大杯子倒进 小杯子:水会溢出来,你得自己小心,还可能洒掉。
类型转换一模一样。范围小的类型(比如 byte)转成范围大的类型(比如 int),就像小杯子倒大杯子,安全;反过来范围大的转范围小的,就像大杯子倒小杯子,可能丢数据。
二、自动转换(隐式转换)自动转换就是「小转大」,电脑自动帮你完成,不用写任何东西,也不会丢数据。
1234567891011121314151617using System;class Program{ static void Main() { ...
CSharp运算符之位逻辑条件
运算符就是让数据之间发生关系的符号。这一篇讲三类:逻辑运算符(判断真假)、条件运算符(一句话二选一)、位运算符(直接摆弄二进制位)。其中位运算在上位机里特别常用,比如读 PLC 一个字节里的开关状态。
本篇目标:会用 &&、||、! 做判断,会用 ?: 做二选一,会用 &、|、<<、>> 做位操作,能读懂「读一个字节里的 8 个开关」这种经典代码。
零、先分清三类运算符
类别
符号
作用
结果类型
逻辑运算符
&& `
!`
条件运算符
?:
二选一取值
看情况
位运算符
& `
^ ~` << >>
直接操作二进制位
逻辑运算符 和 条件运算符 是「判断」,位运算符 是「摆弄二进制」。下面一个个来。
一、逻辑运算符:判断真假逻辑运算符的答案只有两个:真(true)或假(false)。它用来回答「是不是、有没有、满不满足条件」这类问题。
三个符号先记牢:
与(&&):两边都为真,结果才为真。像「两个条 ...
CSharp数据类型转换之拆箱装箱
拆箱装箱
值类型和引用类型之间的搬运
前面我们认识了各种数据类型。这一篇讲一个让很多新手发懵的词——装箱(Boxing)和 拆箱(Unboxing)。别怕,它俩说白了就是「把值装进盒子、再从盒子取出来」两件事,看完这篇你就能彻底搞懂。
本篇目标:能说出什么是装箱、什么是拆箱,能自己写一段装箱拆箱的代码,并且知道拆箱时最容易踩的坑。
一、先补个前提:值类型 和 引用类型拆箱装箱是「值类型」和「引用类型」之间的转换,所以得先分清这两类类型。就一句话。
用一个生活比喻分清两类类型
想象你有一笔钱(数据):值类型:把现金直接塞进自己的口袋。钱就在口袋里,要用直接掏。比如 int、double、bool、float,它们把「值本身」直接放在变量里。引用类型:口袋里的不是钱,是一把储物柜的钥匙。真正的钱放在储物柜里,你要用钱,得先拿着钥匙去开柜子。比如 string、object,它们变量里放的是「地址」,真正的数据在别处。一句话记:值类型装的是值本身,引用类型装的是地址。
...
CSharp常用的基础数值类型
C# 数值类型
装数字的十二只杯子
上一篇我们知道了「数据类型就是装数据的杯子」。这一篇专门讲其中的一大类——数值类型,也就是「能装数字」的类型。把 8 种整数 + 2 种小数吃透,上位机读数据、换算工程量就全通了。
本篇目标:看到 int、double、byte 这些词,能马上说出——是整数还是小数、大概能装多大、上位机里用在哪。
一、先认识两个基础词:位 和 字节理解数值类型,绕不开两个词。它们不复杂,就是「存储空间」的度量单位。
位(bit):电脑里最小的单位,只能存 0 或 1,就像一盏只能「开」或「关」的灯。
字节(byte):把 8 个位打包成一组,就是 1 个字节。
位和字节到底啥关系?
把 8 盏灯排成一排,每盏灯都是 0 或 1,这一整排 8 盏灯就是一个字节。1 个字节 = 8 个位,能表示 2 的 8 次方 = 256 种组合。2 个字节 = 16 个位,能表示 2 的 16 次方 = 65536 种组合。4 个字节 = 32 个位, ...
CSharp数据类型的认识
零、先问个问题:数据类型是个啥?打个比方:你要往一个杯子里装东西,杯子有很多种——水杯(装水)、酒杯(装酒)、汤碗(装汤)。数据类型就是「装数据的杯子」,你得先告诉电脑你要用哪种杯子,它才知道怎么帮你装、怎么帮你用。
C# 自带了一堆「杯子」,每种能装的东西不一样大、不一样精确。我们这一篇先把表格里那 11 种类型一个一个过一遍。
本次目标只有一句话:看到一种类型,能说出来——它叫什么、能装多大、是整数还是小数、经常用在哪。
一、整型家族:byte 和 sbyte(最小的一对兄弟)表格里第一对是 Byte 和 SByte,它们的区别就一个字母 S:S 代表 Signed(有符号),没有 S 代表 Unsigned(无符号)。
类型
名字
范围
占用空间
sbyte
有符号字节
-128 到 127
1 字节
byte
无符号字节
0 到 255
1 字节
怎么理解「有符号 / 无符号」?
想象成一块路牌:无符号(byte)只能往前数:从 0 开始,数到 255。有符号(sbyte)有个 0 路口 ...
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 这样往下排。
就像一栋楼有好几个门,你要先知道设备插在哪个门。把 ...













