<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了C#實現串列埠示波器的具體程式碼,供大家參考,具體內容如下
C#串列埠示波器,實時重新整理埠號,動態繪製多條折線,獲取串列埠資料並輸出到文字方塊
之前用Java實現串列埠示波器對我來說還是比較困難的,而且實現的效果不盡如人意,就用C#開發了。
C#可以自由佈置介面,在工具列直接拖拽控制元件到表單,然後雙擊控制元件就能新增事件了,很方便
最終效果是實現了,但是有個資料丟失的問題
資料處理到繪圖分三個步驟:
1、獲取串列埠傳送的資料
2、把資料按需要提取到中間容器集合list1中
3、從集合中提取繪圖的y值
測試得出的結果就是資料放進集合前不存在丟失,從集合中拿出資料這一過程也沒問題。所以問題就出在第二步了,已解決(按需提取資料的規則要儘可能設定的詳細一點就行)。
程式碼:
namespace CommPortsDesigner { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) //表單執行完成即為載入,載入完成會觸發事件 { } //傳入原始資料datas及需要匹配的字串r,得到需要的資料列表list private List<int> DealData(string datas, Regex r, string split) { if (string.IsNullOrEmpty(datas)) { throw new ArgumentException($"「{nameof(datas)}」不能是 Null 或為空。", nameof(datas)); } List<int> list1=new List<int> { }; string s1=""; MatchCollection mc = r.Matches(datas); //提取符合要求的字串 for (int i = 0; i < mc.Count; i++) { textBox2.AppendText(mc[i].Value + "rn"); //測試資料是否正確輸出 s1 = s1 + mc[i].Value; } string[] d = s1.Split( new string[]{split}, StringSplitOptions.RemoveEmptyEntries); for (int i=0;i<d.Length;i++) //將數位存入列表 { list1.Add( int.Parse(d[i])); } //測試畫圖用的資料是否解析正確 if (split.Equals("LP4:")) { foreach (int m in list1) { textBox3.AppendText(m + "rn"); } } return list1; } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { } private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) { serialPort1.BaudRate = int.Parse(comboBox2.SelectedItem.ToString()); } private void searchPort() { string Buffer; comboBox1.Items.Clear(); for (int i = 1; i < 20; i++) { try { Buffer = "COM" + i.ToString(); serialPort1.PortName = Buffer; serialPort1.Open(); comboBox1.Items.Add(Buffer); comboBox1.SelectedItem = Buffer; serialPort1.Close(); } catch { } } } private void getDatas() { System.Text.RegularExpressions.Regex r1 = new System.Text.RegularExpressions.Regex("LP1:(-?)\d+"); System.Text.RegularExpressions.Regex r2 = new System.Text.RegularExpressions.Regex("LP2:(-?)\d+"); System.Text.RegularExpressions.Regex r3 = new System.Text.RegularExpressions.Regex("LP3:(-?)\d+"); System.Text.RegularExpressions.Regex r4 = new System.Text.RegularExpressions.Regex("LP4:(-?)\d+"); System.Text.RegularExpressions.Regex r5 = new System.Text.RegularExpressions.Regex("LP5:(-?)\d+"); System.Text.RegularExpressions.Regex r6 = new System.Text.RegularExpressions.Regex("CC1:(-?)\d+"); System.Text.RegularExpressions.Regex r7 = new System.Text.RegularExpressions.Regex("CC2:(-?)\d+"); System.Text.RegularExpressions.Regex r8 = new System.Text.RegularExpressions.Regex("CC3:(-?)\d+"); System.Text.RegularExpressions.Regex r9 = new System.Text.RegularExpressions.Regex("CC4:(-?)\d+"); System.Text.RegularExpressions.Regex r10 = new System.Text.RegularExpressions.Regex("CC5:(-?)\d+"); byte[] inbuffer = null; //Queue<int> q1 = new Queue<int>(); if (serialPort1.IsOpen && serialPort1.BytesToRead > 0) { chart1.ChartAreas[0].AxisX.LabelStyle.Format = "hh:mm:ss.ff"; chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Milliseconds; chart1.ChartAreas[0].AxisX.MajorGrid.IntervalType = DateTimeIntervalType.Milliseconds; try { inbuffer = new byte[serialPort1.BytesToRead]; serialPort1.Read(inbuffer, 0, serialPort1.BytesToRead); string strRaad = ASCIIEncoding.ASCII.GetString(inbuffer, 0, inbuffer.Length); textBox1.AppendText(strRaad); chart1.ChartAreas[0].AxisX.Minimum = DateTime.Now.AddSeconds(-5).ToOADate(); chart1.ChartAreas[0].AxisX.Maximum = DateTime.Now.ToOADate(); chart1.ChartAreas[0].AxisX.Interval = 500; if (btn_start.Text.Equals("停止")) { //LP1 if (checkBox2.Checked) { foreach (int y in DealData(strRaad, r2, "LP2:")) { chart1.Series[1].Points.AddXY(DateTime.Now.ToOADate(), y); //count2 = count2 + 5; } } else { chart1.Series[1].Points.Clear(); } //LP2 if (checkBox2.Checked) { foreach (int y in DealData(strRaad, r2, "LP2:")) { chart1.Series[1].Points.AddXY(DateTime.Now.ToOADate(), y); //count2 = count2 + 5; } } else { chart1.Series[1].Points.Clear(); } //LP3 if (checkBox3.Checked) { foreach (int y in DealData(strRaad, r3, "LP3:")) { chart1.Series[2].Points.AddXY(DateTime.Now.ToOADate(), y); //count3 = count3 + 5; } } else { chart1.Series[2].Points.Clear(); } //LP4 if (checkBox4.Checked) { foreach (int y in DealData(strRaad, r4, "LP4:")) { chart1.Series[3].Points.AddXY(DateTime.Now.ToOADate(), y); //count4 = count4 + 5; } } else { chart1.Series[3].Points.Clear(); } //LP5 if (checkBox5.Checked) { foreach (int y in DealData(strRaad, r5, "LP5:")) { chart1.Series[4].Points.AddXY(DateTime.Now.ToOADate(), y); //count5 = count5 + 5; } } else { chart1.Series[4].Points.Clear(); } //CC1 if (checkBox6.Checked) { foreach (int y in DealData(strRaad, r6, "CC1:")) { chart1.Series[5].Points.AddXY(DateTime.Now.ToOADate(), y); //count6 = count6 + 5; } } else { chart1.Series[5].Points.Clear(); } //CC2 if (checkBox7.Checked) { foreach (int y in DealData(strRaad, r7, "CC2:")) { chart1.Series[6].Points.AddXY(DateTime.Now.ToOADate(), y); //count7 = count7 + 5; } } else { chart1.Series[6].Points.Clear(); } //CC3 if (checkBox8.Checked) { foreach (int y in DealData(strRaad, r8, "CC3:")) { chart1.Series[7].Points.AddXY(DateTime.Now.ToOADate(), y); //count8 = count8 + 5; } } else { chart1.Series[8].Points.Clear(); } //CC4 if (checkBox9.Checked) { foreach (int y in DealData(strRaad, r9, "CC4:")) { chart1.Series[8].Points.AddXY(DateTime.Now.ToOADate(), y); //count9 = count9 + 5; } } else { chart1.Series[8].Points.Clear(); } //CC5 if (checkBox10.Checked) { foreach (int y in DealData(strRaad, r10, "CC5:")) { chart1.Series[9].Points.AddXY(DateTime.Now.ToOADate(), y); //count10 = count10 + 5; } } else { chart1.Series[9].Points.Clear(); } } } catch { } } } private void btn_open_Click(object sender, EventArgs e) { if (serialPort1.IsOpen||btn_open.Text.Equals("關閉")) { try { serialPort1.Close(); btn_open.Text = "開啟"; } catch { } } else { try { serialPort1.PortName = comboBox1.Text; serialPort1.Open(); btn_open.Text = "關閉"; } catch { MessageBox.Show("串列埠開啟失敗!", "錯誤"); } } } private void timer1_Tick(object sender, EventArgs e) { if (!serialPort1.IsOpen) { searchPort(); } else{} getDatas(); } private void btn_clear_Click(object sender, EventArgs e) { textBox1.Clear(); } private void btn_save_Click(object sender, EventArgs e) { if (this.textBox1.TextLength > 0) { string path = "D:\log.txt"; using (StreamWriter sw = new StreamWriter(path, true)) { String time = DateTime.Now.ToLocalTime().ToString(); sw.WriteLine("n" + time); sw.Write(this.textBox1.Text); } MessageBox.Show("已儲存到 D:\log.txt!"); } } private void btn_start_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { if (btn_start.Text.Equals("開始")) { try { btn_start.Text = "停止"; } catch { } } else { try { btn_start.Text = "開始"; } catch { } } } else { if (btn_start.Text.Equals("停止")) { try { btn_start.Text = "開始"; } catch { } } else { MessageBox.Show("串列埠未開啟!"); } } } } }
因為第一次開發,所以要實現的功能程式碼都放在一個類裡了,大家將就著看吧
最終實現的效果
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45