[精选]23 单个串口设备数据的连续接收.pptx
《[精选]23 单个串口设备数据的连续接收.pptx》由会员分享,可在线阅读,更多相关《[精选]23 单个串口设备数据的连续接收.pptx(44页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、工控程序设计工控程序设计工控程序设计工控程序设计学习情景学习情景学习情景学习情景2 2 2 2 串口设备的数据采集串口设备的数据采集串口设备的数据采集串口设备的数据采集学习情景学习情景2.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收 2.3.1 2.3.1 学习要点学习要点 1.1.知识点:线程的概念,委托的概念和使用方法,线程的创立和启动,工知识点:线程的概念,委托的概念和使用方法,线程的创立和启动,工作者线程和用户界面线程之间的数据传递,线程同步技作者线程和用户界面线程之间的数据传递,线程同步技 2.2.技能点:工作者线程的创立,串口数据接收和处理操作的封装技能点:工作
2、者线程的创立,串口数据接收和处理操作的封装2.3.2 2.3.2 任务描述任务描述 1.1.在前一个情景中完成了接收和处理单一串口设备数据的工作任务。实际在前一个情景中完成了接收和处理单一串口设备数据的工作任务。实际应用中,上位机需要连续地接收和处理下位机发送的数据,而且在等待应用中,上位机需要连续地接收和处理下位机发送的数据,而且在等待和接收数据的时候,用户界面不能停止响应。接收数据和响应用户输入和接收数据的时候,用户界面不能停止响应。接收数据和响应用户输入这两个工作在宏观上是同时进行的,为了满足该需求,必须采用多线程这两个工作在宏观上是同时进行的,为了满足该需求,必须采用多线程模式来进行程
3、序设计。模式来进行程序设计。2.2.该教学情景通过该教学情景通过“在工作者线程中接收在工作者线程中接收HSDZCHSDZC电能综合测试仪的电能综合测试仪的“HSDZCHSDZC电能综合测试仪数据接收和处理操作的封装这两个实施步骤到电能综合测试仪数据接收和处理操作的封装这两个实施步骤到达连续接收接收单个串口设备下位机数据的目的。达连续接收接收单个串口设备下位机数据的目的。学习情景学习情景2.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收v2.3.3 2.3.3 相关知识相关知识v1 1 多线程技术概述多线程技术概述v1 1线程的概念线程的概念vWindowsWindows是一个
4、抢占式多任务操作系统,在系统内核中提供了对多线是一个抢占式多任务操作系统,在系统内核中提供了对多线程的支持,多线程技术可以让应用程序在一个耗时的操作中能够及时程的支持,多线程技术可以让应用程序在一个耗时的操作中能够及时对用户操作进行响应,并且从宏观上到达多个任务对用户操作进行响应,并且从宏观上到达多个任务“齐头并进的目齐头并进的目的的v进程是应用程序的一个运行例程,是应用程序的一次动态执行过程。进程是应用程序的一个运行例程,是应用程序的一次动态执行过程。线程是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,线程是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,但它可与同属一个进
5、程的其它线程共享进程所拥有的全部资源。每个但它可与同属一个进程的其它线程共享进程所拥有的全部资源。每个进程至少需要一个执行线程,由系统自动创立,程序设计者可以根据进程至少需要一个执行线程,由系统自动创立,程序设计者可以根据需要创立其它线程。由于多个线程共享进程中的全局变量和系统资源,需要创立其它线程。由于多个线程共享进程中的全局变量和系统资源,所以线程间的切换比较容易,通信也比较方便。所以线程间的切换比较容易,通信也比较方便。学习情景学习情景2.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收v2 2.NET Framework.NET Framework对多线程的支持对多线程
6、的支持v.NET.NET平台库提供了平台库提供了ThreadThread类对线程进行处理,该类包含在类对线程进行处理,该类包含在System.ThreadingSystem.Threading命名空间中,程序中需要包含语句命名空间中,程序中需要包含语句“using using System.Threading;System.Threading;。编程人员可以通过创立一个。编程人员可以通过创立一个ThreadThread类的实例类的实例来创立一个线程,并通过来创立一个线程,并通过ThreadThread类提供的方法对线程进行管理。类提供的方法对线程进行管理。ThreadThread类的常用属性和
7、方法如下表:类的常用属性和方法如下表:v表表2.3.1 Thread2.3.1 Thread类的常用属性和方法类的常用属性和方法学习情景学习情景2.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收v2 2 委托的概念和使用方法委托的概念和使用方法vC#C#中的委托的作用相当于中的委托的作用相当于C/C+C/C+中的函数指针,函数指针是一个函数中的函数指针,函数指针是一个函数的入口地址。必修使用函数指针的场合是:程序员的入口地址。必修使用函数指针的场合是:程序员A A编写了函数编写了函数f f,该,该函数中需要执行另外一个参数和返回值已经确定,但名字暂时不能确函数中需要执行另外一
8、个参数和返回值已经确定,但名字暂时不能确定函数,所以给函数设置一个函数指针类型的形式参数;当程序员定函数,所以给函数设置一个函数指针类型的形式参数;当程序员B B使用函数使用函数f f时,定义函数时,定义函数g g,并把,并把g g的入口地址作为实际参数传递给函的入口地址作为实际参数传递给函数数f f,这样就可以在,这样就可以在f f中执行函数中执行函数g g了。了。v线程的启动是使用函数指针的一个典型例子,在启动线程之前,先要线程的启动是使用函数指针的一个典型例子,在启动线程之前,先要给操作系统指明线程启动后执行哪一函数中包含的代码,这时就要把给操作系统指明线程启动后执行哪一函数中包含的代码
9、,这时就要把函数的指针传递给创立线程的函数。函数的指针传递给创立线程的函数。v回调回调完成后通知完成后通知是使用函数指针的另外一个典型例子。如程序员是使用函数指针的另外一个典型例子。如程序员A A编写了负责接收网络数据的函数编写了负责接收网络数据的函数f1f1,程序员,程序员B B编写了负责处理数据的编写了负责处理数据的函数函数f2f2,那么就可以把,那么就可以把f2f2的函数指针作为参数传递给函数的函数指针作为参数传递给函数f1f1,当,当f1f1接接收数据完毕后,自动调用收数据完毕后,自动调用f2f2。所以回调的特点是:站在程序员。所以回调的特点是:站在程序员B B的角的角度看,函数由自己
10、编写,但是不由自己调用,且不知道什么时候被调度看,函数由自己编写,但是不由自己调用,且不知道什么时候被调用因为网络速度有快有慢,函数编写者要做的就是把函数指针传用因为网络速度有快有慢,函数编写者要做的就是把函数指针传递出去。递出去。学习情景学习情景2.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收v定义委托的关键字是定义委托的关键字是delegatedelegate,它是从,它是从System.DelegateSystem.Delegate类派生出来类派生出来的。例如:的。例如:vdelegate int SomeDelegatedelegate int SomeDelega
11、teint p1,string p2int p1,string p2;v/int p1/int p1和和string p2string p2是被引用函数的参数类型和名称。其中参数类是被引用函数的参数类型和名称。其中参数类型和参数的个数必须和被引用函数的类型与个数一致。型和参数的个数必须和被引用函数的类型与个数一致。v3 3 创立和启动线程创立和启动线程v一个线程必须和一个方法的入口委托关联起来,线程启动后,自一个线程必须和一个方法的入口委托关联起来,线程启动后,自动从该入口进入,执行函数体中包含的内容。动从该入口进入,执行函数体中包含的内容。C#C#应用程序启动时,自动创立主线程,并进入应用程
12、序启动时,自动创立主线程,并进入MainMain方法开始执行,其它方法开始执行,其它线程需要在程序里自己定义和启动。由于委托可以代表一个方法的入线程需要在程序里自己定义和启动。由于委托可以代表一个方法的入口口,学习情景学习情景2.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收 所以创立线程实例时只需要在所以创立线程实例时只需要在ThreadThread类的构造方法里传入一个委托实类的构造方法里传入一个委托实例即可,这个委托名叫例即可,这个委托名叫ThreadStartThreadStart,已经在线程命名空间中定义作,已经在线程命名空间中定义作了定义:了定义:v public
13、 delegate void ThreadStart public delegate void ThreadStart;v所以创立线程方式如下:所以创立线程方式如下:vThreadStart functionEntrance=new ThreadStartThreadStart functionEntrance=new ThreadStartthreadFunctionthreadFunction;vThread t=new ThreadThread t=new ThreadfunctionEntrancefunctionEntrance;v在委托在委托ThreadStartThreadSta
14、rt的构造方法里面传入的是方法名,这个方法可以的构造方法里面传入的是方法名,这个方法可以是静态方法,也可以是某个对象的方法。线程对象创立后,我们就可是静态方法,也可以是某个对象的方法。线程对象创立后,我们就可以调用其以调用其StartStart方法开始线程的执行了。方法开始线程的执行了。学习情景学习情景2.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收 我们可以在主线程里建立线程,也可以在线程里再创立线程,线程启我们可以在主线程里建立线程,也可以在线程里再创立线程,线程启动后会自动执行委托实例代表的方法,线程执行完后会自动销毁并释动后会自动执行委托实例代表的方法,线程执行完后
15、会自动销毁并释放其占用的资源。放其占用的资源。在一个新线程中执行带参数的函数,操作步骤如下:在一个新线程中执行带参数的函数,操作步骤如下:定义线程函数:定义线程函数:private void paramThreadFunction private void paramThreadFunctionobject paramobject param /函数体函数体 用用ParameterizedThreadStartParameterizedThreadStart委托封装线程函数:委托封装线程函数:学习情景学习情景2.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收vParamete
16、rizedThreadStart functionEntrance=ParameterizedThreadStart functionEntrance=v new ParameterizedThreadStart new ParameterizedThreadStartparamThreadFunctionparamThreadFunction;v创立线程对象创立线程对象vhread t=new Threadhread t=new ThreadfunctionEntrancefunctionEntrance;v启动线程启动线程v t.Startt.Startparamparam;/param;
17、/param为传入的参数,可以是任意对象为传入的参数,可以是任意对象学习情景学习情景2.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收v4 4 线程同步技术线程同步技术v多线程应用程序中的的线程启动后,执行的先后顺序是无多线程应用程序中的的线程启动后,执行的先后顺序是无法预知的,通常情况下多个线程会交错执行。但是在多个法预知的,通常情况下多个线程会交错执行。但是在多个线程访问共享数据的情况下,必须对数据的访问进行同步。线程访问共享数据的情况下,必须对数据的访问进行同步。好比有两路车,一路自东向西,一路自南向北运行,在一好比有两路车,一路自东向西,一路自南向北运行,在一个十字路
18、口交汇。在十字路口以外的区域可以看着私有区个十字路口交汇。在十字路口以外的区域可以看着私有区域,而十字路口则是共有区域,需要红绿灯或交警来维护域,而十字路口则是共有区域,需要红绿灯或交警来维护秩序,即确保在同一时刻只能有一路车进入,而另外一路秩序,即确保在同一时刻只能有一路车进入,而另外一路车必须等待,这就是现实生活中的线程同步问题车必须等待,这就是现实生活中的线程同步问题。学习情景学习情景2.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收v下面的例子展示了一个读数据线程和一个写数据线程同时运行的情况:下面的例子展示了一个读数据线程和一个写数据线程同时运行的情况:vpriva
19、te static int a=new int5;private static int a=new int5;vstatic void Mainstatic void Mainstring argsstring argsv v Thread t1=new Thread Thread t1=new Threadnew ThreadStartnew ThreadStartthreadFun1threadFun1;v Thread t2=new Thread Thread t2=new Threadnew ThreadStartnew ThreadStartthreadFun2threadFun2;
20、v t1.Start t1.Start;v t2.Start t2.Start;v vprivate static void threadFun1private static void threadFun1/线程函数线程函数1 1v v while while truetrue学习情景学习情景2.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收v v for for int i=0;i a.Length;i+int i=0;i a.Length;i+/将数组元素全部输出将数组元素全部输出v System.Console.WriteSystem.Console.Writeai+a
21、i+;v System.Console.WriteLine System.Console.WriteLine;v v vprivate static void threadFun2private static void threadFun2/线程函数线程函数2 2v v int flag=0,i;int flag=0,i;v while while truetruev v for for i=0;i a.Length;i+i=0;i a.Length;i+/将数组元素全部改为将数组元素全部改为0 0或或1 1v ai=flag;ai=flag;v flag=flag=0?flag=flag=0
22、?1:0;1:0;v v 学习情景学习情景2.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收v下面采用下面采用MonitorMonitor类来进行线程同步,使数据读、写操作称为原子操类来进行线程同步,使数据读、写操作称为原子操作。即到达这样的目的:在线程作。即到达这样的目的:在线程2 2写数据时,线程写数据时,线程1 1等待,在线程等待,在线程1 1读读数据时,线程数据时,线程2 2等待,使每次输出的结果全部为等待,使每次输出的结果全部为0 0或全部为或全部为1 1。v当调用当调用MonitorMonitor类的类的EnterEnterObject objObject obj
23、方法时方法时,会获取对象会获取对象objobj的独的独占权占权,直到调用直到调用ExitExitObject objObject obj方法时方法时,才会释放对才会释放对objobj的独占权。的独占权。注意调用注意调用EnterEnter方法的次数要和方法的次数要和,调用调用ExitExit方法的次数相等。方法的次数相等。MonitorMonitor类还提供了类还提供了TryEnterTryEnter方法方法,该方法尝试获取该方法尝试获取objobj对象的独占权对象的独占权,当获取当获取独占权失败时独占权失败时,将返回将返回falsefalse。实现代码如下:。实现代码如下:学习情景学习情景2
24、.3 2.3 单个串口设备数据的连续接收单个串口设备数据的连续接收vprivate static int a=new int5;private static int a=new int5;vprivate static object obj=new objectprivate static object obj=new object;vstatic void Mainstatic void Mainstring argsstring argsv v Thread t1=new Thread Thread t1=new Threadnew ThreadStartnew ThreadStartth
25、readFun1threadFun1;v Thread t2=new Thread Thread t2=new Threadnew ThreadStartnew ThreadStartthreadFun2threadFun2;v t1.Start t1.Start;v t2.Start t2.Start;v vprivate static void threadFun1private static void threadFun1v v while while truetruev v Monitor.Enter Monitor.Enterobjobj;/;/线程线程1 1进入临界区活动时,线程进
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精选 精选23 单个串口设备数据的连续接收 23 单个 串口 设备 数据 连续 接收
限制150内