目录
UI布局
引用Sunny UI包对UI界面重新绘制
Sunny UI官网
串口的读写
private bool WriteAndReadPort(string cmd, out string result)
{
//读写
result = null;
try
{
if (serialPort1?.IsOpen == true)
{
lock (serialLock)
{
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();
serialPort1.Write(cmd);
Thread.Sleep(200);
result = serialPort1.ReadExisting();
}
return result?.Length > 0;
}
return false;
}
catch (Exception)
{
result = null;
return false;
}
}
串口扫描
private void SearchPortToComBox(ComboBox MyBox,SerialPort MyPort)
{
//扫描
MyBox.DataSource = SerialPort.GetPortNames();
}
所遇问题及解决办法
实时刷新UI
3.1定时器刷新(不推荐)
3.2委托+timer类(测试)
private void Form1_Load(object sender, System.EventArgs e)
{
Thread t = new Thread(new ThreadStart(GetData));
t.IsBackground = true; //后台
t.Start();
}
private void GetData()
{
var timer = new System.Timers.Timer();
timer.Interval = 1000;
timer.Enabled = true;
timer.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
timer.Start();
timer.Elapsed += (o , e) =>
{
SetData();
ShowMessage(string.Format("更新时间:" + DateTime.Now));
};
}
// 声明委托
private delegate void SetDataDelegate();
private void SetData()
{
if (this.InvokeRequired) //当InvokeRequired为true时,说明在非创建线程访问当前UI控件
{
this.Invoke(new SetDataDelegate(SetData));
}
else
{
LB1.Text = string.Format("更新时间:" + DateTime.Now);
}
}
//声明委托
private delegate void ShowMessageDelegate(string message);
private void ShowMessage(string message)
{
if (this.InvokeRequired)
{
ShowMessageDelegate showMessageDelegate = ShowMessage;
this.Invoke(showMessageDelegate, new object[] { message });
}
else
{
TB1.Text = message;
}
}
3.3异步
异步部分代码:
Serial_OC();
if (watchTaskRunning)
{
Source.Cancel();
btTemp.BeginInvoke(new Action(() => { btTemp.Text = "Temp"; }));
watchTaskRunning = false;
}
else
{
btTemp.BeginInvoke(new Action(() => { btTemp.Text = "Stop"; }));
Source = new CancellationTokenSource();
var token = Source.Token;
Task.Run(() =>
{
while (true)
{
if (token.IsCancellationRequested)
{
break;
}
else
{
if (WriteAndReadPort("Temp\r", out string res))
{
if (double.TryParse(res, out double tempRes))
{
//查询控制板温度
tb_Temp.BeginInvoke(new Action(() => { tb_Temp.Text = tempRes.ToString() + "℃"; }));
Thread.Sleep(1000);
}
}
}
}
}, token);
watchTaskRunning = true;
}