搜索
bottom↓
回复: 25

有没有老哥推荐一下好用的串口收数据画波形图的小软件?

  [复制链接]

出0入98汤圆

发表于 2019-4-18 15:26:28 | 显示全部楼层 |阅读模式
本帖最后由 rclong 于 2019-4-18 17:00 编辑

没错,又是用keil uversion5开发STC89C52
最近要给别人演示一下PID,
就想在电脑上搞个软件接收串口发上来的数据,然后实时绘制出来
最好又能实现下发PID参数
这样我就可以一面调节,一面又观察到超调,振铃之类的

有没有老哥推荐一下相关软件?

我在github上找到一个看起来还挺不错的样子
界面也比较酷黑

本来想把软件也传上来,但附件大小只给16MB,还是老哥们自己动手吧
现在传上来的只是软件的介绍页面





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入8汤圆

发表于 2019-4-18 15:28:56 | 显示全部楼层
匿名上位机倒是可以

出0入104汤圆

发表于 2019-4-18 15:30:47 | 显示全部楼层
win10 微软商店搜就有一个

出0入98汤圆

 楼主| 发表于 2019-4-18 15:35:08 | 显示全部楼层
本帖最后由 rclong 于 2019-4-18 15:46 编辑
kevincoooool 发表于 2019-4-18 15:30
win10 微软商店搜就有一个


那软件叫什么呢老哥


我用"串口"搜了一下,有个带绘图功能的串口助手,不过我发现要20块买永久授权才能绘图,是那个吗?

出0入0汤圆

发表于 2019-4-18 15:46:15 | 显示全部楼层
串口猎人似乎可以

我也写了个画曲线的软件,可能不太好用:
帖子的65楼 https://www.amobbs.com/thread-5702129-1-1.html

出20入186汤圆

发表于 2019-4-18 18:38:37 | 显示全部楼层

我前段时间调PID用的,看下

程序,

串口协议我稍候传递

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出20入186汤圆

