[转]C# serialPort 串口接收中this.Invoke的使用
本文转自:https://blog.csdn.net/hjk216/article/details/72677596
转载地址:http://www.ciast.net/post/20160752.html
- private void DisplayText(object sender, EventArgs e)
- {
- textBox1.Text = datain;
- }
- private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) //本方法注册到了串口接收数据事件上去
- {
- datain = serialPort1.ReadExisting();
- this.Invoke(new EventHandler(DisplayText)); //括号内为绘制窗口的方法的委托,采用的是标准事件的委托
- }
如上程序所示,在串口接收数据的方法中我们使用了this.Invoke(),下面讲一下关于this.Invoke()在串口中的使用,自己也是菜鸟,所以仅供参考。
首先我们要知道:串口接收事件会自动创建线程(也就是说它已经不在主线程了),对于C#来说,默认是不能在其它线程中对非本线程创建的控件进行访问的(一般情况下控件都是主线程中的),如果你的这个事件代码中不操作控件(比如文本框之类的),那可以不用invoke,否则就要用委托了,不然在运行中就会报错。
也就是说在串口接收数据中,我们使用了多线程,我们现在需要用工作线程获得的串口数据去修改界面中LABEL1的text属性,而界面的创建和修改都是主线程的事,但是在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法(不能跨线程直接访问),Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。
那么Invoke或者BeginInvoke是怎么解决这件事情的呢?首先我们以Invoke 为例(BeginInvoke 类似)。我们通常的做法是将工作线程中设计界面更新的代码封装成一个方法,使用Invoke去调用,这里要让封装的方法尽量的简单,因为折让可以使 UI 线程(主线程)的负担不至于太大而已,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。让后我们的Invoke 就该上场了,Invoke方法一般应用在辅助线程中修改UI线程( 主线程 )中对象的属性时,主要是像上面一样调用this.Invoke();这里的this是什么意思呢?
这里让我们看一看Invoke()在系统中的定义:
- // 摘要:
- // 在拥有此控件的基础窗口句柄的线程上执行指定的委托。
- // 参数:
- // method:
- // 包含要在控件的线程上下文中调用的方法的委托。
- //
- // 返回结果:
- // 正在被调用的委托的返回值,或者如果委托没有返回值,则为 null。
- [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
- public object Invoke(Delegate method);
由定义可知“在拥有此控件的基础窗口句柄的线程上执行指定的委托。”所以我们知道这里的this是指的主窗口,而这里的Invoke()在主窗口中执行。我们有如下一般结论:Invoke()的作用是在应用程序的主线程上执行指定的委托。就是说使用Invoke ()之后,虽然这句函数是在串口数据接收的子线程中调用的,但是系统会在主线程上调用Invoke 中制定的委托事件,而且子线程的参数也会被传递到委托方法中去,这样看起来做到了在子线程中执行界面显示任务,而且显示的参数也是子线程的。
[转]C# serialPort 串口接收中this.Invoke的使用的更多相关文章
- System.IO.Ports.SerialPort串口通信接收完整数据
C#中使用System.IO.Ports.SerialPort进行串口通信网上资料也很多,但都没有提及一些细节: 比如 串口有时候并不会一次性把你想要的数据全部传输给你,可能会分为1次,2次,3次分别 ...
- 关于STM32串口接收中断中只能接收一个字节
最近调试STM32的串口接收时发现例程中只能接收一个字节 例程如下: //初始化串口1 void uart_init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef G ...
- winform SerialPort串口通信问题
一.串口通信简介串行接口(串口)是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为串 ...
- STM32串口接收不定长数据原理与源程序(转)
今天说一下STM32单片机的接收不定长度字节数据的方法.由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的A ...
- stm32的串口接收字符串以十六进制数
#include "pbdata.h" uint8_t TxBuffer1[] = "USART Interrupt Example: This isUSART1 ...
- STM32 ucosii 串口接收数据 遇到的问题及解决思路
写一个程序,用到了ucos ii ,串口在中断中接收数据(一包数据 8个字节 包含: 1byte包头 5byte数据 1byte校验和 1byte 包尾 ) ,数据由上位机每隔500ms发送一次,在串 ...
- (c#2.0)serialPort串口通讯
原文:(c#2.0)serialPort串口通讯 using System; using System.Collections.Generic; using System.ComponentModel ...
- 串口通信中ReadFile和WriteFile的超时详解!
源:串口通信中ReadFile和WriteFile的超时详解! 在用ReadFile和WriteFile读写串行口时,需要考虑超时问题.如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFi ...
- 2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9490616.html 本文用的是VS2013MFC写串口数据接收: 第一步:首先建立一个MFC ...
随机推荐
- github install
1.安装git依赖包 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUti ...
- python学习总结(一)
1.编码格式发展历史 ASCII 255 Ibytes --> 1980 gb2312 7000+ -->1995 GBK1.0 2W+ -->2000 GB18030 2.7W+ ...
- uintAPi 之Renderer.material
Renderer.material public Material material; Returns the first instantiated Material assigned to the ...
- 理解 Linux 的虚拟内存
前言 前不久组内又有一次我比较期待的分享:”Linux 的虚拟内存”.是某天晚上加班时,我们讨论虚拟内存的概念时,leader 发现几位同事对虚拟内存认识不清后,特意给这位同学挑选的主题(笑). 我之 ...
- JSTL标签库的基本教程之核心标签库(二)
JSTL标签库的基本教程之核心标签库(二) 核心标签库 标签 描述 <c:out> 用于在JSP中显示数据,就像<%= ... > <c:set> 用于保存数据 & ...
- 关于Spring Cloud的核心特性
SOA和微服务的区别 其实服务化架构已经可以解决大部分企业的需求了,那么我们为什么要研究微服务呢?先说说它们的区别: 微服务架构强调业务系统需要彻底的组件化和服务化,一个组件就是一个产品,可以独立对外 ...
- Javascript高级编程学习笔记(48)—— HTML5
HTML变动最大的版本应该就是HTML5了,这里就介绍一些 HTML5新增的DOM相关的API 与类相关的扩充 HTML4在普及后有一个十分重要的变化,即class属性使用的场景越来越多 所以HTML ...
- HTTP 协议服务器相关概念
1.HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点,即物理层面只有一台服务器,使用虚拟主机功能,可就假想有多台服务器. 在相同IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的网站, ...
- redis5.0新特性
1. redis5.0新特性 1.1. 新的Stream类型 1.1.1. 什么是Stream数据类型 抽象数据日志 数据流 1.2. 新的Redis模块API:Timers and Cluster ...
- 序列化与反序列化之JSON
在不同编程语言之间传递对象,须把对象序列化为标准格式,比如XML 但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可被所有语言读取,也可方便地存储到磁盘或者通过网络传输 JSON不 ...