持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
本章节将实现系统配置功能,和实时数据查看,下一节介绍历史数据的查询
关于界面
关于见面简单的显示联系方式,和版本号
using System;
using System.Windows.Forms;
namespace THSensor
{
public partial class About : Form
{
/// <summary>
/// 初始化
/// </summary>
public About()
{
InitializeComponent();
}
/// <summary>
/// 加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void About_Load(object sender, EventArgs e)
{
this.richTextBox1.Text = "版本:V1.0.0";
this.richTextBox1.ReadOnly = true;
}
}
}
系统配置
实现系统配置界面逻辑
系统配置主要实现对串口的配置,我们根据之前的窗口逻辑,copy过来
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);
//打开串口
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.comboBox1.Text = comlist[0];
}
//波特率初始化
this.comboBox2.Items.Add("4800");
this.comboBox2.Items.Add("9600");
this.comboBox2.Items.Add("115200");
//默认
this.comboBox2.Text = "9600";
//默认地址
this.textBox1.Text = "03";
Global.DevAddr = byte.Parse(this.textBox1.Text);
}
}
}
实时数据查看
实现表格显示窗口
新建文件夹 Datashow 和子文件夹 datagride
创建datagride窗口类,用来显示表格化的数据
具体的实现逻辑,参考之前的代码,拖入一个表格显示类,docker属性设置为fill
using System;
using System.Data;
using System.Windows.Forms;
namespace THSensor
{
public partial class DataGride : Form
{
/// <summary>
/// 数据缓存
/// </summary>
private DataTable DataBuffer = null;
/// <summary>
/// 序号
/// </summary>
private int Index = 0;
/// <summary>
/// 构造
/// </summary>
public DataGride()
{
InitializeComponent();
}
/// <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 InitDataGrid()
{
//自适应列宽
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
//绑定数据到DataGridView
dataGridView1.DataSource = DataBuffer;
//不显示最后一个行
dataGridView1.AllowUserToAddRows = false;
dataGridView1.ReadOnly = true;
//去除首列
dataGridView1.RowHeadersVisible = false;
dataGridView1.Columns["ID"].HeaderText = "序号";
dataGridView1.Columns["温度"].HeaderText = "温度";
dataGridView1.Columns["湿度"].HeaderText = "湿度";
dataGridView1.Columns["时间"].HeaderText = "时间";
//刷新
dataGridView1.Refresh();
}
/// <summary>
/// 定时器回调
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer1_Tick(object sender, EventArgs e)
{
if (Global.Runport.IsOpen)
{
//获取地址
string ret = THSensor.ReadTHDataFromSensor(Global.Runport,Global.DevAddr);
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);
}
}
else
{
MessageBox.Show("无数据,请检查配置参数");
}
}
}
/// <summary>
/// 加载函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DataGride_Load(object sender, EventArgs e)
{
//初始化数据
InitDataTable();
InitDataGrid();
this.timer1.Start();
}
}
}
侧边栏点击实现打开窗口
侧边栏实现的是双击打开回调
/// <summary>
/// 双击回调
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView1_DoubleClick(object sender, EventArgs e)
{
string selname = this.treeView1.SelectedNode.Text;
//MessageBox.Show(selname);
switch (selname)
{
case "实时数据":
OpenDataGrideWin();
break;
case "历史数据":
MessageBox.Show("TDO");
break;
case "数据报表":
MessageBox.Show("TDO");
break;
default:
break;
}
}
/// <summary>
/// 打开表格显示窗口
/// </summary>
private void OpenDataGrideWin()
{
if (!IsWinOpened("GrideWin"))
{
DataGride realwin = new DataGride();
realwin.MdiParent = this;
realwin.Name = "GrideWin";
realwin.WindowState = FormWindowState.Maximized;
realwin.Show();
}
}
/// <summary>
/// 判断窗体是否打开
/// </summary>
/// <param name="name">窗体名称</param>
/// <returns></returns>
private bool IsWinOpened(string name)
{
foreach (Form frm in this.MdiChildren)
{
if (frm.Name == name)
{
frm.Focus();
frm.WindowState = FormWindowState.Maximized;
return true;
}
}
return false;
}
测试
打开串口
打开实时表格显示
最大化窗口
如此便可以实现一个可以自适应分辨率的工具。 下一章节实现曲线显示&历史数据查询。并优化代码结构。提取一个显示基类