基本信息
源码名称:C#做一个串口助手,包含绘图
源码大小:0.19M
文件格式:.zip
开发语言:C#
更新时间:2021-12-09
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559

本次赞助数额为: 2 元 
   源码介绍

C#做一个串口助手,包含绘图

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;       //添加引用
using System.IO;             //添加引用
using System.Windows.Forms.DataVisualization.Charting;  //添加引用
using System.Threading;    //添加引用

namespace Debugging_Assistant
{
    public partial class MainForm : Form
    {
        private List<byte> ListData = new List<byte>();
        //Random random = new Random();

        public MainForm()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox_BaudRate.Text = "9600";  //波特率下拉框默认显示9600

            serialPort1.DataReceived = new SerialDataReceivedEventHandler(port_DataReceived);//手动添加串口事件声明
            
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;   ///防止线程并发错误

            chart1.ChartAreas[0].AxisY.Minimum = 0;
            chart1.ChartAreas[0].AxisY.Maximum = 3000;
            chart1.ChartAreas[0].AxisY.Interval = 200;
            chart1.ChartAreas[0].AxisX.Minimum = 0;
            chart1.ChartAreas[0].AxisX.Maximum = 600;
            chart1.ChartAreas[0].AxisX.Interval = 60;
        }

        void chart_display()
        {
            DrawChart();
        }

        delegate void my_delegate();//创建一个代理,图表刷新需要在主线程,所以需要加委托

        public void DrawChart()
        {
            if (!chart1.InvokeRequired)
            {
                chart1.Series[0].Points.Clear();    //清除所有点

                for (int i = 0; i < ListData.Count; i )
                {
                    chart1.Series[0].Points.AddXY(i 1, ListData[i]);   //在列表读定时器获取到的串口接收值,并添加点
                }
            }
            else
            {
                my_delegate delegate_ListData = new my_delegate(DrawChart);
                Invoke(delegate_ListData, new object[] { });//执行唤醒操作
            }
        }

        //清除所有的链表
        private void ClearAllList()
        {
            ListData.Clear();
        }

        //当大于50时移除list头部
        private void ListRemove()
        {
            if (ListData.Count >= 600)
            {
                ListData.RemoveAt(0);
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            // int num1 = random.Next(0, 5000);
            //ListData.Add(num1);
            for (int i = 0; i < data.Length; i )
            {
                int a;
                a = data[i];
                ListData.Add(data[i]);
            }
            ListRemove();
            DrawChart();
        }

        byte[] data;

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件函数
        {
            Thread chart_display_th = new Thread(new ThreadStart(chart_display));////////数值显示线程
            chart_display_th.Start();

            try
            {
                if (!radioButton_Numerical.Checked)  //如果接收为数据模式
                {
                    string str = serialPort1.ReadExisting();  //字符串方式读数据
                    textBox_Rcv.AppendText(str "\n");    //连续显示数据
                    //textBox_Rcv.Text = str;    //单个显示数据

                    data = new byte[10];
                    serialPort1.Read(data, 0, data.Length);
                    //string s = Encoding.Default.GetString(data);

                }
                else   //接收数据16进制显示
                {
                    byte data;
                    data = (byte)serialPort1.ReadByte();
                    string str = Convert.ToString(data, 16).ToUpper();   //转为大写的16进制字符串
                    textBox_Rcv.AppendText("0x" (str.Length == 1 ? "0" str : str) " "); //连续显示数据,固定格式显示16进制数据(0xXX )
                    //textBox_Rcv.Text = "0x" (str.Length == 1 ? "0" str : str) " ";    //单个显示数据
                }
            }
            catch
            {
            
            }
        }

        private void button_CleanRcv_Click(object sender, EventArgs e)   //清除接收按钮
        {
            textBox_Rcv.Text = "";     //清除文本框中接收内容
        }

        private void button_SaveRcv_Click(object sender, EventArgs e)   //保存接收按钮
        {
            StreamWriter myStream;

            saveFileDialog1.Filter = "txt files(*.txt)|*.txt|xls files(*.xls)|*.xls|All files(*.*)|*.*";
            saveFileDialog1.FilterIndex = 1;  //设置默认保存文件类型显示顺序
            saveFileDialog1.RestoreDirectory = true;   //记忆上次保存目录
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                myStream = new StreamWriter(saveFileDialog1.FileName);
                myStream.Write(textBox_Rcv.Text); //写入内容
                myStream.Close();  //关闭流
                MessageBox.Show("保存成功!", "提醒");
            }
        }

        private void button_OpenPort_Click(object sender, EventArgs e) //打开端口按钮,默认可用
        {
            try
            {
                serialPort1.PortName = comboBox_Port.Text;
                serialPort1.BaudRate = Convert.ToInt32(comboBox_BaudRate.Text,10); //读到的字符串转换为十进制数
                serialPort1.Open();   //打开串口
                button_OpenPort.Enabled = false;    //打开端口按钮变为不可用
                button_ClosePort.Enabled = true;    //关闭端口按钮变为可用
            }
            catch
            {
                MessageBox.Show("端口错误!请检查串口!!", "错误");
            }
        }

        private void button_ClosePort_Click(object sender, EventArgs e) //关闭端口按钮,默认不可用
        {
            try
            {
                serialPort1.Close();   //关闭串口
                button_OpenPort.Enabled = true;    //打开端口按钮变为可用
                button_ClosePort.Enabled = false;    //关闭端口按钮变为不可用
            }
            catch
            { 
            }
        }

        private void textBox_Rcv_TextChanged(object sender, EventArgs e)  //接收文本框
        {
            textBox_Rcv.ScrollToCaret();
        }

        private void ScanAndAddSerialToCombox(SerialPort MyPort, ComboBox MyBox) //扫描现有端口号并在下拉框显示,参数1:serialport name,参数2:combo name
        {
            string[] str = new string[20];
            string Buffer;

            MyBox.Items.Clear();

            for (int i = 1; i <= 20; i )
            {
                try
                {
                    Buffer = "COM" i.ToString();
                    MyPort.PortName = Buffer;
                    MyPort.Open();
                    str[i - 1] = Buffer;
                    MyBox.Items.Add(Buffer);
                    MyPort.Close();
                    MyBox.Text = str[i - 1];
                }
                catch
                {
                }
            }
        }

        private void button_ScanPort_Click(object sender, EventArgs e) //扫描按钮
        {
            ScanAndAddSerialToCombox(serialPort1, comboBox_Port);
        }

        private void button_Draw_Click(object sender, EventArgs e)
        {
            if (button_Draw.Text == "开始绘图")
            {
                timer1.Start();
                button_Draw.Text = "暂停绘图";
            }
            else
            {
                timer1.Stop();
                button_Draw.Text = "开始绘图";
            }
        }
    }
}