[转]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 ...
随机推荐
- 处理Word文档中所有修订
打开现有文档进行编辑 若要打开现有文档,您可以将 Word类实例化,如以下 using 语句所示. 为此,您可以使用Open(String, Boolean) 方法打开具有指定 fileName 的字 ...
- 微信小程序——地图
一:如何标点问题 地图模块需要用标点:官网API里面的wx.createMapContext(mapId, this)接口,且用官网Demo,小程序运行报错此时需要在wxml里面给map标签添加属性m ...
- 2019/3/4 java集合学习(二)
java集合学习(二) 在学完ArrayList 和 LinkedList之后,基本已经掌握了最基本的java常用数据结构,但是为了提高程序的效率,还有很多种特点各异的数据结构等着我们去运用,类如可以 ...
- Solr Cloud
bin/solr start -cloud -s example/cloud/node1/solr -p 8983 -z node13:2181,node14:2181,node15:2181/usr ...
- NGUI_创建图集Altas
在project面板下创建一个名为Textures的folder,把事先准备好的贴图素材直接拖到Textures下 2.导航栏NGUI处打开atlas 3.project下新建一个atlas的文件夹, ...
- VS code的疑惑之处
作为一个新手,我充满疑惑 eg:下载了git但无法使用匹配 然后在各位博主的详细解释下知道 VS code更新后的git.path被格式化了: so需要进行路径覆盖. 在这之后我的终端依旧出现问题 ...
- Asp.net Security框架(2)
Asp.net 的Security框架除了提供Cookies,OAuth,ActiveDirectory等多个用户认证实现,基本上已经满足业务项目的开发需要了. 当需要实现OAuth2.0服务器端实现 ...
- Oracle 树操作、递归查询(select…start with…connect by…prior)
一.Oracle中start with…connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是:select … from tablename start ...
- MySQL--Skip GTID CAP
import os script_file = "./skip_file.sql" def write_script(script_content): file_handle = ...
- Jenkins的初级应用(2)-Invoke Phing targets
Invoke Phing targets这个插件主要是读取xml形式包括自动化测试打包部署的配置文件,然后根据流程走下来.用phing命令读取并执行xml配置文件,然后执行定义的步骤.比如check. ...