精华内容
下载资源
问答
  • 开源一款基于Qt的串口波形显示上位机 & 以“笔”会友
    千次阅读
    2019-04-27 18:43:02

    开源一款基于Qt的串口波形显示上位机 & 以“笔”会友

    写在前面

    大家好!我是大学里一枚菜鸡在读本科生。这是我第一次在CSDN上发博客,我想开源一个我近几日编写的一个基于Qt的串口波形显示上位机 ,这个上位机参考了一些Qt官方的example代码,也在一些琐碎的地方结合了一些网上大神网友的新奇思路。之所以开源这个东西,是想以此为“敲门砖”,在网上寻找和我一样对Qt&嵌入式&编程 等等感兴趣的志同道合的朋友,然后在以后的学习、工作和生活中多多交流、互相帮助。当然,由于本人水平及其有限,因此代码不仅显得拙劣不堪,甚至可能漏洞百出,因此如果可能的话,我希望诸君在取阅之后能指点一二

    简要介绍

    基本界面

    波形显示界面
    基本收发界面

    功能简介

    1.Qt上位机,由串口完成数据通信,分为波形显示面板、基本收发面板和位于底部的串口状态信息面板三部分构成。
    2.串口状态信息面板可选择端口(COM口)及波特率,刷新按钮用于检测此时计算机的所有串口并更新,打开按钮用于
    打开和关闭串口。RX与TX标签显示串口通信的收发字节数,也可用于判断串口通信是否正在进行,而LineEdit为系统控制辅助显示。
    3.基本收发面板用于基本的数据接收,支持发送与接收的ASCII(其实是GBK)与HEX形式发送,对应的按钮功能“顾名思义”即可。特别地,发送框中按下[Ctrl]+[Enter]可快速发送。
    4.波形显示面板用于图形化显示下位机发送来的参数,最多支持20个变量的显示,且变量类型均应为float(IEEE754标准)。
    5.单击波形显示面板“变量”区的各变量名可设置各个变量显示与否,下方的LineEdit用于显示对应变量在当前光标下的实时值(如无光标则默认显示最新值)。
    6.波形显示面板“控制”区的各控件功能“顾名思义”即可,其中“截图”和“保存数据”会在当前程序目录下新建“/SavedData”和“/SavedImage”文件夹。
    7.波形显示面板“控制”区的“设置”按钮会弹出设置框,在该设置框的设置应用后,会自动记录到ini文件中,作为下次程序启动的参数信息。

    开源地址

    点击这里进入Github地址
    打算在没有人加入更新的情况下就在2019年9月1日前删除上述地址。

    最后的说明

    1.要想测试波形画的效果,请在下位机编写相应程序或者直接导入我所给出下载地址的 ./SavedData/ 文件夹下我预存的数据文件,那是我在编程测试的时候留下的一个数据。
    2. 第一次发布源码和写博客,文笔拙劣,并且有很多东西没有说清楚,所以,还是希望诸君主动联系。可以联系Leowootsi@outlook.com.

    更多相关内容
  • 代码基于stm32f103c8t6,通过串口将数据发送到匿名上位机,并将数据波形显示出来,方便调试参数。
  • 串口上位机波形.rar

    2019-06-14 09:34:49
    好用的串口上位机波形,调试传感器数据利器。内有函数库,串口连接电脑,调用函数库函数发送电脑即可使用
  • C# WinForm写的简单串口助手及波形显示
  • VB写的串口显示温度曲线上位机 利用串口上传温度数据就可以显示温度曲线 同时能显示温度的数值大小 实时监控数据
  • 匿名科创地面站v4.34
  • 1. 下位机程序 1.1 协议文档分析 匿名科创在V7版本的协议文档上给出了很详细的范例,所以下位机程序非常好写,笔者是...自动使用pdf阅读器打开文件名为ANO_XIEYI.pdf的文档(如果电脑没有显示pdf阅读器,不知道是否能显

    1. 下位机程序

    1.1 协议文档分析

    匿名科创在V7版本的协议文档上给出了很详细的范例,所以下位机程序非常好写,笔者是第一次写匿名上位机的下位机程序。以STM32发送一个无符号16位的数据为例讲解下位机程序的书写。

    1.1.1 官方协议文档

    1.1.1.1 查找方法

    • 打开上位机,把鼠标慢慢移动到左侧的边框处,等待一会会弹出左侧菜单栏
      在这里插入图片描述
    • 点击弹出的菜单栏中的帮助信息子菜单
      在这里插入图片描述
    • 点击通信协议
      在这里插入图片描述
    • 自动使用pdf阅读器打开文件名为ANO_XIEYI.pdf的文档(如果电脑没有显示pdf阅读器,不知道是否能显示)
      在这里插入图片描述

    1.1.1.2 下位机协议分析

    1.1.1.2.1 协议总框架
    下位机协议由7部分组成,如下图所示,帧头(0xAA)、目标地址、功能码、数据长度、数据内容、和校验、附加校验。
    在这里插入图片描述

    各个部分详细解释:

    • 帧头: 每个数据包都得有帧头,其功能在于鉴别数据包的开始。
    • 目标地址:因为匿名通信协议是用于匿名科创的所有产品的通信,所以把数据不止发送给上位机,还有可能发送给其他的设备。所以需要该字段用于鉴别把数据发送给哪个设备。具体的地址在文档有介绍
      在这里插入图片描述
    • 功能码:表征该数据帧的功能,每个数据帧的功能有很多,用功能码作为数据的别称。
      常见功能码有如下:
    功能码数据名称
    0x00数据校验帧
    0x01惯性传感器数据
    0x02罗盘、气压、温度传感器数据
    0x03飞控姿态:欧拉角格式
    0x04飞控姿态:四元数格式
    0x05高度数据
    0x06飞控运行模式

    … 等等数据

    • 数据长度: 以字节作为单位,表示有效数据的长度(不包含帧头、目标地址、功能码、数据长度、和校验、附加校验)
    • 数据内容:采用小端模式,低字节在前,高字节在后,一个单元为一个字节。
    • 和校验:从帧头0xAA字节开始,一直到DATA区结束,对每一字节进行累加操作,只取低8位
    • 附加校验:计算和校验时,每进行一字节的加法运算,同时进行一次SUM CHECK的累加操作,只取低8位。
      校验程序示例:
    U8 sumcheck = 0; 
    U8 addcheck = 0; 
    For(u8 i=0; I < (data_buf[3]+4); i++) 
    { 
      sumcheck += data_buf[i];   //从帧头开始,对每一字节进行求和,直到DATA区结束 
      addcheck += sumcheck;    //每一字节的求和操作,进行一次sumcheck的累加 
    } 
    //如果计算出的sumcheck和addcheck和接收到的check数据相等,代表校验通过,反之数据有误 
    if(sumcheck == data_buf[data_buf[3]+4] && addcheck == data_buf[data_buf[3]+5]) 
      return true;    //校验通过 
    else 
      return false; //校验失败
    

    1.1.1.2.2 用户自定义数据协议分析
    文档页面: 6~7
    1.1.1.2.2.1 示例介绍
    灵活格式帧,我们也可以叫做用户自定义帧,也就是用户可以自己定义数据内容格式的数据帧。可能从名字无法很好的理解灵活格式帧有什么用,那么我们举一个简单的例子。
    加入我在调试一个自己写的滤波算法,传感器原始数据A,为int16 格式,使用滤波算法对A进行滤波后,得到滤波后数据B,B也是int16 格式。滤波后数据经过控制算法,输出一个控制量C,C是int32 格式。那我需要对滤波算法和控制算法进行调试,肯定是需要得到ABC三个数据的波形,根据波形进行数据分析。 那么如何将数据ABC发送至上位机进行显示呢,就要用到灵活格式帧了。灵活格式帧共10帧,帧ID 从0xF1到0xFA,每一帧最多可以携带10个数据,每一个数据可以分别设置为U8、S16、U16、S32的格式。如果您需要显示float型数据,可以根据数据范围以及精度要求,乘以1000或者100变成S32型整数进行传输。
    1.1.1.2.2.2 上位机配置

    • 点击左侧菜单栏中的协议通信,出现下图软件区域
      在这里插入图片描述

    • 点击右侧的边框
      在这里插入图片描述
      弹出了数据配置窗口
      在这里插入图片描述

    • 选中F1右侧的选择框,然后点击F1左侧的加号框
      在这里插入图片描述

    • 按照下图配置前三个数据的类型,这个类型是示例中的三个数据类型
      在这里插入图片描述

    • 我们配置数据容器。数据容器设置,什么是数据容器呢,就是刚才F1数据帧进行解析后,会解析出最多30个数据,那么用哪个数据进行波形显示,或者excel保存哪个数据呢,这就要数据容器了。匿名上位机设置有10个数据容器,对应本区域1到10选项卡。我们可以把数据容器想象成10个卡车,只有卡车能将数据传输到用户,那么这10辆卡车将哪个数据传输给用户呢,就是这数据容器配置区域进行配置了。
      具体配置如下图:
      在这里插入图片描述
      到此,上位机的配置完成,只需要单片机按照如下协议格式将数据发送至上位机,即可观察到对应的数据值
      开始刷新,并可绘制对应数据波形。

    1.1.1.2.2.3 下位机数据格式
    数据按照下图的格式:
    在这里插入图片描述
    DATA区域内容:
    举例说明DATA区域格式,例如上文,需要发送ABC三个数据,AB为int16 型,C为int32 型,那么ABC三个数据共2+2+4=8字节,那么LEN字节为8,帧ID 为0xF1,DATA区域依次放入ABC三个数据,然后计算SC、AC,完成后将本帧发送至上位机即可。

    1.1.1.2.2.4 代码实现
    驱动代码:
    ANO_DataProtocol.c

    #include "usart.h"
    #include "ANO_DataProtocol.h"
    #include "stm32f10x.h"
    
    #define BYTE0(dwTemp)       (*(char *)(&dwTemp))     //取出int型变量的低字节
    #define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))     //    取存储在此变量下一内存字节的内容,高字节
    #define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))
    #define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))
    
    void AnoTc_SendUserTest(s16 A, s16 B, s32 C)
    {
    	// AA 05 AF F1 02 E4 01 36
    	unsigned char _cnt = 0;
    	unsigned char i;
    	unsigned char sumcheck = 0;
    	unsigned char addcheck = 0;
    	
    	Data_to_Send[_cnt++] = 0xAA;
    	Data_to_Send[_cnt++] = 0xFF;
    	Data_to_Send[_cnt++] = 0xF1;
    	Data_to_Send[_cnt++] = 8;
    	Data_to_Send[_cnt++] = BYTE0(A);
    	Data_to_Send[_cnt++] = BYTE1(A);
    	Data_to_Send[_cnt++] = BYTE0(B);
    	Data_to_Send[_cnt++] = BYTE1(B);
    	Data_to_Send[_cnt++] = BYTE0(C);
    	Data_to_Send[_cnt++] = BYTE1(C);
    	Data_to_Send[_cnt++] = BYTE2(C);
    	Data_to_Send[_cnt++] = BYTE3(C);
    	
    	for(i = 0; i < _cnt; i++)
    	{
    		sumcheck += Data_to_Send[i];
    		addcheck += sumcheck;
    	}
    	//if(sumcheck == Data_to_Send[Data_to_Send[3]+4] && addcheck == Data_to_Send[Data_to_Send[3]+5])
    	Data_to_Send[_cnt++]=sumcheck;
    	Data_to_Send[_cnt++]=addcheck;
    	USART_SendCharArr(USART1, Data_to_Send,_cnt);
    }
    

    ANO_DataProtocol.h

    #ifndef __ANO_DATA_PROTOCOL_H__
    #define __ANO_DATA_PROTOCOL_H__
    
    #include "sys.h"
    
    void AnoTc_SendUserTest(s16 A, s16 B, s32 C);
    
    #endif
    

    main.c

    #include "stm32f10x.h"
    #include "delay.h"
    #include "sys.h"
    #include "usart.h"
    #include "ANO_DataProtocol.h"
    
    int main()
    {
    	u16 i = 0;
    	
        u32 ECG1,ECG2,ECG3;
        SystemInit();//系统时钟等初始化
        delay_init();	     //延时初始化
        NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);//串口初始化为9600//延时初始化
    
    	while(1)
    	{
    		for(i = 0; i < 400; i++)
    		{
    			AnoTc_SendUserTest(i, i+100, i+200);
    			delay_ms(100);
    		}
    		for(i = 400; i > 200; i--)
    		{
    			AnoTc_SendUserTest(i, i+100, i+200);
    			delay_ms(100);
    		}
    	}
    }
    

    2. 上位机波形

    在这里插入图片描述
    生成了奇怪的三角波

    3. 资源下载

    匿名上位机波形显示demo及协议文档: https://download.csdn.net/download/FourLeafCloverLLLS/34433481

    展开全文
  • 基于C#的显示数据波形上位机,可进一步开发显示多条数据波形,在线保存数据,可将数据显示为excel格式
  • 根据匿名上位机灵活格式帧设置对应的 帧头 由于格式较为简单直接贴上原码供参考(一般调试pid都是两个数据对比调试,所以我只写了两个发送对比的函数,一个int16和一个int32,已经完全够用了) 注意:由于发送...

    根据匿名上位机灵活格式帧设置对应的 帧头

    由于格式较为简单直接贴上原码供参考(一般调试pid都是两个数据对比调试,所以我只写了两个发送对比的函数,一个int16和一个int32,已经完全够用了)

    注意:由于发送量较大最好配置串口dma,这里的程序是stm32上的

    #ifndef ANO_TC_H
    #define ANO_TC_H
    
    #include "main.h"
    
    #define BYTE0(dwTemp)       (*(char *)(&dwTemp))
    #define BYTE1(dwTemp)       (*((char *)(&dwTemp) +1))
    #define BYTE2(dwTemp)       (*((char *)(&dwTemp) +2))
    #define BYTE3(dwTemp)       (*((char *)(&dwTemp) +3))
    
    void AnoTc_Send2Int32(int32_t _a,int32_t _b);
    void AnoTc_Send2Int16(int16_t _a,int16_t _b);
    void AnoTc_SendF1_Test(void);
    #endif
    #include "ano_tc.h"
    #include <stdio.h>
    #include <math.h>
    
    
    /* communication Interface */
    #include "usart.h"
    void Ano_Tc_Send_Dma(uint8_t *buf,uint8_t len)
    {
    	while(huart1.gState!=HAL_UART_STATE_READY);
     if(HAL_UART_Transmit_DMA(&huart1, buf,len)!= HAL_OK) //判断是否发送正常,如果出现异常则进入异常中断函数
      {
       Error_Handler();
      }
    	
    }
    /* communication Interface end */
    
    
    
    void AnoTc_Send2Int16(int16_t _a,int16_t _b)//发送两个 int16 的数据
    {
    	static uint8_t DataToSend[10]={0XAA,0XFF,0XF1,4};//4 byte
      uint8_t sc=0;
      uint8_t ac=0;
      uint8_t i=0;
    
        DataToSend[4]=BYTE0(_a);
        DataToSend[5]=BYTE1(_a);
        DataToSend[6]=BYTE0(_b);
        DataToSend[7]=BYTE1(_b);
        for( i=0;i<DataToSend[3]+4;i++)
        {
            sc+=DataToSend[i];
            ac+=sc;
        }
        DataToSend[8]=sc;
        DataToSend[9]=ac;
    		
    		Ano_Tc_Send_Dma(DataToSend,10);
    }
    
    void AnoTc_Send2Int32(int32_t _a,int32_t _b)//发送两个 int32 的数据
    {
    static uint8_t DataToSend[14]={0XAA,0XFF,0XF1,8};//通信协议决定 8byte
    uint8_t sc=0;
    uint8_t ac=0;
    uint8_t i=0;
    
        DataToSend[4]=BYTE0(_a);
        DataToSend[5]=BYTE1(_a);
    	DataToSend[6]=BYTE2(_a);
    	DataToSend[7]=BYTE3(_a);
        DataToSend[8]=BYTE0(_b);
        DataToSend[9]=BYTE1(_b);
    	DataToSend[10]=BYTE2(_b);
    	DataToSend[11]=BYTE3(_b);
    	
        for( i=0;i<DataToSend[3]+4;i++)
        {
            sc+=DataToSend[i];
            ac+=sc;
        }
    		
        DataToSend[12]=sc;
        DataToSend[13]=ac;
    		
    		Ano_Tc_Send_Dma(DataToSend,14);
    }
    
    void AnoTc_SendF1_Test(void)
    {
        static double i;
        int sum1,sum2;
        i+=0.01;
        if(i==6.28) i=0;
        sum1=(int16_t)(1000*sin(i));
    	sum2=(int16_t)(1000*cos(i));
     // AnoTc_Send2Int16(sum2,sum1);
    	AnoTc_Send2Int32(sum2,sum1);
    }
    	

    1、在程序中执行 void AnoTc_SendF1_Test(void)

    2、在匿名上位机设置

     数据1和数据2设置成int32的

    3、波形显示

     

     

    展开全文
  • 附件内容分享的是基于LabVIEW上位机串口通信,通过LabVIEW上位机显示波形,在分享其实现的源码同时,分享一段LabVIEW上位机串口通信工作原理。 基于LabVIEW的串口波形上位机界面展示: 定义通信格式及功能 因为...
  • 通过串口接收数据,将数据通过波形显示串口可自动识别串口号。 使用ZedGraph控件。每个通道可单独隐藏。 线宽可调整。
  • stm32用匿名上位机V65串口通信,数据用波形显示,便于观察,单片机stm32C8T6,可移植,stm32用匿名上位机串口通信,数据用波形显示,便于观察,单片机stm32C8T6,可移植
  • 1.2 获取硬件的ADC值,传入上位机,并进行十六进制显示 1.2.1 窗体事件 public Form1() { InitializeComponent(); //添加串口数据接收事件--可以直接生成,也可以手动输入。 //this.serialPort1.DataReceived += ...

    1.简单版(ADC数据显示在进度条上)

    硬件链接热敏电阻、电容等。低电平为0x00,高电平为0xFF。

    1.1 窗体设计
    在这里插入图片描述

    上述窗体设计也没什么特殊的,都是平时应用的。

    1.2 获取硬件的ADC值,传入上位机,并进行十六进制显示
    1.2.1 窗体事件

    public Form1()
    {
       InitializeComponent();
       //添加串口数据接收事件--可以直接生成,也可以手动输入。
       //this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.PortDataReceivedEvent);
    
       //为了防止进程之间出错,用到串口必须把检查线程置于关闭
       System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
    
       //扫描串口信息,为了之后方便使用,此处进行封装一个串口扫描的函数
       SearchAndSerialComboBox(serialPort1, comboBox1);
    }
    

    1.2.2 扫描串口事件

    private void SearchAndSerialComboBox(SerialPort MyPort, ComboBox MyBox)
    {
        //定义一个内存缓存变量
        string Buffer;
        //清空ComboBox下拉控件内容
        MyBox.Items.Clear();
        //遍历20个串口
        for (int i = 1; i < 20; i++)
        {
            //如果运行成功,就将相应的串口信息添加至ComboBox。
            try
            {
                //将读取的串口信息存在内存中
                Buffer = "COM" + i.ToString();
                //将内存中的串口信息给相应的控件
                MyPort.PortName = Buffer;
                //打开串口如果运行失败,后面的代码就不执行了,直接跳转至catch。
                MyPort.Open();
                //将获取的串口添加到ComboBox
                MyBox.Items.Add(Buffer);
                //关闭串口
                MyPort.Close();
            }
            catch
            {
            }
        }
    }
    

    1.2.3 打开串口事件

    private void button1_Click(object sender, EventArgs e)
    {
        if (serialPort1.IsOpen)
        {
            //================串口关闭====================
    
            //让第二个groupBox2组件不显示
            groupBox2.Visible = false;
            //或者由窗体大小来控制哪个控件不显示。---缩小这里的size是针对于整个窗体而言的。
            //this.Size = new Size(810, 143);
            //串口关闭一般不会有异常,因此不需要try catch
            serialPort1.Close();
            button1.Text = "打开串口";
        }
        else
        { 
            //===============串口打开=====================
            try
            {
                //获取串口号
                serialPort1.PortName = comboBox1.Text;
                //打开串口
                serialPort1.Open();
                //让第二个groupBox2组件显示
                groupBox2.Visible = true;
                //放大
                //this.Size = new Size(810, 275);
                button1.Text = "关闭串口";
            }
            catch (Exception)
            {
                MessageBox.Show("串口打开错误", "错误提示");
                throw;
            }
        }
    }
    

    1.今天在串口按钮事件中新加了一个功能,那就是打开串口,groupBox2组件显示,窗体放大。关闭串口groupBox2组件不显示,窗体缩小。
    2.显示的函数:public bool Visible { get; set; }
    (1)摘要: 获取或设置一个值,该值指示是否显示该控件及其所有子控件。
    (2)返回结果: 如果显示该控件及其所有子控件,则为 true;否则为 false。 默认值为 true。
    3.窗体放大缩小的函数:public Size Size { get; set; }
    (1)摘要: 获取或设置窗体的大小。
    (2)返回结果: System.Drawing.Size,它表示窗体的大小。

    1.2.4 串口事件

    //串口事件
    private void PortDataReceivedEvent(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        //读取串口的数据,存入缓冲区中。
        byte Data = (Byte)serialPort1.ReadByte();
        //给进度条赋值
        progressBar1.Value = Data;
        //将缓冲区的数据转化为16进制。
        string str = Data.ToString("x");
        //标准化格式输出数据的值。
        textBox1.Text = "0x" + (str.Length == 1 ? "0" + str : str);
    }
    

    这里实现的功能就是将硬件传给串口的数据存入缓冲区,进而控制进度条,和显示数值在textbox中。也没什么难度,之前都有详细介绍过。

    1.2.5 运行结果在这里插入图片描述

    因为没有硬件,无法验证。

    2.通过多个进度条显示ADC数据,进而形成波形,可以查看数据的变化规律

    其实设计的原理就是将进度条封装在一个数组中,进而在串口函数中进行遍历赋值操作。

    2.1 窗体设计
    在这里插入图片描述
    2.2 将进度条控件存放在一个数组中,并返回一个对象数组

    //将进度条控件存放在一个数组中,并返回一个对象数组。
    ProgressBar[] GetProgressBar()
    {
        return new ProgressBar[]
        {
         progressBar1,progressBar2,progressBar3,progressBar4,progressBar5,
         progressBar6,progressBar7,progressBar8,progressBar9,progressBar10
        };   
    }
    

    在这里插入图片描述

    2.3 串口事件

    //串口事件
    private void PortDataReceivedEvent(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
       //获取进度条数组
       ProgressBar[] MyProgressBar = GetProgressBar();
       //读取串口的数据,存入自己定义的缓冲区data中。
       byte[] Data = new byte[serialPort1.BytesToRead];
       //读串口的缓冲区数据
       serialPort1.Read(Data, 0, Data.Length);
       //遍历数组
       foreach (byte Mydata in Data)
       {
           for (int i = 0; i < 10; i++)//MyProgressBar.Length其实就是10
           {
               //给数组赋值获取的方式,给进度条赋值,获取波形。
               MyProgressBar[10 - i].Value = MyProgressBar[10 - i - 1].Value;
           }
           //将串口数据的值默认给progressBar1控件
           progressBar1.Value = (int)Mydata;
           //将缓冲区的数据转化为16进制。
           string str = Mydata.ToString("x");
           //标准化格式输出数据的值。
           textBox1.Text = "0x" + (str.Length == 1 ? "0" + str : str);
       }
    }
    

    在这里插入图片描述

    2.4 打开串口按钮事件

    //打开串口按钮事件
    private void button1_Click(object sender, EventArgs e)
    {
        if (serialPort1.IsOpen)
        {
            //================串口关闭====================
            //让第二个groupBox2组件不显示
            groupBox2.Visible = false;
            //设置窗体大小--缩小
            this.Size = new Size(815, 147);
            //串口关闭一般不会有异常,因此不需要try catch
            serialPort1.Close();
            //获取进度条数组
            ProgressBar[] MyProgressBar = GetProgressBar();
            //遍历进度条
            foreach (ProgressBar MyBar in MyProgressBar)
            {
                //关闭串口后,让进度条值归零
                MyBar.Value = 0;
            }
            button1.Text = "打开串口";
        }
        else
        { 
            //===============串口打开=====================
            try
            {
                //获取串口号
                serialPort1.PortName = comboBox1.Text;
                //打开串口
                serialPort1.Open();
                //让第二个groupBox2组件不显示
                groupBox2.Visible = true;
                //设置窗体大小--放大
                this.Size = new Size(815, 549);
                button1.Text = "关闭串口";
    
            }
            catch (Exception)
            {
                MessageBox.Show("串口打开错误", "错误提示");
                throw;
            }
    
        }
    }
    

    在这里插入图片描述
    2.5 运行结果
    在这里插入图片描述
    3.波形一般都是垂直的,更换控件,即可以达到效果。
    3.1 窗体设计
    在这里插入图片描述

    注意trackBar的最大值设置为255.一个字节大小就可以。

    3.2 将trackBar控件存放在一个数组中,并返回一个对象数组

    //将TrackBar控件存放在一个数组中,并返回一个对象数组。
    TrackBar[] GetTrackBar()
    {
        return new TrackBar[]
        {trackBar1,trackBar2,trackBar3,trackBar4,trackBar5,
         trackBar6,trackBar7,trackBar8,trackBar9,trackBar10
        };   
    }
    

    在这里插入图片描述
    3.3 串口事件

    private void PortDataReceivedEvent(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
       //获取进度条数组
       TrackBar[] MyTrackBar = GetTrackBar();
       //读取串口的数据,存入自己定义的缓冲区data中。
       byte[] Data = new byte[serialPort1.BytesToRead];
       //读串口的缓冲区数据
       serialPort1.Read(Data, 0, Data.Length);
       //遍历数组
       foreach (byte Mydata in Data)
       {
           for (int i = 0; i < 10; i++)//MyProgressBar.Length其实就是10
           {
               //给数组赋值获取的方式,给进度条赋值,获取波形。
               MyTrackBar[10 - i].Value = MyTrackBar[10 - i - 1].Value;
           }
           //将串口数据的值默认给progressBar1控件
           trackBar1.Value = (int)Mydata;
           //将缓冲区的数据转化为16进制。
           string str = Mydata.ToString("x");
           //标准化格式输出数据的值。
           textBox1.Text = "0x" + (str.Length == 1 ? "0" + str : str);
       }
    }
    

    3.4 打开串口按钮事件

    //打开串口按钮事件
    private void button1_Click(object sender, EventArgs e)
    {
        if (serialPort1.IsOpen)
        {
            //================串口关闭====================
            //让第二个groupBox2组件不显示
            groupBox2.Visible = false;
            //设置窗体大小--缩小
            this.Size = new Size(815, 147);
            //串口关闭一般不会有异常,因此不需要try catch
            serialPort1.Close();
            //获取进度条数组
            TrackBar[] MyTrackBar = GetTrackBar();
            //遍历进度条
            foreach (TrackBar MyBar in MyTrackBar)
            {
                //关闭串口后,让进度条值归零
                MyBar.Value = 0;
            }
            button1.Text = "打开串口";
        }
        else
        { 
            //===============串口打开=====================
            try
            {
                //获取串口号
                serialPort1.PortName = comboBox1.Text;
                //打开串口
                serialPort1.Open();
                //让第二个groupBox2组件不显示
                groupBox2.Visible = true;
                //设置窗体大小--放大
                this.Size = new Size(815, 549);
                button1.Text = "关闭串口";
    
            }
            catch (Exception)
            {
                MessageBox.Show("串口打开错误", "错误提示");
                throw;
            }
    
        }
    }
    

    进度条事件和trackBar控件,只需要修该控件名称即可。

    3.5 运行结果
    在这里插入图片描述

    展开全文
  • 基于C#开发的,可显示两个数据的波形,可作为调试助手(楼主自定义的通讯协议帧头帧尾[ ]),可导入数据,可随时间保存数据格式为excel。可进一步开发为多数据波形显示上位机
  • 上位机如何显示波形

    千次阅读 2018-02-10 21:05:51
    本人代码新手,为了完成毕业设计需要用上位机波形显示,然而作为一个生物狗,可是吃了不少苦头的,所以这里把自己的过程尽可能详细的写出,方便其他新人查阅。我这里用的是C#做的winform,原理各平台基本相通。不...
  • 开源QT写的串口调试上位机(带波形显示

    万次阅读 热门讨论 2014-11-23 19:08:36
    为了方便PC机同单片机(下位机)进行通信,需要开发一款基于串口协议的上位机辅助调试软件。软件不仅能够向下位机发送数据,发送指令进而控制下位机,而且还应该能准确接收下位机发来的数据,便于对下位机的一些...
  • 功能:C#开发的上位机波形软件,双通道,串口数据上传,10位AD采样,分高八位,第八位。即,串口4字节发送数据。
  • 一个单片机的串口上位机工程文件;注释详细,可自行修改代码获得个性化的上位机;使用VS2012;有三个调参通道,三个可选波形显示通道。根据需求可以自己模仿增加通道。
  • 一.简介 最近粗略地学习了一下上位机的编程,大致了解了底层硬件与上位机之间的串口通信逻辑,TCP通信和UDP通信暂时还未学习。 ...2.波形显示界面 三.QT软件下载 下载地址:清华镜像网 ★按以下
  • QT实现串口模块的配置(2) 一、先列举需要思考的问题: 怎么实现点击刷新按钮后,串口工具可以自动发现可用的COM口,并将com口显示在Combobox1? 如何添加所有可用的波特率?同样给其他Combobox添加相关的值? ...
  • 串口波形上位机

    2014-08-14 16:40:16
    上传一款好用的电脑波形上位机,通过串口发送数据,然后再电脑端显示数据波形(文件内包含上位机串口通讯协议,以及使用代码,在stm32上亲测好用)
  • 有个童鞋的程序的改编版,在CSDN可以找到,希望帮到有需要的伙伴,有资源大家一起分享!
  • 前言:笔者本想用codeblock+QT搭建一个上位机开发环境,来做一个单片机的上位机软件,不成功,于是干脆直接用QT开发。 下载QT5.1.0安装,下载地址一个官网,https://download.qt.io/archive/qt/5.1/ 一个是清华镜像...
  • 这是我在使用Qt语言编写上位机时,为将单片机sd卡保存的运行数据转换成动态波形过程中,借鉴的简单易懂Demo。
  • 一共分为三个m文件,需要注意的是在ARM上的ADC采集数据要尽量高一点。... hold on %这一句经测试是必要的,没有这句的话~波形显示的句柄好像无法调用 global t; global x; global m; global i...
  • MFC串口
  • /显示,使用C#编写上位机显示压力功能。 原理图   PCB   实物   上位机   201933yk8y7kg53q8277iu.png.thumb.jpg (121.81 KB, 下载次数: 0) 下载附件   保存到相册 2019-11-27 20:23 上传...
  • 同时在画图界面,添加了快捷键控制主界面和波形显示。 2.开发tips tips1: 在右下角属性处,点击闪电标志,快速添加事件处理函数。 不用再傻乎乎的自己写定义。 tips2:添加一个新窗口操作流程 tips3:控制谁先...
  • 51获取MPU6050数据并通过匿名上位机显示波形

    千次阅读 多人点赞 2017-12-04 18:14:38
    首先,我也不知道该怎么用上位机显示波形,于是我请教了一位大佬,大佬和我说了这句话: 把传感器的数据按照地面站协议打包用串口发给电脑就行了 这句话得增大加粗来显示,因为这是接下来的核心思想。...
  • 使用QT软件编写的串口收发上位机程序,适合初学者学习使用。同时包含波形的绘制界面,但是仍有较多BUG未解决。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,508
精华内容 603
关键字:

串口上位机波形显示

友情链接: polar.rar