串口通信助手优化

这篇具有很好参考价值的文章主要介绍了串口通信助手优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

UI布局

1.串口的读写

2.串口扫描函数

3.实时刷新UI

3.1定时器刷新

3.2委托+timer类

背景:在已有基础上将串口读写数据封装到一个类或者方法里,添加UI实时更新数据的功能,添加可设置参数的功能,添加可查询状态的功能

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

所遇问题及解决办法

因为是对串口返回的数据是以ReadExisting()来进行读取;

官网解释:

在编码的基础上,读取 SerialPort 对象的流和输入缓冲区中所有立即可用的字节。

返回 String 

  SerialPort 对象的流和输入缓冲区的内容。

1.当下位机返回的数据量大时,接受到的数据可能会发生错乱。比如A发送的指令本应该是返回给A的,结果因为B也做了发送指令的操作,此时原本是返回给A的数据被B接收到。

解决办法:对串口读写加上线程锁,这样就能确保每次的读写不会错乱

串口通信助手优化

2.或是有特殊的帧头 帧尾,这时就需要对数据进行一个拆包的操作

(略...)

实时刷新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;
            }

 最后F5跑起来,没有调试的机器,可以下一个有人虚拟串口

安装完毕后新建一个串口, 这里我们选择第一个

 串口通信助手优化

串口通信助手优化

打开我们之前用Socket+WPF做好的模拟下位机的程序

 串口通信助手优化

 地址---Win+R---ipconfig---自己本机IP,端口就是创建出来模拟串口的的端口

测试上图:

串口通信助手优化

选择COM1——打开串口:

串口通信助手优化

 文章来源地址https://www.toymoban.com/news/detail-440685.html

到了这里,关于串口通信助手优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电脑通过串口助手和51单片机串口通讯

    今天有时间把电脑和51单片机之间的串口通讯搞定了,电脑发送的串口数据,单片机能够正常接收并显示到oled屏幕上,特此记录一下,防止后面自己忘记了怎么搞得了。 先来两个图片看看结果吧! 下面是串口3.c的文件全部内容: 下面是oled.h的全部内容: 下面是oled.c的全部内

    2024年02月07日
    浏览(44)
  • VOFA+ 串口调试助手

    人生如逆旅,我亦是行人。 最近看学习视频看到一位博主用了一个十分酷、之前都没怎么见过的串口调试助手,深深地被吸引了,然后去了解了一下,发现这款串口调试助手软件还挺不错的,最起码比我之前用过的都要更酷,而且适合用来显示波形,与我最近需要用到的数据

    2024年02月15日
    浏览(32)
  • QT编写的串口助手

    创建UI界面工程 找帮助文档 添加串口的宏

    2024年02月15日
    浏览(27)
  • 【用MFC写串口调试助手】

    ID Type Member 说明 IDC_BUTTON_SERCHSEL 检测串口按钮 IDC_BUTTON_OPENSEL 打开串口按钮 IDC_BUTTON_CLOSESEL 关闭串口按钮 IDC_BUTTON_CLEARGETDATA 清空接收区按钮 IDC_BUTTON_SENDDATA 发送数据按钮 IDC_BUTTON_CLEARSENDDATA 清空发送区按钮 IDC_COMBO_CHOOSESEL CComboBox m_COMBO_ChooseSel 串口选择下拉框 IDC_COMBO_BOTRAT CCo

    2024年02月07日
    浏览(29)
  • 串口调试助手 安卓版 附下载地址

    平时工作中和硬件同事对接的比较多,软件和硬件的通讯,串口用的也比较多的。在网上找了很多串口调试工具,大都年代久远,没有继续更新维护的了。 于是,自己抽空写了一个:串口调试助手。基于Android-SerialPort-Api修改, 最低支持安卓5.x, 支持armeabi-v7a, arm64-v8a, x86, x

    2024年02月05日
    浏览(31)
  • 使用QT写个自用的串口助手

    遇到一个默认波特率1.5M的终端设备,看了下手上常用的串口助手竟然没有这个选项,所以干脆自己用QT手撕一个。 开发环境:QT 5.12.0 mingw64 一、创建工程 1、新建创建QMainWindow工程,基类可以选择QMainWindow也可以选择Qwiget,这个网上参考很多,自己搜哈。 2、工程我命名为UA

    2024年01月24日
    浏览(38)
  • 使用QtCreator C++编写串口调试助手

    Qt小白一枚,喜欢嵌入式应用,以前都是使用别人的串口调试助手,学习了C++以后,自己也尝试着做了简单的串口调试助手,分享给大家吧,希望能帮助到大家,如果有错误,请大家指正。话不多说开干! 1.首先看一下我设计的界面(我这里比较简单,大家可根据自己的需求进

    2024年02月06日
    浏览(38)
  • 制作一个串口助手 | python + pyqt5

    目录 一、背景 1.1、开发流程图 二、前提 2.1、关于环境 2.2、关于源码 三、步骤 3.1、使用pyqt创建一个.ui界面并生成.py文件 3.2、创建两个.py文件,一个用来继承ui界面生成的.py类,一个用来实现各种功能 3.3、各个功能代码 3.3.1、打开串口 3.3.2、关闭串口 3.3.3、获取串口号 3.

    2024年02月05日
    浏览(72)
  • Python界面编辑器Tkinter布局助手使用说明

    Tkinter布局助手是一款为Tkinter打造,仅需拖拽组件进行布局,所见即所得,非常方便就能做出一个GUI界面,再配合 pyinstaller 库将程序打包成exe,简直是开发小工具的利器。 当第一次接触到Tkinter,觉得它很方便,兼容性也挺不错,而且是Python自带的。 后来为了方便布局,我开

    2024年03月15日
    浏览(42)
  • STM32使用printf重定向到USART(串口)并打印数据到串口助手

    我们知道我们在进行编程的时候,遇到问题,经常通过打印信息进行调试,在java中使用的是System.out.println打印到输出窗口。在C语言中使用的是printf打印到输出窗口。而我们用keil进行编程的时候也是使用的C语言所以也可以使用printf,但是我们知道,keil中没有输出窗口。那我

    2024年02月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包