C#编写一个简单串口通讯上位机

一:上位机的作用
1、可以模拟上位机进行modbus协议主机的使用。
2、可以调试具有modbus协议的所有设备
3、可以在线设置各种通讯速率、奇偶校验、通讯口而无需重新启动程序。
4、支持 03 06 16 几条常用的命令。
5、可以自动显示接收到的数据,
6、是工程技术人员监视、调试串口程序的必备工具
二:参数配置
串口基础参数包括:波特率,数据位,停止位,校验位。 1. 波特率:串口通讯速率,可设置范围为:600~230.4Kbps,波特率支持任意波特率。 2. 数据位:数据位的长度,范围为 5~8。 3. 停止位:可设置范围为:1~2 4. 校验位:数据通讯的校验位,支持 None、Odd、Even、Mark、Space 五种校验方式 通过设置串口参数,保持与串口连接设备串口参数一致可以保证通许正常进行
三:命名空间
C#编写一个简单串口通讯上位机_第1张图片

1.在 C#中,命名空间提供了一种组织相关类和其它类型的方式。我理解的命名 空间就是一个集装箱,里面可以装下很多类和方法。其实我们也可以认为所谓的 命名空间相当于 C 语言中的头文件,只不过 include 变为了 using namespace。具 体的书写规范见代码清单C#编写一个简单串口通讯上位机_第2张图片

第 1 到 7 行代码全都为系统 自带的命名空间。第 11 行为开发人员自定义的命名空间,之后的每一个上位机 项目都是一个自定义命名空间。C#的命名空间和 C 的头文件遵循一样的 规则,即要想使用某方法某函数则必须要包含方法所在的命名空间或者头文件。 这是相同点。不同点则表现在 C 语言在声明了头文件和函数接口后必须要在对应 的 C 文件中编写函数体后才可使用。C#则将省去了函数声明,直接即可编写对应 的函数体。
四:类
1.什么是类
在 C#开发中,类(class)至关重要。可以认为类是 C#一个很大的主题。我们在单片机软件开发中设计数据结构时往往离 不开先设计结构体,其实类就相当于结构体,这也是面向对象的一个前提条件。 我们可以将类抽象成一个既能存储数据又能执行代码的数据结构。它包含数据成 员和函数成员,因此类对 C#代码的封装起着举足轻重的作用。
2.如何声明一个类
类的声明和结构体类似,即定义了一个新类的成员和特征。但是它并不创建 类的实例,相当于结构体声明后并不分配内存,只有在使用时声明后才会分配内 存一样,类的声明和实例化不可混淆。类的声明方式如下代码清单所示:C#编写一个简单串口通讯上位机_第3张图片
类的声明非常简单。其中类的成员可以是变 量,也可以是函数方法。
五:属性、方法及事件

  1. 什么是属性
    我们简要的接触了类的概念,类相当于一个结构体但不能 等价于一个结构体,因为类是具有属性的,而结构体没有。在结构体内部定义一个缓冲区,这个缓冲区的大小必须在程序编译前确定下来,运行中不可改变。但 类通过属性却可以修改这个缓冲区的大小。那么什么是属性呢?属性就好比一个 人的发色,生来黑色,但不会永远是黑色,我们可以随意染成红蓝紫色。也就是 说属性是一个类的动态特性,比如上位机在运行过程中我们可以随时修改波特率。
    2.什么是方法
    C#中的方法类似于 C 语言函数,只是 C#赋予了方法属性,方法既可以是私有 的,又可以是共用的。谈及私有方法,其实我们完全可以将它理解为 C 语言函数 套了一个 static 关键字,代表这是单文件中使用的。
    3.什么是事件
    学习 STM32 之时,我们已经接触过事件的概念。事件是由硬件实现,可触发 中断以及关联性操作,如 ADC,DMA 等。它和中断最大的区别在于事件无需返 回,而中断需要返回。事件不仅在 MCU 硬件中大量使用,同时又与单片机软件 架构设计息息相关。 所有的 PC 端程序都需要在某个特定的时刻响应某个操作,处理某件事情, 比如响应鼠标单击事件,键盘事件等,因此 C#也引入了事件触发机制。在上一 节的内容中我们简要介绍了委托,事件本质上源于委托,是一种特殊的委托,它 为委托提供了封装性,一方面允许从类的外部增删绑定方法,另一方面又严禁从 类的外部触发委托所绑定的方法。 我们的目的是快速开发上位机,因此在使用过程中完全可以将事件理解为中 断,事件回调函数就是我们常说的中断服务函数。同时一般情况下我们也不需要 自己封装事件,调用控件已经封装好的事件函数即可。
    六:遇到的问题及解决方法
    1.InitializeComponent()方法是用来初始化窗体组件的,在InitializeComponent之前,窗体的各个控件还没有进行初始化,比如说窗体上有一个TextBoxUserName,在InitializeComponent之前它还只是一个TextBox类型的变量而已。
    如果在InitializeComponent之前调用这个TextBox的属性或方法,就会出错。
    再比如说你拖上取一个TextBox,它放在Form的位置,TextBox的一些属性,包括new 这个TextBox都放在那个函数里面处理的。
    2.未能找到类型或命名空间名称“XXXX”是否缺少 using 指令或程序集引用?
    这个相比来说就简单直接很多,如下;项目中 App_Code 文件夹中的类的命名空间;在添加的页面的 using XXXX 时,提示 “未能找到类型或命名空间名称“XXXX”是否缺少 using 指令或程序集引用?”。说明要引用的这个类文件的 生成操作 属性没有选择 编译,vs中并没有承认此命名空间。修改:右击类文件-》属性-》生产操作-》将“内容”改为“编译”,然后重新生成,问题解决。

按键触发问题:在原有的按键触发事件1里添加一个触发事件2不能执行,即使将事件1代码注释仍不可执行执行事件2,必须再添加一个引用.
原因 :没有注册事件,应在原来的属性里注册一个触发事件
button1.Click += new System.EventHandler(this.button1_Click);
取消注册:button1.Click -= new System.EventHandler(this.button1_Click);

C#编写一个简单串口通讯上位机_第4张图片C#编写一个简单串口通讯上位机_第5张图片C#编写一个简单串口通讯上位机_第6张图片

你可能感兴趣的:(C#编写一个简单串口通讯上位机)