发表于 2019-4-18 18:40:41 | 显示全部楼层
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO.Ports;
  10. using System.IO;
  11. namespace PID测试
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         int ViewIndex = 0;
  16.         /// <summary>
  17.         /// 通信COM口
  18.         /// </summary>
  19.         SerialPort Com;
  20.         /// <summary>
  21.         /// 接收串口数据
  22.         /// </summary>
  23.         List<byte> Data = new List<byte>();
  24.         /// <summary>
  25.         /// 所有接收数据集合
  26.         /// </summary>
  27.         List<double []> Temp = new List<double[]>();
  28.         public Form1()
  29.         {
  30.             InitializeComponent();
  31.             var files= Directory.GetFiles(".", "*.txt");
  32.             if (files.Length > 0)
  33.                 txtName.Items.AddRange(files);
  34.         }

  35.         private void Form1_Load(object sender, EventArgs e)
  36.         {
  37.             cmbComSrc.Items.AddRange(SerialPort.GetPortNames());
  38.         }

  39.         private void BtnStart_Click(object sender, EventArgs e)
  40.         {
  41.             if (btnStart.Text == "开始")
  42.             {
  43.                 if (cmbComSrc.SelectedIndex > -1)
  44.                 {
  45.                     Com = new SerialPort(cmbComSrc.SelectedItem.ToString());
  46.                     Com.BaudRate = 115200;
  47.                     Com.Open();
  48.                     Com.DataReceived += Com_DataReceived;
  49.                     btnStart.Text = "停止";
  50.                     SetPID(0xa5, 0);
  51.                 }
  52.                 else
  53.                 {
  54.                     MessageBox.Show("未选择有效的COM口");
  55.                 }
  56.             }
  57.             else {
  58.                 Com.Close();
  59.                 btnStart.Text = "开始";
  60.             }
  61.         }

  62.         private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
  63.         {
  64.             byte[] dat = new byte[Com.BytesToRead];
  65.             Com.Read(dat, 0, dat.Length);
  66.             System.Diagnostics.Debug.WriteLine(string.Join(",", dat.Select(n=>Convert.ToString((int)n,16))));
  67.             Data.AddRange(dat);
  68.             loop:
  69.             int pos1 = 0, pos2 = 0;
  70.             pos1 = FindFlag(Data, 0, 0xa5);
  71.             pos2 = FindFlag(Data, pos1+1, 0xf5);
  72.             if (pos2 - pos1 == 18+6) {
  73.                 var d= Data.Skip(pos1+1).Take(18).ToArray();
  74.                 Int16[] d2 = new Int16[9];
  75.                 for (int i = 0; i < 9; i++) {
  76.                     d2[i] = (Int16)((d[i*2] << 8) + d[i*2 + 1]);
  77.                 }
  78.                 double[] d3 = new double[9];
  79.                 d3[0] = d2[0];
  80.                 d3[1] = d2[1];
  81.                 d3[2] = d2[2] / 100.0;  //p
  82.                 d3[3] = d2[3] / 1000.0; //i
  83.                 d3[4] = d2[4] / 100.0;  //d
  84.                 d3[5] = d2[5];
  85.                 d3[6] = d2[6];
  86.                 d3[7] = d2[7];
  87.                 d3[8] = d2[8];
  88.                 d3.Select(n => Math.Round(n, 3)).ToArray();
  89.                 Temp.Add(d3);
  90.                 this.Invoke(new Action(() => {
  91.                     this.Text = "PID测试  " + (string.Join(",", d3));
  92.                 }));
  93.                 Data.Clear();
  94.                 //Data.RemoveRange(0, pos2);
  95.                 pictureBox1.Invalidate();
  96.             }
  97.             if (pos2 > 10 && pos1 >= 0 && pos2-pos1 != 18 + 6) {
  98.                 Data.RemoveRange(0, pos2);
  99.                 goto loop;
  100.             }
  101.             //if (Data.Count > 500)
  102.             //    Data.RemoveRange(0, 400);
  103.         }
  104.         /// <summary>
  105.         /// 查找流中的标志位
  106.         /// </summary>
  107.         /// <param name="data"></param>
  108.         /// <param name="start"></param>
  109.         /// <param name="flag"></param>
  110.         /// <returns></returns>
  111.         int FindFlag(List<byte> data, int start, byte flag)
  112.         {
  113.             int c = 0;
  114.             for (int i = start; i < data.Count; i++)
  115.             {
  116.                 if (data[i] == flag)
  117.                     c++;
  118.                 else
  119.                     c = 0;
  120.                 if (c == 6)
  121.                 {
  122.                     return i;
  123.                 }
  124.             }
  125.             return 0;
  126.         }

  127.         private void PictureBox1_Paint(object sender, PaintEventArgs e)
  128.         {
  129.             if (Temp.Count < 1)
  130.                 return;
  131.             var g = e.Graphics;
  132.             Pen[] p = new Pen[] {
  133.                 new Pen(labSetTemp.BackColor),
  134.                 new Pen(labNowTemp.BackColor),
  135.                 new Pen(labPn.BackColor),
  136.                 new Pen(labIn.BackColor),
  137.                 new Pen(labDn.BackColor),
  138.                 new Pen(labOut.BackColor)
  139.             };
  140.             double[] max = new double[9];
  141.             max[0] = 580;
  142.             max[1] = 580;
  143.             max[5] = 500;
  144.             max[6] = 800;
  145.             max[7] = 500;
  146.             max[8] = 1000;
  147.             labSetTempMax.Text = max[0].ToString();
  148.             labNowTempMax.Text = max[1].ToString();
  149.             labPMax.Text = max[5].ToString();
  150.             labIMax.Text = max[6].ToString();
  151.             labDMax.Text = max[7].ToString();
  152.             labOutMax.Text = max[8].ToString();
  153.             var h =(float) pictureBox1.Height;
  154.             
  155.             for (int i = 1,i2=ViewIndex+1; i < Temp.Count&& i2 < Temp.Count; i++,i2++) {

  156.                 g.DrawLine(p[0], i - 1, (float)(h - Temp[i2 - 1][0] * (h/max[0])), i, h - (float)(Temp[i2][0] * (h/max[0])));
  157.                 g.DrawLine(p[1], i - 1, (float)(h - Temp[i2 - 1][1] * (h/max[1])), i, h - (float)(Temp[i2][1] * (h/max[1])));
  158.                 g.DrawLine(p[2], i - 1, (float)(h - Temp[i2 - 1][5] * (h/max[5])), i, h - (float)(Temp[i2][5] * (h/max[5])));
  159.                 g.DrawLine(p[3], i - 1, (float)(h - Temp[i2 - 1][6] * (h/max[6])), i, h - (float)(Temp[i2][6] * (h/max[6])));
  160.                 g.DrawLine(p[4], i - 1, (float)(h - Temp[i2 - 1][7] * (h/max[7])), i, h - (float)(Temp[i2][7] * (h/max[7])));
  161.                 g.DrawLine(p[5], i - 1, (float)(h - Temp[i2 - 1][8] * (h/max[8])), i, h - (float)(Temp[i2][8] * (h/max[8])));
  162.             }
  163.             var d3 = Temp.Last();
  164.             if (!labSetTemp.Focused)
  165.                 labSetTemp.Text = d3[0].ToString();
  166.             labNowTemp.Text = d3[1].ToString();
  167.             if (!txtP.Focused)
  168.                 txtP.Text = d3[2].ToString();
  169.             if (!txtI.Focused)
  170.                 txtI.Text = d3[3].ToString();
  171.             if (!txtD.Focused)
  172.                 txtD.Text = d3[4].ToString();
  173.             labPn.Text = d3[5].ToString();
  174.             labIn.Text = d3[6].ToString();
  175.             labDn.Text = d3[7].ToString();
  176.             labOut.Text = d3[8].ToString();

  177.         }

  178.         private void BtnSave_Click(object sender, EventArgs e)
  179.         {
  180.             File.WriteAllLines(txtName.Text, Temp.Select(n => string.Join(",", n)));
  181.         }

  182.         private void BtnLoad_Click(object sender, EventArgs e)
  183.         {
  184.             try
  185.             {
  186.                 Temp.Clear();
  187.                 Temp.AddRange(File.ReadAllLines(txtName.Text)
  188.                     .Select(n => n.Split(',').Select(n2 => Convert.ToDouble(n2)).ToArray()));
  189.                 pictureBox1.Invalidate();
  190.             }
  191.             catch (Exception e2) {
  192.                 MessageBox.Show(e2.ToString(), "载入失败");
  193.             }
  194.         }
  195.         void SetPID(byte index,Single datSrc) {   //0,5,6,7=t,p,i,d
  196.             //if(rs485_recv_buf[0] == 0x1 && rs485_recv_buf[5]==0x4){
  197.             byte[] dat = new byte[6];
  198.             dat[0] = 0x1;
  199.             dat[1] = 2; //write
  200.             dat[2] = index;
  201.             float[] q = new float[] {1f,1f,1f,1f,1f, 100f, 1000f, 100f };
  202.             if(index!=0xa5)
  203.                 datSrc = (Int16)(datSrc * q[index]);
  204.             dat[4] = (byte)(Convert.ToInt32( datSrc) & 0xff);
  205.             dat[3] = (byte)(Convert.ToInt32(datSrc) >>8);
  206.             dat[5] = 0x4;
  207.             Com.Write(dat, 0, dat.Length);
  208.         }

  209.         private void TxtP_KeyPress(object sender, KeyPressEventArgs e)
  210.         {
  211.             if (e.KeyChar == '\r') {
  212.                 TextBox txt = (sender as TextBox);
  213.                 SetPID(Convert.ToByte(txt.Tag.ToString()), Convert.ToSingle(txt.Text));
  214.                 btnStart.Focus();
  215.             }
  216.         }

  217.         private void BtnClear_Click(object sender, EventArgs e)
  218.         {
  219.             Temp.Clear();
  220.             pictureBox1.Invalidate();
  221.         }

  222.         private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
  223.         {
  224.             if (Temp.Count > e.Location.X)
  225.                 this.Text = "PID调试  " + string.Join(",", Temp[e.Location.X]);
  226.         }

  227.         private void Button3_Click(object sender, EventArgs e)
  228.         {
  229.             ViewIndex = 0; pictureBox1.Invalidate();
  230.         }

  231.         private void Button4_Click(object sender, EventArgs e)
  232.         {
  233.             int i= Temp.Count - pictureBox1.Width + 100;
  234.             if (i < Temp.Count - 100) {
  235.                 ViewIndex =i; pictureBox1.Invalidate();
  236.             }
  237.         }

  238.         private void Button1_Click(object sender, EventArgs e)
  239.         {
  240.             int i = ViewIndex - 30;
  241.             if (i > 0)
  242.             {
  243.                 ViewIndex = i; pictureBox1.Invalidate();
  244.             }
  245.         }

  246.         private void Button2_Click(object sender, EventArgs e)
  247.         {
  248.             int i = ViewIndex + 30;
  249.             if (i < Temp.Count - 100)
  250.             {
  251.                 ViewIndex = i; pictureBox1.Invalidate();
  252.             }
  253.         }
  254.     }
  255. }
