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

考研期间,利用晚上一点时间,照葫芦画瓢,练习使用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. flask之信号和mateclass元类

    本篇导航: flask实例化参数 信号 metaclass元类解析 一.flask实例化参数 instance_path和instance_relative_config是配合来用的:这两个参数是用来 ...

  2. .Net转Java.06.字符串的split的区别

    在Java遇到了将类似“1|2|3|4”的字符串分隔为数组的功能 这种问题能难倒有着十多年开发经验的的.NET码农? // Java代码 String s="1|2|3"; Str ...

  3. 修改编辑器为Markdown编辑器

    一直都在使用cnblogs的TinyMCE,不过感觉好久不更新,还是用Markdown吧,写多了Markdown 还真是受感染呢. 学习下吧,边学便用. 参考链接: 序列图 [简明版]有道云笔记Mar ...

  4. 13、spark-submit

               

  5. netty4.0 Server和Client的通信

    netty4.0 Server和Client的通信 创建一个maven项目 添加Netty依赖 <dependency> <groupId>io.netty</group ...

  6. PDF.js 分片下载的介绍2:分片下载demo

    上一个章节,简要说了以下分片下载的几个特性.今天主要用示例说明一下pdf.js分片下载. 服务器环境: php7.2 nginx 1.14 ubuntu 18.04测试浏览器:谷歌浏览器 70.0.3 ...

  7. flink 有状态udf 引起血案一

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/rlnLo2pNEfx9c/article/details/83422587 场景 近期在做一个画像的 ...

  8. 让Linux系统开机速度更快的方法

    进行 Linux 内核与固件开发的时候,往往需要多次的重启,会浪费大把的时间. 在所有我拥有或使用过的电脑中,启动最快的那台是 20 世纪 80 年代的电脑.在你把手从电源键移到键盘上的时候,BASI ...

  9. Lazarus 初识

    Lazarus 使用 Free Pascal 的编译器,支持 Object Pascal 语言,与 Delphi 高度兼容,并看做后者的自由软件替代品. Lazarus 下载与安装 我们先去 Laza ...

  10. 通过配置JVM参数解决生成日志存在乱码问题

    项目上生产环境时出现一个问题,生成的日志文件存在乱码,服务器编码为 LANG=zh_US.UTF-8,按理说中文不会存在乱码,这里存在一个问题,就是在SIT等其他环境我们使用的连接工具为Xshell, ...