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

考研期间,利用晚上一点时间,照葫芦画瓢,练习使用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. uploadify Cookie 验证登入上传问题

    上传文件时必须验证是否已登入. 当用FormsAuthentication做登入,使用FormsAuthentication.FormsCookieName进行验证是否已登入即可. <scrip ...

  2. jQuery 学习01——定义、安装引用、语法、选择器及事件

    什么是 jQuery ? jQuery是一个JavaScript函数库. jQuery是一个轻量级的"写的少,做的多"的JavaScript库. jQuery库包含以下功能: HT ...

  3. 使用 vscode + chrome debuger断点调试 Vue 程序

    总体参考:https://cn.vuejs.org/v2/cookbook/debugging-in-vscode.html 注意点: 1.修改 source-map 2.设置 webRoot 的路径 ...

  4. Android Studio提示 Connection reset

    解决步骤: 1:Android studio开发工具:File -> Invalidate caches / Restart:选择Invalidate and Restart关闭 Android ...

  5. 对类的理解(c++)

    介绍目录: 1.类成员 1.1 成员函数 1.2 构造函数 1.2.1 对构造函数的理解 1.2.2成员初始化列表 1.2.3必须使用成员初始化列表的几种情况 1.2.4对于拷贝构造函数的参数是一个引 ...

  6. Java利用ShutDownHook关闭系统资源

    Java关闭钩子 在Java程序中能够通过加入关闭钩子,实如今程序退出时关闭资源的功能. 使用Runtime.addShutdownHook(Thread hook)向JVM加入关闭钩子 public ...

  7. TensorFlow相关

    TensorFlow的55个经典案例(转) https://blog.csdn.net/xzy_thu/article/details/76220654 随笔分类 - 数据挖掘及机器学习  www.c ...

  8. 【转】关于提示can't load package 'xxx.bpl.' 错误问题的解决方法

      转自: http://blog.sina.com.cn/s/blog_44fa172f0102v9x3.html         'xxx.bpl'包实际存在, 路径并且正确. 但是总提示'can ...

  9. Mongodb系列- CRUD操作介绍

    ---恢复内容开始--- 一 Create 操作 在MongoDB中,插入操作的目标是一个集合. MongoDB中的所有写入操作在单个文档的层次上都是原子的. For examples, see In ...

  10. python sphinx 文档自动生成方法

    ## sphinx 生成开发文档#### 配置 1. 运行如下命令,即可生成 conf.py index.rst Makefile 三个文件: `sphinx-quickstart` 2. conf. ...