复制代码


代码可以参考下

出0入4汤圆

发表于 2019-4-18 19:31:43 | 显示全部楼层
串口收数据画波形图
以前正是有这个需求,但没有说出来

出0入4汤圆

发表于 2019-4-18 19:35:33 来自手机 | 显示全部楼层
arduino开发工具自带那个,非常好用

出0入0汤圆

发表于 2019-4-18 22:24:12 | 显示全部楼层
试试新版的吧,这有教程
https://blog.csdn.net/wangjt1988/article/details/83686656

出75入88汤圆

发表于 2019-4-18 23:54:46 | 显示全部楼层
wangjt1988 发表于 2019-4-18 22:24
试试新版的吧,这有教程
https://blog.csdn.net/wangjt1988/article/details/83686656

方便转一下 不?先谢了
没积分下载,只能看啊!

出0入0汤圆

发表于 2019-4-19 08:00:22 来自手机 | 显示全部楼层
我也需要这个,

出1330入193汤圆

发表于 2019-4-19 08:11:32 | 显示全部楼层
关注  串口收数据画波形图的小软件
楼主,文件很大吗 百度网盘可以上传之后发链接

出0入0汤圆

发表于 2019-4-19 19:12:50 | 显示全部楼层
bzbs 发表于 2019-4-18 23:54
方便转一下 不?先谢了
没积分下载,只能看啊!





