持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
优化逻辑
串口配置入库
新建数据表,sysconf。字段包含data,type,intime
串口配置type:comconf data:(json格式) { "port": "COM1", "baute": "9600", "devaddr": "3" }
开机启动自动打开串口
/// <summary>
/// 初始化加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MainFrom_Load(object sender, EventArgs e)
{
DataTable dt = DB_SerAPI.GetComConfFromDB();
if (dt != null && dt.Rows.Count > 0)
{
Global.ComConfInfo = JObject.Parse(dt.Rows[0]["data"].ToString());
//打开串口
string comname = Global.ComConfInfo["port"].ToString();
//波特率
int baudrate = int.Parse(Global.ComConfInfo["baute"].ToString());
//打开串口
Global.Runport = ComPort.V_OpenPort8N1(comname, baudrate);
if (Global.Runport == null)
MessageBox.Show("打开串口失败");
}
else
MessageBox.Show("获取串口配置失败,请重新配置");
}
系统配置界面逻辑修改
using Newtonsoft.Json.Linq;
using System;
using System.Drawing;
using System.Windows.Forms;
namespace THSensor
{
public partial class Sysconf : Form
{
/// <summary>
/// 串口口配置类
/// </summary>
public Sysconf()
{
InitializeComponent();
}
/// <summary>
/// 打开串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
try
{
if (Global.Runport.IsOpen)
{
Global.Runport.Close();
MessageBox.Show("串口已关闭");
this.button1.Text = "打 开 串 口";
this.button1.BackColor = Color.LightGreen;
}
else
{
//串口
string comname = this.comboBox1.Text;
//波特率
int baudrate = int.Parse(this.comboBox2.Text);
//入库
JObject confinfo = new JObject();
confinfo.Add("port",comname);
confinfo.Add("baute",baudrate);
confinfo.Add("devaddr",this.textBox1.Text);
DB_SerAPI.SetComConfToDB(confinfo.ToString());
//打开串口
Global.Runport = ComPort.V_OpenPort8N1(comname, baudrate);
if (Global.Runport != null)
{
MessageBox.Show("打开串口成功");
this.button1.Text = "关 闭 串 口";
this.button1.BackColor = Color.DarkGray;
}
else
MessageBox.Show("打开串口失败");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.StackTrace +"\r\n"+ ex.Message);
}
}
/// <summary>
/// 加载函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Sysconf_Load(object sender, EventArgs e)
{
//扫描串口
string[] comlist = ComPort.V_ScanPort();
if (comlist.Length < 1)
{
MessageBox.Show("没有扫描到串口,请检查硬件连接");
return;
}
else
{
foreach (string name in comlist)
{
this.comboBox1.Items.Add(name);
}
}
//波特率初始化
this.comboBox2.Items.Add("4800");
this.comboBox2.Items.Add("9600");
this.comboBox2.Items.Add("115200");
//默认
if (Global.ComConfInfo != null && Global.ComConfInfo.ContainsKey("port"))
{
this.textBox1.Text = Global.ComConfInfo["devaddr"].ToString();
this.comboBox2.Text = Global.ComConfInfo["baute"].ToString();
this.comboBox1.Text = Global.ComConfInfo["port"].ToString();
}
//判断是否打开串口
if (Global.Runport.IsOpen)
{
this.button1.Text = "关 闭 串 口";
this.button1.BackColor = Color.DarkGray;
}
else
{
this.button1.Text = "打 开 串 口";
this.button1.BackColor = Color.LightGreen;
}
}
}
}
以上,软件打开后,会自动的打开配置的串口。需要修改的时候,再进入串口配置修改。
曲线界面的制作和实现
新增曲线界面Linewin
移植之前单页面的曲线逻辑代码
using ScottPlot;
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
namespace THSensor
{
public partial class DataLine : Form
{
/// <summary>
/// 数据缓存
/// </summary>
private DataTable DataBuffer = null;
/// <summary>
/// 序号
/// </summary>
private int Index = 0;
/// <summary>
/// 构造
/// </summary>
public DataLine()
{
InitializeComponent();
}
/// <summary>
/// 初始化加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DataLine_Load(object sender, EventArgs e)
{
InitPlot();
InitDataTable();
this.timer1.Start();
}
/// <summary>
/// 初始化曲线
/// </summary>
private void InitPlot()
{
//line
formsPlot1.Plot.Style(Style.Seaborn);
formsPlot1.Plot.Title("数据曲线");
//不显示x轴
formsPlot1.Plot.XAxis.Ticks(false);
formsPlot1.Plot.XAxis.Line(false);
formsPlot1.Plot.YAxis2.Line(false);
formsPlot1.Plot.XAxis2.Line(false);
}
/// <summary>
/// 初始化结构
/// </summary>
private void InitDataTable()
{
DataBuffer = new DataTable();
DataBuffer.Columns.Add("ID");
DataBuffer.Columns.Add("温度");
DataBuffer.Columns.Add("湿度");
DataBuffer.Columns.Add("时间");
}
/// <summary>
/// 刷新曲线
/// </summary>
private void RefreshLine()
{
try
{
if (DataBuffer.Rows.Count < 1)
return;
//清空
formsPlot1.Plot.Clear();
//温度
string[] data = DataBuffer.AsEnumerable().Select(d => d.Field<string>("温度")).ToArray();
double[] ys = Array.ConvertAll<string, double>(data, s => double.Parse(s));
//湿度
string[] data2 = DataBuffer.AsEnumerable().Select(d => d.Field<string>("湿度")).ToArray();
double[] ys2 = Array.ConvertAll<string, double>(data2, s => double.Parse(s));
formsPlot1.Plot.AddSignal(ys);
formsPlot1.Plot.AddSignal(ys2);
formsPlot1.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ex.StackTrace);
MyLogger._.Error(ex.Message + "\r\n" + ex.StackTrace);
}
}
/// <summary>
/// 定时器回调
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer1_Tick(object sender, EventArgs e)
{
if (Global.Runport.IsOpen)
{
byte addr = 3;
if(Global.ComConfInfo.ContainsKey("devaddr"))
addr = byte.Parse(Global.ComConfInfo["devaddr"].ToString());
//获取地址
string ret = THSensor.ReadTHDataFromSensor(Global.Runport, addr);
if (!string.IsNullOrEmpty(ret))
{
string temp = ret.Split('&')[0];
string humi = ret.Split('&')[1];
//入库操作
DB_SerAPI.SaveTHData(temp, humi);
//刷新列表
string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
if (DataBuffer != null)
{
Index++;
DataRow row = DataBuffer.NewRow();
row["ID"] = Index.ToString();
row["时间"] = time;
row["温度"] = temp;
row["湿度"] = humi;
DataBuffer.Rows.Add(row);
}
RefreshLine();
}
else
{
MessageBox.Show("无数据,请检查配置参数");
}
}
}
}
}
实现窗口平铺显示
修改mianwin界面
增加代码
/// <summary>
/// 垂直平铺
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 垂直平铺ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.TileVertical);
}
/// <summary>
/// 水平平铺
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 水平平铺ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.TileHorizontal);
}