在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C#做一个串口助手,包含绘图

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

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.19M
  • 下载次数:62
  • 浏览次数:511
  • 发布时间:2021-12-09
  • 实例类别:C#语言基础
  • 发 布 人:asguagd2d
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 串口助手 助手 串口

实例介绍

【实例简介】C#做一个串口助手,包含绘图

【实例截图】

from clipboard

【核心代码】

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 = "开始绘图";
            }
        }
    }
}



实例下载地址

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警