上位机开发_上位机开发前景 - CSDN
精华内容
参与话题
  • C#上位机开发(一)—— 了解上位机  在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形、温度等)、用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式...

    C#上位机开发(一)—— 了解上位机

      在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形、温度等)、用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式都是基于串口的:

    • USB转串口 —— 上位机和下位机通过USB转串口连接线直接相连进行数据交互;
    • 串口转WIFI(ESP8266) ——  上位机和下位机基于TCP/IP协议通过WIFI传输数据;
    • 串口转蓝牙(HC-06)—— 不多用,暂不介绍;

      上位机软软件开发主要包括以下两种:

      1、Windows上位机(EXE可执行程序)

         在Windows上,最早用VB语言开发,后来由于C++的发展,采用MFC开发,近几年,微软发布了基于.NET框架的面向对象语言C#,更加稳定安全,再配合微软强大的VS进行开发,效率奇高;

        另外,如果想要在Linux上跨平台运行,可以选用Qt;如果想要更加丰富好看的数据显示界面,可以选用Labview开发;

      2、Android上位机(APP)

        在Android操作系统上,主要采用Java语言,使用WIFI或者蓝牙基于TCP/IP协议传输数据,利用Android Studio开发;

      在此,我们主要介绍如何通过VS + C#开发电脑上位机,其它上位机的开发暂且不论。

     

     注:VS下载与安装参考这篇较详细的博客

       https://blog.csdn.net/qq_36556893/article/details/79430133

    展开全文
  • 本课位介绍Qt入门知识及使Qt开发上位机软件,上位机是指:人可以直i接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化(液dao压,水位,温度等)。 下位机是直接控制设备获取设备状况的的计算机,一般是PLC...
  • 【006】上位机开发及简单通信

    千次阅读 多人点赞 2018-04-16 22:39:58
    上位机开发及简单通信1. 上位机开发的意义 常见的上位机定义为一台可以发出特定操控命令的计算机,通过操作预先设定好的命令,将命令传递给下位机,通过下位机来控制设备完成各项操作。此定义着重于强调控制指令的...

    上位机开发及简单通信

    1. 上位机开发的意义

      常见的上位机定义为一台可以发出特定操控命令的计算机,通过操作预先设定好的命令,将命令传递给下位机,通过下位机来控制设备完成各项操作。此定义着重于强调控制指令的发送,实际上除了发送控制命令,上位机还能提供许多额外的功能:

      a. 可视化功能

      上位机位于MCU与使用者之间,在MCU软件开发过程中,通常直接处理控制数据,优先考虑处理的实时性与能耗,对于数据的易于理解性及可视化程度不作考虑。MCU处理的数据虽然能够通过串口或者其他方式输出,但是直接输出的数据可读性较差,不利于直观的理解。上位机能够首先对MCU的输出数据进行处理,将其转化为易于理解的方式在显示屏上展现。

      b. 数据高速处理能力

      大多数MCU实时性好,但计算能力较弱。上位机具有较强的计算能力,但实时性较弱。因此,利用MCU采集数据并发送至上位机处理能够充分发挥双方优势。

      c. 算法仿真能力

      在进行嵌入式开发时,我们需要搭建平台,每次的软件修改都需要使用专门的工具进行烧写与调试,相比PC端软件开发更为繁琐,不利于调试。因此,可以将MCU采集到的数据发送至上位机,在PC端进行算法的验证,直到满足需求后再在MCU上进行测试,可以缩短开发周期,降低开发成本。

    2. 基本需求

      在【004】基于STM32标准库的IMU9250数据读取【005】基于STM32标准库IMU9250数据读取(二)文中,我们基于STM32F429XXMCU成功读取了加速度计、陀螺仪、磁力计的原始数据,这里我们希望上位机能够实现以下功能:

    • 实时获取MCU采集的原始数据;
    • 以曲线的方式动态显示加速度计、陀螺仪、磁力计数据;
    • 以3D的方式动态显示欧拉角-Roll,Pitch,Yaw;
    • 提供算法仿真验证能力。

    3. 上位机开发

    3.1 开发环境

      对于上位机开发有许多开发环境可选,例如:MFC、Qt、Matlab、C#等。每种开发环境适用场合不同,例如MFC在Windows平台具有较强的通用性,在较老的计算机中也能够运行。Qt支持跨平台,能够在Windows、Linux等多个平台上运行。Matlab开发简单方便,适合矩阵向量的计算。这里我们选用Qt作为开发环境,同时使用QCustomPlot来实现加速度计、陀螺仪、磁力计数据的动态绘制,使用qextserialport作为串口通信的API。

    3.2 通信方式

      上位机与下位机常见的通信方式有:串口通信、SPI通信、以太网通信等。串口通信速率较低,设备便宜,易于开发。以太网通信速率高,开发难度较高。SPI通信速率高于串口通信,但通常需要USB转SPI设备。这里选用串口作为上位机与下位机之间的通信方式。

    3.3 简单协议

      设置简单的协议是为了让上位机能够准确、及时、高效地获取MCU采集的数据,这里我们采用的简单协议如图1所示。


    图1 简单通信协议

      在此协议中,0xFF 0xFF为上位机的数据头,COM为控制指令用于实现请求数据(0x01)等任务。MCU在收到请求数据指令后,将会计算当前采集的数据个数(或组数),然后发送数据至上位机。在此过程中0xFF 0xFE为下位机数据头,N为当前采集的数据个数(或组数)。

      为了实现数据的先入先出,我们需要实现队列结构,一共需要三个队列:一个用于存储MCU的采集数据,一个用于存储上位机收到的数据,还有一个用于存储MCU收到上位机发来的控制指令。这里我们采用环形队列,它是在写程序时候一种队列的特殊表达方式,把队列数据组中的最后一个元素和第一个元素相连构成环,所以称为环形队列。环形队列在C/C++编程中首元素出队后不需要把队列所有元素向前移动,而取代把把队首指针向后移动,由于其环形结构,在插入元素后队尾指针会循环到队首原来的位置。相对普通队列的出队操作减少了大量的运算量。程序如下:

    uint8_t RawDataQueueBuffer[QUEUE_SIZE];
    uint16_t QueueHead, QueueTail, QueueLength;
    
    void RawDataQueueBuffer_Init()
    {
    	QueueHead = 0;
    	QueueTail = 0;
    	QueueLength = 0;
    }
    
    uint8_t PushQueue(uint8_t Val)
    {
    	RawDataQueueBuffer[QueueTail] = Val;
    	QueueTail++;
    	QueueTail = QueueTail % QUEUE_SIZE;
    	QueueLength++;
    	if (QueueLength > QUEUE_SIZE)
    	{
    		QueueLength = QUEUE_SIZE;
    	}
    	return 0;
    }
    
    uint8_t PopQueue(uint8_t *Val)
    {
    	if (QueueLength > 0)
    	{
    		*Val = RawDataQueueBuffer[QueueHead];
    		QueueHead++;
    		QueueHead = QueueHead % QUEUE_SIZE;
    		QueueLength--;
    		return 0;
    	}
    	else
    	{
    		return 255;
    	}
    }

    MCU采用中断的方式将上位机数据存至对应的队列并将指令校验标志置一,同样采用中断的方式将进行IMU数据采集。采用轮询的方式检测相应标志是否为一,若为一则进行相应操作并清零该标志位,对应过程如图2所示。


    图2 MCU简单协议处理流程

    对应代码如下:

    uint8_t MPU6050_Task()
    {
    	while(1)
    	{
    //		if (TaskFlag_GetData == 1)
    //		{
    //			//Clear_PCF_Status();
    //			MPU6050_Get_RawData();
    //			TaskFlag_GetData = 0;
    //		}
    		if (TaskFlag_CheckData == 1)
    		{
    			switch (Check_Command(USART_QueueBuffer))
    			{
    			case 0:
    				MPU6050_Send_Data();
    				break;
    			default:
    				;
    			}
    			TaskFlag_CheckData = 0;
    		}
    	}
    	return 0;
    }
    
    uint8_t Check_Command(uint8_t *Buffer)
    {
    	if ((Buffer[(USART_QueueTail - 3 + 3) % 3] == 0xFF) && (Buffer[(USART_QueueTail - 2 + 3) % 3] == 0xFE))
    	{
    		return Buffer[(USART_QueueTail - 1 + 3) % 3];
    	}
    	else
    	{
    		return 255;
    	}
    }
    
    int main(void)
    {
    	Blinking_GPIO_Init();
    
    	MPU6050_Init();
    	Clear_PCF_Status();
    	MPU6050_Task();
    	return 0;
    }
    中断服务程序代码:
    extern uint8_t TaskFlag_GetData;
    extern uint8_t TaskFlag_CheckData;
    
    void USART2_IRQHandler(void)
    {
    	if(USART_GetITStatus(USART2, USART_IT_RXNE))
    	{
    		USART_PushQueue((uint8_t)USART_ReceiveData(USART2));
    		TaskFlag_CheckData = 1;
    	}
    }
    
    uint16_t cnt;
    void EXTI15_10_IRQHandler(void)
    {
    	if(EXTI_GetITStatus(EXTI_Line12) != RESET)
    	{
    		TaskFlag_GetData = 1;
    		EXTI_ClearITPendingBit(EXTI_Line12);
    		MPU6050_Get_RawData();
    		cnt++;
    		if (cnt == 20)
    		{
    			cnt = 0;
    			GPIO_ToggleBits(GPIOB, GPIO_Pin_1);
    		}
    	}
    }

    3.4上位机效果

    最终上位机初步效果如图3所示,包含基本的串口参数设置及数据显示,将MCU采集的IMU数据经过处理后分别以文字、曲线、图像的方式形象展示。


    图3 上位机初步效果



    联系作者


    展开全文
  • 上位机开发步骤技术

    2020-07-30 23:32:16
    上位机数据定义,通过下位机PLC发送数据到上位机上位机将功能代码通过十六进制下发至PLC
  • 开源一个串口上位机源码

    万次阅读 多人点赞 2018-06-05 14:17:12
    是杰杰之前做的一个参赛小作品其实在做这个恒温控制系统项目的时候,师弟就问我,什么是上位机。。。。。可能很多师弟师妹都没一个大概的概念。现在,就来看下什么是上位机: 上位机是指可以直接发出操控命令的...

    是杰杰之前做的
    一个参赛小作品

    其实在做这个恒温控制系统项目的时候,师弟就问我,什么是上位机。。。。。可能很多师弟师妹都没一个大概的概念。

    现在,就来看下什么是上位机:

         上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化(液压,水位,温度等)。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机single chip microcomputer/slave computer/lower computer之类的。上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。简言之如此,实际情况千差万别,但万变不离其宗:上下位机都需要编程,都有专门的开发系统。

    在概念上,控制者和提供服务者是上位机,被控制者和被服务者是下位机,也可以理解为主机和从机的关系,但上位机和下位机是可以转换的。


    工作原理

        两机如何通讯,一般取决于下位机,TCP/IP一般是支持的,但是下位机一般具有更可靠的独有通讯协议。通常上位机和下位机通讯可以采用不同通讯协议,可以有RS232的串口通讯或者采用RS485串行通讯。采用封装好的程序开发工具就可以实现下位机和上位机的通讯,当然可以自己编写驱动类的接口协议控制上位机和下位机的通讯。

    通常工控机,工作站,触摸屏作为上位机,通信控制PLC,单片机等作为下位机,从而控制相关设备元件和驱动装置。


    既然差不多知道什么是上位机与下位机,那么,我们做到小喇叭的要求:就得写个上位机,我自己也是学了下C#,用来开发上位机还是可以的,开发环境用visual studio 2015,微软的软件真的是很简单,之前看到有人问为什么微软的软件是最多人用的,答:因为那是傻瓜式操作。。。。。我不得不认同。。。  


    回归正题:先看看我们的上位机有什么功能:

    1)能够实现与下位机的正常通讯。这必须得有,不然算哪门子上位机啊。

    2)能够控制我们的恒温系统,通过电脑控制恒温系统的温度。这种应用场景很正常,我在机房就能控制我某一个地方的温度,简单方便。

    3)能够实时显示温度与波形。这种应用的场景也是非常常见,实时显示温度我们可以知道温度是否正常,而波形我们能快速看出恒温系统空间温度是否出现异常。

    4)数据保存功能,自动将实时的温度保存下来,加入 日期与时间,方便以后排查问题的时候用于检测某段时间的温度是否正常,这也是很使用的功能。


          说了那么多,看看我们的上位机。由于我以前用的别人的上位机都是色调比较单一的,而我,又是那种比较活泼开朗的人,觉得单一的灰色调比较死沉,我不喜欢,当然那是别人做的上位机,即使再不喜欢,要用还是要用,没办法,

    现在我自己做的就不一样了,得给他做个五颜六色出来。亮瞎眼。。。。。

    当我们的温度达到目标温度的时候,下位机就会控制自己的温度,以保持温度恒定,同时在上位机显示看到温度为一条曲线,由于我设置的温度为整数,没有小数,但是我们通过下位机可以看到实时的温度,精确在0.4范围左右。

    4.jpg

    当我们把上位机与下位机通讯协议切断,可以看到上位机接受不到数据(在软件右下角粉红色的窗口,没有显示接收到的数据),上位机的波形就会回到默认值(0°),就是上图的样子

    5.jpg

    6.jpg

    当我们需要后期的检测与排除故障的时候,我们可以从我们保存的温度来做简单的排查,上位机自动保存的温度数据,精确到某天某时某分某秒,简单方便。也是一个很实用的功能当没什么故障的时候,我们只需要隔一段时间吧数据清一下就OK了。


    附上作品视频:http://v.youku.com/v_show/id_XMzE0Nzg0ODUzMg==.html?spm=a2h0k.8191407.0.0&from=s1.8-1-1.2

    本次上位机介绍到此结束


    源码文件会可以关注公众号获得。

    或者在我CSDN下载连接:https://download.csdn.net/download/jiejiemcu/10444798 点击打开链接


    本上位机仅为杰杰个人娱乐,不做商业用途。源码改自开发快-小白哥的上位机

    如需转载请说明出处。

    欢迎关注“创客飞梦空间”

    干货不间断

    在未来的日子里

    创客飞梦空间与你们同在,放飞我们的梦想





    展开全文
  • c#上位机开发1

    千次阅读 2018-10-08 11:32:36
    1、新建C#项目工程  首先选择新建Windows窗体应用(.NET Framework),然后选择项目保存位置,填写项目名称,这里因为我们不需要用git进行版本管理,所以不用新建GIT存储库;  框架是指.net框架,4以及4以下的...

    本文来自https://www.cnblogs.com/Mculover666/p/9126191.html

    1、新建C#项目工程

       首先选择新建Windows窗体应用(.NET Framework),然后选择项目保存位置,填写项目名称,这里因为我们不需要用git进行版本管理,所以不用新建GIT存储库;

       框架是指.net框架,4以及4以下的.NET框架可以在xp上运行,4以上可以在win7/8/10上运行,鉴于当前大多数操作系统都是win7或win10,选择4.5版本。

    2、窗体介绍及代码分析

    这里我们双击窗体界面,这也是VS的特性,双击一个控件,就会进入对应代码文件部分,这些代码全由VS在生成项目时自动生成,下面进行详细的解释:

    复制代码

     1 /*filename:Form1.cs*/
     2 //使用命名空间
     3 using System;
     4 using System.Collections.Generic;
     5 using System.ComponentModel;
     6 using System.Data;
     7 using System.Drawing;
     8 using System.Linq;
     9 using System.Text;
    10 using System.Windows.Forms;
    11 
    12 //用户项目工程自定义命名空间HelloWorld
    13 namespace HelloWorld
    14 {
    15     //定义了一个名称为Form1的公共类,并且在定义类的同时创建了一个这个类的对象,名为Form
    16     //partial关键字
    17     public partial class Form1 : Form
    18     {
    19         //与类同名的构造方法
    20         public Form1()
    21         {
    22             InitializeComponent();
    23         }
    24      //用户自定义方法,窗体加载时由Form对象调用
    25         private void Form1_Load(object sender, EventArgs e)
    26         {
    27         }
    28     }
    29 }

    复制代码

      命名空间(namespace):在C#中用命名空间将很多类的属性及其方法进行封装供调用,类似C语言中将变量和函数封装成一个个.h文件,调用的时候只需要#include "filepath + filename"就可以使用,比如刚开始时用关键字using声明了一些所需要的系统命名空间(line1-10);然后采用关键字namespace来自定义一个用户工程所需的命名空间HelloWorld,在我们定义的这个命名空间里就可以定义一些类和方法来进行下一步的实现;

      类(class:C#是一门面向对象的编程语言,所以最基本的就是类和对象,对象的特征是具有属性(C语言中称为变量)和方法(C语言中称为函数),然后我们定义一个类来描述这个对象的特征,注意:这个时候定义的类不是真实存在的,所以不会分配内存空间,当我们用所定义的这个类去创建一个类的对象,这个对象是真实存在的,它会占用内存空间,比如在这个工程中定义了一个名称为Form1的公共类,并且在定义类的同时创建了一个这个类的对象,名为Form;

      方法:前面已经说过,在面向对象编程中是没有变量和函数的,所有的函数都被封装在类中,属于对象的方法,最基本的是类的构造方法,该方法与类名同名,在用类创建一个具体对象时自动调用,不可缺少,比如Form1( );另外一种是自己定义的用户方法,比如该类中的Form1_Load()方法,就是在初始化窗口时,通过具体对象Form调用:Form.Form1_Load( );

      访问修饰符:用来控制类、属性、方法的访问权限,常用有5个,默认私有,不能被外部访问;

        私有的private,公共的public,受保护的protected,内部的internal,受保护内部的protect internal

     

      这里有一个重点,在定义Form1类的时候含有一个关键字partial,这里就不得不说C#语言设计一个重要的特性了,能作为大多数人开发上位机的首选,C#有一个特性就是设计的时候界面与后台分离,但是类名相同,首先看一下工程文件结构:

    可以看到,Form1.cs文件下面包含了另一个Form1.Designer.cs文件,再打开Form1.Designer.cs这个文件,是不是很惊奇,和前面一模一样,再次定义了一个命名空间HelloWorld和Form1类,这个部分类中定义了我们使用的控件、事件委托以及如Dispose方法等。因为这里面的代码都是自动生成的,因此设计成了一个部分类。最关键的一点,这里类也是用partial关键字修饰的,可以看到,Partial是局部类型的意思,允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中,用partial定义的类可以在多个地方被定义,最后C#编译器编译时会将这些类当作一个类来处理;

    复制代码

     1 /*@filename:Form1.Designer.cs */
     2 
     3 namespace HelloWorld
     4 {
     5     partial class Form1
     6     {
     7         /// <summary>
     8         /// 必需的设计器变量。
     9         /// </summary>
    10         private System.ComponentModel.IContainer components = null;
    11 
    12         /// <summary>
    13         /// 清理所有正在使用的资源。
    14         /// </summary>
    15         /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
    16         protected override void Dispose(bool disposing)
    17         {
    18             if (disposing && (components != null))
    19             {
    20                 components.Dispose();
    21             }
    22             base.Dispose(disposing);
    23         }
    24 
    25         #region Windows 窗体设计器生成的代码
    26 
    27         /// <summary>
    28         /// 设计器支持所需的方法 - 不要修改
    29         /// 使用代码编辑器修改此方法的内容。
    30         /// </summary>
    31         private void InitializeComponent()
    32         {
    33             this.SuspendLayout();
    34             // 
    35             // Form1
    36             // 
    37             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
    38             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    39             this.ClientSize = new System.Drawing.Size(418, 331);
    40             this.Name = "Form1";
    41             this.Text = "Form1";
    42             this.Load += new System.EventHandler(this.Form1_Load);
    43             this.ResumeLayout(false);
    44 
    45         }
    46         #endregion
    47     }
    48 }

    复制代码

      

      Main: 一切程序都有入口主函数main,C#也是如此,在Program.cs文件中定义了Program类,该类中拥有主函数main( ), 在main函数中,第三行代码是一切的开始,调用Form1类的构造函数,创建一个Form对象,一切由此开始,代码如下:

    复制代码

     1 /* @filename: Program.cs */
     2 using System;
     3 using System.Collections.Generic;
     4 using System.Linq;
     5 using System.Windows.Forms;
     6 
     7 namespace HelloWorld
     8 {
     9     static class Program
    10     {
    11         /// <summary>
    12         /// 应用程序的主入口点。
    13         /// </summary>
    14         [STAThread]
    15         static void Main()
    16         {
    17             Application.EnableVisualStyles();
    18             Application.SetCompatibleTextRenderingDefault(false);
    19             Application.Run(new Form1());  //调用Form1类的构造函数,创建一个Form对象,一切由此开始
    20         }
    21     }
    22 }

    复制代码

     

      再来解释一下最后三个文件:第一个文件主要是应用程序发布时的一些属性设置,版本号,属性,版权之类的,其余两个文件是工具自动生成的一些设置文件,不再过多赘述;

    复制代码

    /* @filename:Assemblylnfo.cs*/
    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    
    // 有关程序集的一般信息由以下
    // 控制。更改这些特性值可修改
    // 与程序集关联的信息。
    [assembly: AssemblyTitle("HelloWorld")]
    [assembly: AssemblyDescription("")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("")]
    [assembly: AssemblyProduct("HelloWorld")]
    [assembly: AssemblyCopyright("Copyright ©  2018")]
    [assembly: AssemblyTrademark("")]
    [assembly: AssemblyCulture("")]
    
    // 将 ComVisible 设置为 false 会使此程序集中的类型
    //对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
    //请将此类型的 ComVisible 特性设置为 true。
    [assembly: ComVisible(false)]
    
    // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
    [assembly: Guid("094ac56a-7a59-4f32-a2eb-857135be4d2c")]
    
    // 程序集的版本信息由下列四个值组成: 
    //
    //      主版本
    //      次版本
    //      生成号
    //      修订号
    //
    // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
    // 方法是按如下所示使用“*”: :
    // [assembly: AssemblyVersion("1.0.*")]
    [assembly: AssemblyVersion("1.0.0.0")]
    [assembly: AssemblyFileVersion("1.0.0.0")]

    复制代码

     

    3、Hello,World

      下面就正式开始C#程序的设计,首先是界面的实现,可以随意从控件工具箱中拖放控件到窗体中,这里我拖动两个Button和一个TextBox,并在右边设置框中修改每个控价的属性,界面如图:

    可以看到,Form1.cs文件下面包含了另一个Form1.Designer.cs文件,再打开Form1.Designer.cs这个文件,是不是很惊奇,和前面一模一样,再次定义了一个命名空间HelloWorld和Form1类,这个部分类中定义了我们使用的控件、事件委托以及如Dispose方法等。因为这里面的代码都是自动生成的,因此设计成了一个部分类。最关键的一点,这里类也是用partial关键字修饰的,可以看到,Partial是局部类型的意思,允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中,用partial定义的类可以在多个地方被定义,最后C#编译器编译时会将这些类当作一个类来处理;

    复制代码

     1 /*@filename:Form1.Designer.cs */
     2 
     3 namespace HelloWorld
     4 {
     5     partial class Form1
     6     {
     7         /// <summary>
     8         /// 必需的设计器变量。
     9         /// </summary>
    10         private System.ComponentModel.IContainer components = null;
    11 
    12         /// <summary>
    13         /// 清理所有正在使用的资源。
    14         /// </summary>
    15         /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
    16         protected override void Dispose(bool disposing)
    17         {
    18             if (disposing && (components != null))
    19             {
    20                 components.Dispose();
    21             }
    22             base.Dispose(disposing);
    23         }
    24 
    25         #region Windows 窗体设计器生成的代码
    26 
    27         /// <summary>
    28         /// 设计器支持所需的方法 - 不要修改
    29         /// 使用代码编辑器修改此方法的内容。
    30         /// </summary>
    31         private void InitializeComponent()
    32         {
    33             this.SuspendLayout();
    34             // 
    35             // Form1
    36             // 
    37             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
    38             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    39             this.ClientSize = new System.Drawing.Size(418, 331);
    40             this.Name = "Form1";
    41             this.Text = "Form1";
    42             this.Load += new System.EventHandler(this.Form1_Load);
    43             this.ResumeLayout(false);
    44 
    45         }
    46         #endregion
    47     }
    48 }

    复制代码

      

      Main: 一切程序都有入口主函数main,C#也是如此,在Program.cs文件中定义了Program类,该类中拥有主函数main( ), 在main函数中,第三行代码是一切的开始,调用Form1类的构造函数,创建一个Form对象,一切由此开始,代码如下:

    复制代码

     1 /* @filename: Program.cs */
     2 using System;
     3 using System.Collections.Generic;
     4 using System.Linq;
     5 using System.Windows.Forms;
     6 
     7 namespace HelloWorld
     8 {
     9     static class Program
    10     {
    11         /// <summary>
    12         /// 应用程序的主入口点。
    13         /// </summary>
    14         [STAThread]
    15         static void Main()
    16         {
    17             Application.EnableVisualStyles();
    18             Application.SetCompatibleTextRenderingDefault(false);
    19             Application.Run(new Form1());  //调用Form1类的构造函数,创建一个Form对象,一切由此开始
    20         }
    21     }
    22 }

    复制代码

     

      再来解释一下最后三个文件:第一个文件主要是应用程序发布时的一些属性设置,版本号,属性,版权之类的,其余两个文件是工具自动生成的一些设置文件,不再过多赘述;

    复制代码

    /* @filename:Assemblylnfo.cs*/
    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    
    // 有关程序集的一般信息由以下
    // 控制。更改这些特性值可修改
    // 与程序集关联的信息。
    [assembly: AssemblyTitle("HelloWorld")]
    [assembly: AssemblyDescription("")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("")]
    [assembly: AssemblyProduct("HelloWorld")]
    [assembly: AssemblyCopyright("Copyright ©  2018")]
    [assembly: AssemblyTrademark("")]
    [assembly: AssemblyCulture("")]
    
    // 将 ComVisible 设置为 false 会使此程序集中的类型
    //对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
    //请将此类型的 ComVisible 特性设置为 true。
    [assembly: ComVisible(false)]
    
    // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
    [assembly: Guid("094ac56a-7a59-4f32-a2eb-857135be4d2c")]
    
    // 程序集的版本信息由下列四个值组成: 
    //
    //      主版本
    //      次版本
    //      生成号
    //      修订号
    //
    // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
    // 方法是按如下所示使用“*”: :
    // [assembly: AssemblyVersion("1.0.*")]
    [assembly: AssemblyVersion("1.0.0.0")]
    [assembly: AssemblyFileVersion("1.0.0.0")]

    复制代码

     

    3、Hello,World

      下面就正式开始C#程序的设计,首先是界面的实现,可以随意从控件工具箱中拖放控件到窗体中,这里我拖动两个Button和一个TextBox,并在右边设置框中修改每个控价的属性,界面如图:

    展开全文
  • 工控机上位机软件的开发历程(一)

    万次阅读 多人点赞 2018-10-17 16:56:02
    本人就职于一家环境监测公司,上位机软件的主要功能是采集各仪器的数据,然后存储起来,并传送到环保局平台。 刚到公司的时候,公司使用的是组态软件(用以显示流程图),然后再开发了报表软件、数据上传软件。因为...
  • C#上位机开发--保存日志

    千次阅读 2018-08-28 10:20:35
    如何保存文本框里面的内容? 方法1:参考杰杰的,直接保存死,非常简单。 方法2:用专业的类!  private void button15_Click(object sender, EventArgs e) ... // System.IO.File.WriteAllText(@"...
  • 上位机软件开发入门

    万次阅读 2017-03-25 18:23:53
    上位机是指:人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化(液压,水位,温度等)。 下位机是直接控制设备获取设备状况的的计算机,一般是PLC/单片机之类的。 上位机发出的命令首先给下位机,...
  • 工控上位机软件开发

    千次阅读 2019-05-31 12:05:50
    工控上位机软件开发全流程自研-上位机软件开发-工业级控制系统一、上位机软件开发底层设计二、上下位机通信的安全性三、上位机软件接收与存储研发四、数据清洗与图形展示研发五、上位机软件发送指令与回调六、上位机...
  • 还请大师指点一二,拖动一些工具没什么难点主要是程序新手有些是第一次见,谢谢
  • 用LabVIEW编写上位机

    千次阅读 2019-05-29 09:06:21
    要点: 1.安装VISA 2.底层通过串口转USB与PC相连,数据通过串口传输。串口名称即对应的串口号。当你插上USB后,LabVIEW会...总结:用Labview写通用板子的上位机,只用串口就行了。 参考:用LabVIEW编写上位机 ...
  • 1.参考文档:VC++-串口上位机编程实例 2文档地址:http://wenku.baidu.com/link?url=mokADmedzI2CD7b4hu8L3kTgTYKlxG52TcNdcfmbxceMXWipW95QEaQl959DJGmYBY7icMgw0dJSkIioeiut9xgtEwNrnamEOiOSNfkCq-C 制作的...
  • vs2013开发上位机软件和单片机通信

    千次阅读 2014-08-01 16:16:58
    3、设置上位机软件和单片机串口通信协议,主要是波特率,其他参数默认 4、调试 在单片机程序中设置一个提示,有上位机下发命名控制单片机 5、小结 上位机下发数据实现,单片机上传数据还要研究
  • VC++编写简单串口上位机程序

    万次阅读 多人点赞 2017-11-01 20:36:02
    VC++编写简单串口上位机程序 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用...
  • Python上位机软件图形界面实战(1)

    千次阅读 2020-05-30 11:45:18
    引言 今天开始用python实战利用qt5开发软件图形界面 1 环境配置 在Pycharm界面左下角点击如图所示,打开终端分别输入pip install pyqt5,和pip install pyqt5-tools进行下载安装。 ...
  • C++实现串口通信上位机软件

    千次阅读 2018-08-08 15:12:41
    串口使用的是RS232总线进行通信,通信方式是半双工。有两种方式可以实现串口通信,一种是通过ActiveX控件这种方法程序简单,但欠灵活。第二个是可以通过调用Windows的API函数,本例程通过第二种方式。...
  • 上位机与三菱PLC通信

    千次阅读 2020-10-21 12:01:34
    目前使用过两种方法与三菱PLC通信 一种是:二进制和ASCII码通信 另一种是通过Mx Compment与三菱PLC通信 这里着重介绍通过Mx Compment 软件通信: ...找适合自己的开发语言来运行示例文件以便读写寄存器
  • 在嵌入式项目开发中,无论是单片机项目、嵌入式Linux项目、FPGA项目,上位机始终是一个很重要的部分。
  • 上位机与下位机的区别

    万次阅读 2011-01-20 17:28:00
    上位机:系统中起主控,主要作为系统的规划控制,属于决策层。下位机:具体执行层,主要完成系统规划层下达的任务。上位机是指人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化(液压,水位,温度等)...
1 2 3 4 5 ... 20
收藏数 9,225
精华内容 3,690
关键字:

上位机开发