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

考研期间,利用晚上一点时间,照葫芦画瓢,练习使用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. a^b%p and a*b%p快速幂

    #include<cstdio> int power(int a, int b, int p) { %p; ) { ) ans=(long long)ans*a%p; a=(long lo ...

  2. [转载]理解 Git 分支管理最佳实践

    原文 理解 Git 分支管理最佳实践 Git 分支有哪些 在进行分支管理讲解之前,我们先来对分支进行一个简单的分类,并明确每一类分支的用途. 分支分类 根据生命周期区分 主分支:master,deve ...

  3. JSOUP 请求JSON

    JSOUP请求JSON Document doc = Jsoup .connect(Constant.DATA_URL) .header("Accept", "*/*&q ...

  4. 对Unity的Resources目录进行改名

    项目用的是Unity5.5版本,开发的时候将相关的图集.预制对象资源都放在 Resources 目录下,而真机使用的是 StreamingAssets 目录下的资源. Resources(不分层级)在 ...

  5. Unsupervised pre-training

    如图所示: 假设你想要解决一个复杂的任务,你没有太多的标记的训练数据,但不幸的是,你不能找到一个类似的任务训练模型. 不要失去所有希望! 首先,你当然应该尝试收集更多的有标签的训练数据,但是如果这太难 ...

  6. iOS:UIButton扩大按钮的响应区域

    一.介绍 在开发中有时会遇见设计图里按钮设计的特别小,这时会用到手动扩大UIButton的响应范围 二.方式 下面有两个解决办法: 第一种方法:创建一个类目:UIButton+EnlargeTouch ...

  7. redis查看状态信息

    redis查看状态信息 info all|default Info 指定项 server服务器信息 redis_version : Redis 服务器版本 redis_git_sha1 : Git S ...

  8. JavaAes加密操作工具类

    package com.king.weixin.util;import java.io.UnsupportedEncodingException;import java.security.Algori ...

  9. Switch语句的参数是什么类型的?

    在Java5以前,switch(expr)中,exper只能是byte,short,char,int类型. 从Java5开始,java中引入了枚举类型,即enum类型. 从Java7开始,exper还 ...

  10. (原)visual studio 2015中添加dll路径

    转载请注明出处: https://www.cnblogs.com/darkknightzh/p/9922033.html 使用vs2015调用opencv 3.4时,除了需要在“VC++目录”中”包含 ...