-
2019-04-27 18:43:02
写在前面
大家好!我是大学里一枚菜鸡在读本科生。这是我第一次在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.更多相关内容 -
匿名上位机波形显示代码
2020-08-09 19:24:07代码基于stm32f103c8t6,通过串口将数据发送到匿名上位机,并将数据波形显示出来,方便调试参数。 -
串口上位机波形.rar
2019-06-14 09:34:49好用的串口上位机波形,调试传感器数据利器。内有函数库,串口连接电脑,调用函数库函数发送电脑即可使用 -
C# WinForm写的简单串口助手及波形显示上位机
2020-12-30 17:31:08C# WinForm写的简单串口助手及波形显示 -
串口显示温度曲线上位机.exe
2020-07-02 11:43:19VB写的串口显示温度曲线上位机 利用串口上传温度数据就可以显示温度曲线 同时能显示温度的数值大小 实时监控数据 -
通过串口0将4组ADC数据发送到匿名上位机显示波形.rar
2020-07-25 09:30:50匿名科创地面站v4.34 -
匿名上位机V7波形显示教程
2021-10-25 16:46:461. 下位机程序 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#—上位机——数据波形显示
2018-07-26 15:54:03基于C#的显示数据波形的上位机,可进一步开发显示多条数据波形,在线保存数据,可将数据显示为excel格式 -
匿名上位机v7波形显示
2022-04-19 13:23:00根据匿名上位机灵活格式帧设置对应的 帧头 由于格式较为简单直接贴上原码供参考(一般调试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的串口波形上位机(完整程序源码)-电路方案
2021-04-21 17:48:52附件内容分享的是基于LabVIEW上位机与串口通信,通过LabVIEW上位机显示波形,在分享其实现的源码同时,分享一段LabVIEW上位机与串口通信工作原理。 基于LabVIEW的串口波形上位机界面展示: 定义通信格式及功能 因为... -
基于ZedGraph多路温度测量上位机波形显示
2020-05-04 16:43:24通过串口接收数据,将数据通过波形显示。 串口可自动识别串口号。 使用ZedGraph控件。每个通道可单独隐藏。 线宽可调整。 -
上位机接受数据波形显示.rar
2020-09-11 12:59:05stm32用匿名上位机V65串口通信,数据用波形显示,便于观察,单片机stm32C8T6,可移植,stm32用匿名上位机串口通信,数据用波形显示,便于观察,单片机stm32C8T6,可移植 -
C#上位机(ADC数据显示/波形显示)
2022-03-23 19:39:511.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#的多数据波形显示的上位机
2018-09-30 16:12:27基于C#开发的,可显示两个数据的波形,可作为调试助手(楼主自定义的通讯协议帧头帧尾[ ]),可导入数据,可随时间保存数据格式为excel。可进一步开发为多数据波形显示上位机。 -
上位机如何显示波形
2018-02-10 21:05:51本人代码新手,为了完成毕业设计需要用上位机做波形显示,然而作为一个生物狗,可是吃了不少苦头的,所以这里把自己的过程尽可能详细的写出,方便其他新人查阅。我这里用的是C#做的winform,原理各平台基本相通。不... -
开源QT写的串口调试上位机(带波形显示)
2014-11-23 19:08:36为了方便PC机同单片机(下位机)进行通信,需要开发一款基于串口协议的上位机辅助调试软件。软件不仅能够向下位机发送数据,发送指令进而控制下位机,而且还应该能准确接收下位机发来的数据,便于对下位机的一些... -
c# 波形显示上位机代码
2013-12-16 16:31:28功能:C#开发的上位机波形软件,双通道,串口数据上传,10位AD采样,分高八位,第八位。即,串口4字节发送数据。 -
波形显示上位机工程源码
2018-12-31 20:46:29一个单片机的串口上位机工程文件;注释详细,可自行修改代码获得个性化的上位机;使用VS2012;有三个调参通道,三个可选波形显示通道。根据需求可以自己模仿增加通道。 -
【QT上位机设计——串口收发和波形显示】
2021-03-28 17:05:02一.简介 最近粗略地学习了一下上位机的编程,大致了解了底层硬件与上位机之间的串口通信逻辑,TCP通信和UDP通信暂时还未学习。 ...2.波形显示界面 三.QT软件下载 下载地址:清华镜像网 ★按以下 -
QT从零开始作单片机上位机-串口调试助手+波形显示-实现串口模块的配置(2)
2021-06-04 11:28:24QT实现串口模块的配置(2) 一、先列举需要思考的问题: 怎么实现点击刷新按钮后,串口工具可以自动发现可用的COM口,并将com口显示在Combobox1? 如何添加所有可用的波特率?同样给其他Combobox添加相关的值? ... -
串口波形上位机
2014-08-14 16:40:16上传一款好用的电脑波形型上位机,通过串口发送数据,然后再电脑端显示数据波形(文件内包含上位机的串口通讯协议,以及使用代码,在stm32上亲测好用) -
使用C#编写的具有串口通信功能的上位机界面。检测,显示,存储和FFT分析
2019-05-05 02:38:30有个童鞋的程序的改编版,在CSDN可以找到,希望帮到有需要的伙伴,有资源大家一起分享! -
QT从零开始作单片机上位机-串口调试助手+波形显示
2021-05-25 16:05:21前言:笔者本想用codeblock+QT搭建一个上位机开发环境,来做一个单片机的上位机软件,不成功,于是干脆直接用QT开发。 下载QT5.1.0安装,下载地址一个官网,https://download.qt.io/archive/qt/5.1/ 一个是清华镜像... -
Qt语言编写上位机时,绘制动态波形,简单易懂的Demo
2019-03-13 17:52:42这是我在使用Qt语言编写上位机时,为将单片机sd卡保存的运行数据转换成动态波形过程中,借鉴的简单易懂Demo。 -
嵌入式实验,多通道示波器,上位机matlab通过串口实时显示波形
2018-02-13 14:31:45一共分为三个m文件,需要注意的是在ARM上的ADC采集数据要尽量高一点。... hold on %这一句经测试是必要的,没有这句的话~波形显示的句柄好像无法调用 global t; global x; global m; global i... -
MFC简易串口数据波形显示
2022-03-02 13:45:26MFC串口 -
STM32压力传感器信号采集- C#上位机 波形显示
2019-11-27 20:25:59/显示,使用C#编写上位机显示压力功能。 原理图 PCB 实物 上位机 201933yk8y7kg53q8277iu.png.thumb.jpg (121.81 KB, 下载次数: 0) 下载附件 保存到相册 2019-11-27 20:23 上传... -
C#上位机设计项目实战——06波形显示器
2020-07-12 11:32:00同时在画图界面,添加了快捷键控制主界面和波形显示。 2.开发tips tips1: 在右下角属性处,点击闪电标志,快速添加事件处理函数。 不用再傻乎乎的自己写定义。 tips2:添加一个新窗口操作流程 tips3:控制谁先... -
51获取MPU6050数据并通过匿名上位机显示波形
2017-12-04 18:14:38首先,我也不知道该怎么用上位机来显示波形,于是我请教了一位大佬,大佬和我说了这句话: 把传感器的数据按照地面站协议打包用串口发给电脑就行了 这句话得增大加粗来显示,因为这是接下来的核心思想。... -
基于QT的串口收发和波形绘制上位机程序
2021-03-29 00:51:18使用QT软件编写的串口收发上位机程序,适合初学者学习使用。同时包含波形的绘制界面,但是仍有较多BUG未解决。