|
发表于 2019-4-18 18:40:41
|
显示全部楼层
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.IO.Ports;
- using System.IO;
- namespace PID测试
- {
- public partial class Form1 : Form
- {
- int ViewIndex = 0;
- /// <summary>
- /// 通信COM口
- /// </summary>
- SerialPort Com;
- /// <summary>
- /// 接收串口数据
- /// </summary>
- List<byte> Data = new List<byte>();
- /// <summary>
- /// 所有接收数据集合
- /// </summary>
- List<double []> Temp = new List<double[]>();
- public Form1()
- {
- InitializeComponent();
- var files= Directory.GetFiles(".", "*.txt");
- if (files.Length > 0)
- txtName.Items.AddRange(files);
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- cmbComSrc.Items.AddRange(SerialPort.GetPortNames());
- }
- private void BtnStart_Click(object sender, EventArgs e)
- {
- if (btnStart.Text == "开始")
- {
- if (cmbComSrc.SelectedIndex > -1)
- {
- Com = new SerialPort(cmbComSrc.SelectedItem.ToString());
- Com.BaudRate = 115200;
- Com.Open();
- Com.DataReceived += Com_DataReceived;
- btnStart.Text = "停止";
- SetPID(0xa5, 0);
- }
- else
- {
- MessageBox.Show("未选择有效的COM口");
- }
- }
- else {
- Com.Close();
- btnStart.Text = "开始";
- }
- }
- private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
- {
- byte[] dat = new byte[Com.BytesToRead];
- Com.Read(dat, 0, dat.Length);
- System.Diagnostics.Debug.WriteLine(string.Join(",", dat.Select(n=>Convert.ToString((int)n,16))));
- Data.AddRange(dat);
- loop:
- int pos1 = 0, pos2 = 0;
- pos1 = FindFlag(Data, 0, 0xa5);
- pos2 = FindFlag(Data, pos1+1, 0xf5);
- if (pos2 - pos1 == 18+6) {
- var d= Data.Skip(pos1+1).Take(18).ToArray();
- Int16[] d2 = new Int16[9];
- for (int i = 0; i < 9; i++) {
- d2[i] = (Int16)((d[i*2] << 8) + d[i*2 + 1]);
- }
- double[] d3 = new double[9];
- d3[0] = d2[0];
- d3[1] = d2[1];
- d3[2] = d2[2] / 100.0; //p
- d3[3] = d2[3] / 1000.0; //i
- d3[4] = d2[4] / 100.0; //d
- d3[5] = d2[5];
- d3[6] = d2[6];
- d3[7] = d2[7];
- d3[8] = d2[8];
- d3.Select(n => Math.Round(n, 3)).ToArray();
- Temp.Add(d3);
- this.Invoke(new Action(() => {
- this.Text = "PID测试 " + (string.Join(",", d3));
- }));
- Data.Clear();
- //Data.RemoveRange(0, pos2);
- pictureBox1.Invalidate();
- }
- if (pos2 > 10 && pos1 >= 0 && pos2-pos1 != 18 + 6) {
- Data.RemoveRange(0, pos2);
- goto loop;
- }
- //if (Data.Count > 500)
- // Data.RemoveRange(0, 400);
- }
- /// <summary>
- /// 查找流中的标志位
- /// </summary>
- /// <param name="data"></param>
- /// <param name="start"></param>
- /// <param name="flag"></param>
- /// <returns></returns>
- int FindFlag(List<byte> data, int start, byte flag)
- {
- int c = 0;
- for (int i = start; i < data.Count; i++)
- {
- if (data[i] == flag)
- c++;
- else
- c = 0;
- if (c == 6)
- {
- return i;
- }
- }
- return 0;
- }
- private void PictureBox1_Paint(object sender, PaintEventArgs e)
- {
- if (Temp.Count < 1)
- return;
- var g = e.Graphics;
- Pen[] p = new Pen[] {
- new Pen(labSetTemp.BackColor),
- new Pen(labNowTemp.BackColor),
- new Pen(labPn.BackColor),
- new Pen(labIn.BackColor),
- new Pen(labDn.BackColor),
- new Pen(labOut.BackColor)
- };
- double[] max = new double[9];
- max[0] = 580;
- max[1] = 580;
- max[5] = 500;
- max[6] = 800;
- max[7] = 500;
- max[8] = 1000;
- labSetTempMax.Text = max[0].ToString();
- labNowTempMax.Text = max[1].ToString();
- labPMax.Text = max[5].ToString();
- labIMax.Text = max[6].ToString();
- labDMax.Text = max[7].ToString();
- labOutMax.Text = max[8].ToString();
- var h =(float) pictureBox1.Height;
-
- for (int i = 1,i2=ViewIndex+1; i < Temp.Count&& i2 < Temp.Count; i++,i2++) {
- g.DrawLine(p[0], i - 1, (float)(h - Temp[i2 - 1][0] * (h/max[0])), i, h - (float)(Temp[i2][0] * (h/max[0])));
- g.DrawLine(p[1], i - 1, (float)(h - Temp[i2 - 1][1] * (h/max[1])), i, h - (float)(Temp[i2][1] * (h/max[1])));
- g.DrawLine(p[2], i - 1, (float)(h - Temp[i2 - 1][5] * (h/max[5])), i, h - (float)(Temp[i2][5] * (h/max[5])));
- g.DrawLine(p[3], i - 1, (float)(h - Temp[i2 - 1][6] * (h/max[6])), i, h - (float)(Temp[i2][6] * (h/max[6])));
- g.DrawLine(p[4], i - 1, (float)(h - Temp[i2 - 1][7] * (h/max[7])), i, h - (float)(Temp[i2][7] * (h/max[7])));
- g.DrawLine(p[5], i - 1, (float)(h - Temp[i2 - 1][8] * (h/max[8])), i, h - (float)(Temp[i2][8] * (h/max[8])));
- }
- var d3 = Temp.Last();
- if (!labSetTemp.Focused)
- labSetTemp.Text = d3[0].ToString();
- labNowTemp.Text = d3[1].ToString();
- if (!txtP.Focused)
- txtP.Text = d3[2].ToString();
- if (!txtI.Focused)
- txtI.Text = d3[3].ToString();
- if (!txtD.Focused)
- txtD.Text = d3[4].ToString();
- labPn.Text = d3[5].ToString();
- labIn.Text = d3[6].ToString();
- labDn.Text = d3[7].ToString();
- labOut.Text = d3[8].ToString();
- }
- private void BtnSave_Click(object sender, EventArgs e)
- {
- File.WriteAllLines(txtName.Text, Temp.Select(n => string.Join(",", n)));
- }
- private void BtnLoad_Click(object sender, EventArgs e)
- {
- try
- {
- Temp.Clear();
- Temp.AddRange(File.ReadAllLines(txtName.Text)
- .Select(n => n.Split(',').Select(n2 => Convert.ToDouble(n2)).ToArray()));
- pictureBox1.Invalidate();
- }
- catch (Exception e2) {
- MessageBox.Show(e2.ToString(), "载入失败");
- }
- }
- void SetPID(byte index,Single datSrc) { //0,5,6,7=t,p,i,d
- //if(rs485_recv_buf[0] == 0x1 && rs485_recv_buf[5]==0x4){
- byte[] dat = new byte[6];
- dat[0] = 0x1;
- dat[1] = 2; //write
- dat[2] = index;
- float[] q = new float[] {1f,1f,1f,1f,1f, 100f, 1000f, 100f };
- if(index!=0xa5)
- datSrc = (Int16)(datSrc * q[index]);
- dat[4] = (byte)(Convert.ToInt32( datSrc) & 0xff);
- dat[3] = (byte)(Convert.ToInt32(datSrc) >>8);
- dat[5] = 0x4;
- Com.Write(dat, 0, dat.Length);
- }
- private void TxtP_KeyPress(object sender, KeyPressEventArgs e)
- {
- if (e.KeyChar == '\r') {
- TextBox txt = (sender as TextBox);
- SetPID(Convert.ToByte(txt.Tag.ToString()), Convert.ToSingle(txt.Text));
- btnStart.Focus();
- }
- }
- private void BtnClear_Click(object sender, EventArgs e)
- {
- Temp.Clear();
- pictureBox1.Invalidate();
- }
- private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
- {
- if (Temp.Count > e.Location.X)
- this.Text = "PID调试 " + string.Join(",", Temp[e.Location.X]);
- }
- private void Button3_Click(object sender, EventArgs e)
- {
- ViewIndex = 0; pictureBox1.Invalidate();
- }
- private void Button4_Click(object sender, EventArgs e)
- {
- int i= Temp.Count - pictureBox1.Width + 100;
- if (i < Temp.Count - 100) {
- ViewIndex =i; pictureBox1.Invalidate();
- }
- }
- private void Button1_Click(object sender, EventArgs e)
- {
- int i = ViewIndex - 30;
- if (i > 0)
- {
- ViewIndex = i; pictureBox1.Invalidate();
- }
- }
- private void Button2_Click(object sender, EventArgs e)
- {
- int i = ViewIndex + 30;
- if (i < Temp.Count - 100)
- {
- ViewIndex = i; pictureBox1.Invalidate();
- }
- }
- }
- }
复制代码
代码可以参考下 |
|