0
点赞
收藏
分享

微信扫一扫

串口通信助手优化

DYBOY 2022-04-23 阅读 79

目录

UI布局

1.串口的读写

2.串口扫描函数

3.实时刷新UI

3.1定时器刷新

3.2委托+timer类

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;
            }

举报

相关推荐

0 条评论