做技术的通病,什么都想学,什么都想亲手做一遍。不然总感觉心里不踏实。

考研期间,利用晚上一点时间,照葫芦画瓢,练习使用c#快速开发一个简单的串口小助手。

这种前后端分离的设计方法,大大提高了开发速度,比Python的wxPython写软件方便很多。

但是使用c#写软件在软件群里问问题的时候,却被人家用qt的嘲笑。(悲伤脸)

好吧,不管怎样,亲手实践一下总不会错的。简单介绍一下吧。界面设计:

1、相对重要的串口接收事件

首先注册一个接收事件,相当于单片机中的串口中断函数。

接下来为了完成接收字节的计数,需要串口按照字节接收,并区分HEX和ASCII接收形式。

下面是接收函数的实现,其中包括可选择显示接收时间:

//串口接受事件处理
private void SerialPort1_DataReceieved(object sender, SerialDataReceivedEventArgs e)
{
//方法2:按字节读取
int num = serialPort1.BytesToRead; //获取缓冲区字节数
byte[] received_buf = new byte[num]; receieve_count += num;
serialPort1.Read(received_buf, , num); //将缓冲区数据读取到received_buf sb.Clear(); //防止出错,先清空字符串构造器 if(radioButton2.Checked) //以HEX形式接收
{
foreach(byte b in received_buf)
{
sb.Append(b.ToString("X2") + " "); //byte转化为2位16进制文本进行显示,中间用空格隔开
}
}
else //默认ascii形式接收
{
sb.Append(Encoding.ASCII.GetString(received_buf));//将接收数组解码为ascii数组
}
//显示到接收文本框内
try
{
Invoke((EventHandler)(delegate
{
if(checkBox1.Checked)
{
//显示时间
current_time = System.DateTime.Now;
textBox_R.AppendText(current_time.ToString("HH:mm:ss") + " " + sb.ToString());
}
else
{
textBox_R.AppendText(sb.ToString());
}
if (checkBox2.Checked)
{
//接收自动换行
textBox_R.AppendText(Environment.NewLine);
}
//更新状态栏
label9.Text = "Rx:" + receieve_count.ToString() + "Bytes";
}));
}
catch (Exception ex)
{
//响铃并显示异常信息
System.Media.SystemSounds.Beep.Play();
MessageBox.Show(ex.Message);
}
}

还有一个重要的问题就是如何解决接收过程中实时显示接收的字符串,而不是等接收完毕后在显示的问题。

因为在当前工作线程中直接修改文本框的话会出现错误。

在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使得多线程中安全的更新界面显示。

正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。

而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而已,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。

2、定时发送功能

        //自动定时发送
private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
if(checkBox3.Checked)
{
//选择自动发送
numericUpDown1.Enabled = false;
timer1.Interval = (int)numericUpDown1.Value; //定时器赋值,单位:毫秒
timer1.Start();
label7.Text = "串口已打开" + "自动发送中...";
}

和使用单片机时差不多,这里相当于设置了一个定时器,只不过默认定时单位是1ms,所以,按照单片机编程的思想,设置了定时器肯定还需要定时器中断函数,因此还需要注册一个定时器事件:

        //定时时间到
private void timer1_tick(object sender, EventArgs e)
{
button2_Click(button2, new EventArgs());//调用发送按钮的回调函数
}

3、运行

完整工程:

https://github.com/Andrew5c/c-_USART

