C#串口小助手
做技术的通病,什么都想学,什么都想亲手做一遍。不然总感觉心里不踏实。
考研期间,利用晚上一点时间,照葫芦画瓢,练习使用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#串口小助手的更多相关文章
- Qt 编写串口调试助手
一.成品图展示 成品图如下所示: 二.串口通讯步骤 1.在工程文件(.pro)中添加串口通信相关运行库:QT += serialport 2.在头文件中添加: #include <QSerial ...
- 发布代码小助手V2.1发布了——Code2HTML工具
设计起源: 新浪博客似乎没有插入代码的功能,所以不得不用打空格的方法格式化代码.而且没法显示行号. 描述: 发布代码小助手用python和Tkinter开发,可以在任何常见操作系统上运行.主要用于在不 ...
- 书签小助手V1.1发布了
更新信息: 1.修改了部分BUG;2.添加了一些不错的网站:3.重新设计了添加书签和编辑书签的界面. 安装说明: 类Ubuntu系统: 1.安装Python3解释器和Python3-tk sudo a ...
- 环境监测小助手V1.1的Windows版
环境监测小助手V1.1——可以实时查看空气质量和城市排名 一款跨平台空气质量监测软件 数据来源互联网,请联网使用. 暂不支持效果预览. 下载地址:http://files.cnblogs.com/py ...
- Windows版词汇小助手V3.0发布了
欢迎使用词汇小助手 作者:IT小小龙 电子邮箱:long_python@126.com 个人博客:http://blog.sina.com.cn/buduanqs 一款跨平台词汇查询记忆学习软件. 已 ...
- 词汇小助手V3.0发布了——不只是一个查单词的软件
欢迎使用词汇小助手 作者:IT小小龙 电子邮箱:long_python@126.com 个人博客:http://blog.sina.com.cn/buduanqs 一款跨平台词汇查询记忆学习软件. 已 ...
- 生日小助手V4.0——迁移到Python3
生日小助手V4.0——迁移到Python3 生日小助手V4.0只支持Linux系统,依赖命令行软件lunar Ubuntu系统安装方法:1.安装lunarsudo apt-get install lu ...
- DEDECMS-helper小助手扩展
今天在做DEDE动态调用模板的时候卡住了,后终被强大的互联网解决,记录解决问题的过程,以备后用 可以在/data/helper.inc.php中进行默认小助手初始化的设置,系统默认载入小助手 例如创建 ...
- COJ 3007 Mr.Yang的小助手
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1037 试题描述: 信息学社团已经逐渐发展壮大,成员也越来越多.现在,有n个 ...
随机推荐
- .Net Core中的通用主机(二)——托管服务
前文介绍了.Net core的通用主机的配置,在基础配置完成后,下一步就是注册我们的后台任务了..net core提供了一个通用的后台服务接口IHostedService,称为托管服务.一个注册托管服 ...
- ASP.NET WebApi 基于OAuth2.0实现Token签名认证
一.课程介绍 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将是我们需要思考的问题.为了保护我们的WebApi数 ...
- poi 升级至4.x 的问题总结(POI Excel 单元格内容类型判断并取值)
POI Excel 单元格内容类型判断并取值 以前用 cell.getCachedFormulaResultType() 得到 type 升级到4后获取不到了 换为:cell.getCellType( ...
- 经纬度编码方法推荐-plus code简介
今天罗孚为大家推荐一种经纬度编码的方法--plus code,原名open location code,是Google于2014年发明的,旨在将表示地理位置的经纬度通过算法推导成一个字符串. plus ...
- iOS ReplayKit实时录制屏幕实现方案的细节记录
项目有个需求,需要把ios设备上的操作画面实时传输出去,也就是类似推流手机直播画面的方案. 一番调研后发现在ios中,我们可以通过ios自带ReplayKit框架实现. 关于ReplayKit的讲解, ...
- Navicat Win 和 Mac 视图类快捷键对比
Navicat 查询是根据用户需求从数据库提取可读格式的数据,Navicat 提供两个强大的工具与 SQL 查询工作:查询创建工具和查询编辑器,查询创建工具可视觉化地创建查询,查询编辑器可直接编辑查询 ...
- Why does Delphi XE7 IDE hangs and fails on out of memory exception?
引自: https://stackoverflow.com/questions/27701294/why-does-delphi-xe7-ide-hangs-and-fails-on-out-of ...
- Docker的学习
学习地址:http://blog.51cto.com/lizhenliang 和 他的视频 一 Docker 的介绍和安装 二 镜像管理 三 容器管理 四 管理应用程序数据 五 使用Docker知 ...
- python(61):str 和 bytes 转换
str 和 bytes 转换 b = b"example" # str object s = "example" # str to bytes bytes(s, ...
- kafka调试工具kafkacat的使用
一. 安装 kafkacat 是基于kafka C语言的librdkafka库的 kafka客户端,不依赖java,小巧轻便,支持主流系统.在高版本的debain.Ubuntu下可以直接apt-get ...