附件有点大,分开压缩了,最新版的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出10入95汤圆

发表于 2019-4-30 19:58:12 来自手机 | 显示全部楼层
匿名上位机

出75入88汤圆

发表于 2019-5-1 00:41:42 | 显示全部楼层
wangjt1988 发表于 2019-4-19 19:12
附件有点大,分开压缩了,最新版的

感谢转发!!

出0入0汤圆

发表于 2019-5-2 08:40:55 | 显示全部楼层
正好需要这类软件,多谢了

出0入26汤圆

发表于 2019-5-3 02:29:39 | 显示全部楼层
正好需要这类软件,下载看看。

出0入0汤圆

发表于 2019-5-3 03:47:01 来自手机 | 显示全部楼层
串口猎人也支持简单的图形化显示

出0入0汤圆

发表于 2019-5-5 02:30:31 | 显示全部楼层
伏特加串口网络助手  
串口和网路都支持,使用文档齐全,非常方便,好用。

出0入0汤圆

发表于 2019-5-5 02:37:16 | 显示全部楼层
上传一个简介和使用指南




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-5-5 07:32:06 | 显示全部楼层
感谢各位!又下载到好的软件了!

出75入88汤圆

发表于 2020-6-16 15:51:16 | 显示全部楼层
wangjt1988 发表于 2019-4-19 19:12
附件有点大,分开压缩了,最新版的

感谢!下载了很好用.
但是现在才回复.抱歉

出0入0汤圆

发表于 2020-6-17 00:10:20 | 显示全部楼层
很不错的软件,学习了

出0入0汤圆

发表于 2020-6-17 11:32:12 | 显示全部楼层
很好,关注一下。

出0入0汤圆

发表于 2020-6-17 11:42:25 | 显示全部楼层
下载试试看
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-20 04:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表