实例介绍
【实例简介】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 = "开始绘图";
}
}
}
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论