C#串口小助手的更多相关文章

  1. Qt 编写串口调试助手

    一.成品图展示 成品图如下所示: 二.串口通讯步骤 1.在工程文件(.pro)中添加串口通信相关运行库:QT += serialport 2.在头文件中添加: #include <QSerial ...

  2. 发布代码小助手V2.1发布了——Code2HTML工具

    设计起源: 新浪博客似乎没有插入代码的功能,所以不得不用打空格的方法格式化代码.而且没法显示行号. 描述: 发布代码小助手用python和Tkinter开发,可以在任何常见操作系统上运行.主要用于在不 ...

  3. 书签小助手V1.1发布了

    更新信息: 1.修改了部分BUG;2.添加了一些不错的网站:3.重新设计了添加书签和编辑书签的界面. 安装说明: 类Ubuntu系统: 1.安装Python3解释器和Python3-tk sudo a ...

  4. 环境监测小助手V1.1的Windows版

    环境监测小助手V1.1——可以实时查看空气质量和城市排名 一款跨平台空气质量监测软件 数据来源互联网,请联网使用. 暂不支持效果预览. 下载地址:http://files.cnblogs.com/py ...

  5. Windows版词汇小助手V3.0发布了

    欢迎使用词汇小助手 作者:IT小小龙 电子邮箱:long_python@126.com 个人博客:http://blog.sina.com.cn/buduanqs 一款跨平台词汇查询记忆学习软件. 已 ...

  6. 词汇小助手V3.0发布了——不只是一个查单词的软件

    欢迎使用词汇小助手 作者:IT小小龙 电子邮箱:long_python@126.com 个人博客:http://blog.sina.com.cn/buduanqs 一款跨平台词汇查询记忆学习软件. 已 ...

  7. 生日小助手V4.0——迁移到Python3

    生日小助手V4.0——迁移到Python3 生日小助手V4.0只支持Linux系统,依赖命令行软件lunar Ubuntu系统安装方法:1.安装lunarsudo apt-get install lu ...

  8. DEDECMS-helper小助手扩展

    今天在做DEDE动态调用模板的时候卡住了,后终被强大的互联网解决,记录解决问题的过程,以备后用 可以在/data/helper.inc.php中进行默认小助手初始化的设置,系统默认载入小助手 例如创建 ...

  9. COJ 3007 Mr.Yang的小助手

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1037 试题描述: 信息学社团已经逐渐发展壮大,成员也越来越多.现在,有n个 ...

随机推荐

  1. docker中的数据库

      注:自从开始使用docker,部署方面的事情就简单多了.使用docker构建的数据库容器不用直接安装,开启后就可以使用,也比以前方便很多.下面将一些要点记录下来. 下面的例子使用以下环境: - 系 ...

  2. JSONArray数据转换成java List

    1.后台接收json数组转成封装实体类的List: package no.integrasco.ingentia.news.qaedition; public class Person { priva ...

  3. [Linux] - 网速测试命令

    Windows网速测试方法有很多,或者可以直接使用浏览器去一些网站上搜索测试即可. 在Linux中其实更容易,只需要一行命令即可搞定: curl -s https://raw.githubuserco ...

  4. oralce 11.2.0.4手动创建EM

    安装完oracle,启动dbconsole,失败 [oracle@elearning admin]$ emctl start dbconsole OC4J Configuration issue. / ...

  5. iOS Xcode 10: Multiple commands produce

    Xcode自动升级到10.0 1.编译的时候报错:Multiple commands produce 解决办法:File -> Workspace Setting -> build sys ...

  6. CentOS 7.2编译安装PHP7

    原文: https://typecodes.com/web/centos7compilephp7.html?utm_source=tuicool&utm_medium=referralPHP官 ...

  7. Nginx 学习专栏

    Nginx 入门学习教程 译:Centos7 编译安装Nginx 教程

  8. Atitit 文员招募规范 attilax总结

    Atitit 文员招募规范 attilax总结 1. 概念 2 2. 文员招募范文 2 3. 重大意义 3 3.1. 第一层  文章撰写 能力 3 3.2. 第二次 文档管理能力 文档索引 检索查找 ...

  9. Linux Performance tool

    https://www.tecmint.com/command-line-tools-to-monitor-linux-performance/ https://www.tecmint.com/lin ...

  10. Excel公式与函数——每天学一个

    说明(2018-5-29 20:35:53): 1. 根据刘伟的视频讲解进行总结,网上讲Excel公式与函数的貌似就他讲的还不错.在他的微博里看到现在的照片胖了不少,不过还挺帅的,不再是以前那个小屌丝 ...