上位机软件做了有一段时间,本人呕心沥血的作品。
之前用python+pyQT5做,主线程特别特别容易闪退,数据重叠等问题,走了很多弯路;
后来用VS的C#做,只能说上手很快,调试效果也不错,而且关键是非常非常简单易读,只希望大家不要像我一样,走这么多弯路 – –
想要源码的小伙伴们,欢迎关注点赞三连+留言邮箱哦~
华丽的分割线——————————————————————————————–
废话不多说直接看效果图—-
其中串口数据的接收读取是最难的部分,因为下位机的特殊性(属于公司机密),传上来的都不知道是几进制的数据,还要根据特定的通讯协议分配显示槽,博主呕心沥血查阅各种资料, 才写出了字符串和数值的各种转换,高8位字节低8位字节读取、接收数据延迟显示、显示槽的定时刷新、时间显示、保存功能等等也是做好了的- – – – —- 完成的那一刻是真的是满眼辛酸泪0.0——————————–
华丽的分割线—————————————————————————————
直接上最难的地方:
一、串口数据接收事件
区分数值接收与字符接收模式
private void Form1_Load(object sender, EventArgs e){serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);//必须手动添加事件处理程序}private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件{Thread.Sleep(500);//休眠50mstry{if (!hexshoufa6.Checked)//如果接收模式为字符模式{int ilen = serialPort1.BytesToRead;byte[] bytes = new byte[ilen];serialPort1.Read(bytes, 0, ilen);string str = System.Text.Encoding.Default.GetString(bytes); //xx=\"中文\";if (time_flag == true){jiemiantext1.AppendText(GetTimeStamp() + \" 电压: \" + str + \'\\r\' + \'\\n\');//添加内容Ubatfu.AppendText(str);}elsejiemiantext1.AppendText(str + \'\\r\' + \'\\n\');//添加内容}else{ //如果接收模式为数值接收int count = serialPort1.BytesToRead;//判断接收数据的字节数byte[] data = new byte[serialPort1.BytesToRead]; //定义缓冲区,因为串口事件触发时有可能收到不止一个字节serialPort1.Read(data, 0, data.Length);//读取指定长度到serialPort1buffer.AddRange(data);//缓存数据到buffer//把新接收的数据放入 buffer的末尾,开头定义了帧长为36个字节//2.完整性判断serialPort1.DiscardInBuffer();//foreach (byte Member in data) //遍历用法,不要用{这里直接写你的数据头检测,数据尾检测,命令码检测等串口检测语句,设计公司机密,就不放上来了}//此时已经找到一组完整数据,进行缓存string strbuffer = buffer.ToString();//后面写你的串口通信协议就OK了
二、保存功能
目前用的比较简单的保存功能,直接设定好路径保存,后面再做修改
private void button4_Click(object sender, EventArgs e){// string[] STR_DATA1;// STR_DATA1 = System.IO.File.ReadAllLines(@\"F:\\Visual_Studio\\恒温控制系统上位机\\恒温系统上位机\\数据保存\\接收数据保存.txt\");// string myStr = string.Join(\"\", STR_DATA1);// textBox1.AppendText(myStr);System.IO.File.WriteAllText(@\"F:\\单片机上位机开发\\lyb上位机\\数据保存\\接收数据保存.txt\", jiemiantext1.Text);System.IO.File.WriteAllText(@\"F:\\单片机上位机开发\\lyb上位机\\数据保存\\发送数据保存.txt\", fasongjiemian2.Text);tishixinxi1.AppendText(\" 数据保存完成!!! \\r\\n\");}
三、时间调用功能
public static string GetTimeStamp(){// TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);// return Convert.ToInt64(ts.TotalSeconds).ToString();// DateTime.Now.ToString(); // 2008-9-4 20:02:10return DateTime.Now.ToLocalTime().ToString(); // 2008-9-4 20:12:12Application.DoEvents();System.Threading.Thread.Sleep(100);}
四、那么如何显示波形呢?
private void timer1_Tick(object sender, EventArgs e){if (time_out == 0){time_out = Convert.ToInt16(huoqutime.Text);if (chuankoukongzhi.Checked){try{//实现串口发送汉字Ubatfu.Clear();Encoding gb = System.Text.Encoding.GetEncoding(\"gb2312\");//byte[] bytes = gb.GetBytes(\"%\");//serialPort1.Write(bytes, 0, bytes.Length);}catch{jiemiantext1.AppendText(\"串口数据写入错误\\r\\n\");//出错提示serialPort1.Close();button1_Click(sender, e);}}}if (time_out == 1){time_out --;boxing1.Series.Clear();boxing1.ChartAreas[0].AxisX.Maximum = 20;//设定x轴的最大值boxing1.ChartAreas[0].AxisY.Maximum = 100;//设定y轴的最大值boxing1.ChartAreas[0].AxisX.Minimum = 0;//设定x轴的最小值boxing1.ChartAreas[0].AxisY.Minimum =-10;//设定y轴的最小值//第一条数据Series series = new Series(\"实时电压\");series.ChartType = SeriesChartType.Spline; //设置为曲线模式series.BorderWidth = 1;series.ShadowOffset = 1; // Populate new series with datafor (int i = 0; i < 19; i++){myIntArray4[i] = myIntArray4[i + 1];series.Points.AddY(myIntArray4[i]);//画线}try{string s = zifuchuan.Text;//Ubatfu.Text;string strbat = s.Remove(0, 10);//s.Remove(0, 3);strbat = strbat.Remove(4, strbat.Length - 4);//取字符串的前两个字符 str1// textBox13.Text = textBox15.Text.Substring(textBox15.Text.IndexOf(\"温度:\") + 2, textBox15.Text.IndexOf(\"温度:\") + 4);test.Text = strbat;//str1myIntArray4[19] = Convert.ToInt32(test.Text);//zifuchuan.Text = jiemiantext1.Text;//string str1 = zifuchuan.Text.Remove(0, 5);//str1 = str1.Remove(2, str1.Length - 2);//IbatAN.Text = str1;}catch{myIntArray4[19] = 0;}series.Points.AddY(myIntArray4[19]);boxing1.Series.Add(series);}else time_out--;}
完事了 串口协议部分不能给大家, 大家看到上面也就差不多了,小白学习的话可以少走很多弯路,当然如果有更简便的方式,欢迎大神指正~~~
想要源码的小伙伴们,欢迎关注点赞三连+留言邮箱哦~
你的支持就是我前进动力中的一部分呢~
爱站程序员基地
![(原创)[C#] 一步一步自定义拖拽(Drag&Drop)时的鼠标效果:(一)基本原理及基本实现-爱站程序员基地](https://aiznh.com/wp-content/uploads/2022/07/20220721231016-62d9dcd85c40b-220x150.gif)

