[转]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 ...
随机推荐
- Python核心团队计划2020年停止支持Python2,NumPy宣布停止支持计划表
Python核心团队计划在2020年停止支持Python 2.NumPy项目自2010年以来一直支持Python 2和Python 3,并且发现支持Python 2对我们有限的资源增加了负担:因此,我 ...
- [转]Rapidly detecting large flows, sFlow vs. NetFlow/IPFIX
Figure 1: Low latency software defined networking control loop The articles SDN and delay and Delay ...
- 谈谈一些有趣的CSS题目(十六)-- 奇妙的 background-clip: text
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- CLion之C++框架篇-安装工具,基础框架的搭建(一)
背景 日常学习C++,也就是看看书.在vim里写写代码.在日常项目开发中,也是边看书(一是系统性理解.二是找找有什么更好的代码编写方式)边写代码,会顺带看看别人的代码怎么写的? 日常学 ...
- .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上(ZT)
本文转载 https://walterlv.github.io/dotnet/2017/09/22/dotnet-version.html ,感谢 吕毅 (包含链接: https://walte ...
- Hadoop 倒排索引
倒排索引是文档检索系统中最常用的数据结构,被广泛地应用于全文搜索引擎.它主要是用来存储某个单词(或词组)在一个文档或一组文档中存储位置的映射,即提供了一种根据内容来查找文档的方式.由于不是根据文档来确 ...
- 高手养成计划基础篇-Linux第二季
高手养成计划基础篇-Linux第二季 本文来源:i春秋社区-分享你的技术,为安全加点温度 前言 前面我们学习了文件处理命令和文件搜索命令,简单的了解了一下Linux,但是仅仅了解这样还不行,遇 ...
- mysql原生sql盘点
select*from (select*from test1 union all select*from test2 ) //两个查询的数据行数需要对应一致,且名字as 一致. 1.如果直接用如下sq ...
- 埃航和737MAX坠毁:软件优先级问题
事件背景: 2019年3月10日,埃塞俄比亚航空公司一架波音737MAX8飞机发生坠机,机上157人全部遇难,包括8名中国公民.这是继去年10月29日印尼狮航空难事故之后,波音737MAX8飞机在五个 ...
- Android Studio 更新同步Gradle错误解决方法
1.在https://services.gradle.org/distributions/下载对应的gradle的zip包,对应方法见gradle-wrapper.properties文件中的: di ...