单个串口设备数据的连续接收

上传人:宝路 文档编号:48317726 上传时间:2018-07-13 格式:PPT 页数:42 大小:887.93KB
返回 下载 相关 举报
单个串口设备数据的连续接收_第1页
第1页 / 共42页
单个串口设备数据的连续接收_第2页
第2页 / 共42页
单个串口设备数据的连续接收_第3页
第3页 / 共42页
单个串口设备数据的连续接收_第4页
第4页 / 共42页
单个串口设备数据的连续接收_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《单个串口设备数据的连续接收》由会员分享,可在线阅读,更多相关《单个串口设备数据的连续接收(42页珍藏版)》请在金锄头文库上搜索。

1、工控程序设计学习情景2 串口设备的数据采集3工控程序设计学习情景2.3 单个串口设备数据的连续接收 2.3.1 学习要点1.知识点:线程的概念,委托的概念和使用方法,线程的创建和启动,工 作者线程和用户界面线程之间的数据传递,线程同步技2.技能点:工作者线程的创建,串口数据接收和处理操作的封装2.3.2 任务描述1.在前一个情景中完成了接收和处理单一串口设备数据的工作任务。实际 应用中,上位机需要连续地接收和处理下位机发送的数据,而且在等待 和接收数据的时候,用户界面不能停止响应。接收数据和响应用户输入 这两个工作在宏观上是同时进行的,为了满足该需求,必须采用多线程 模式来进行程序设计。2.该

2、教学情景通过“在工作者线程中接收HSDZC电能综合测试仪的 ”“HSDZC电能综合测试仪数据接收和处理操作的封装”这两个实施步骤 达到连续接收接收单个串口设备(下位机)数据的目的。4工控程序设计学习情景2.3 单个串口设备数据的连续接收v 2.3.3 相关知识 v 1 多线程技术概述 v (1)线程的概念 v Windows是一个抢占式多任务操作系统,在系统内核中提供了对多线 程的支持,多线程技术可以让应用程序在一个耗时的操作中能够及时 对用户操作进行响应,并且从宏观上达到多个任务“齐头并进”的目 的 v 进程是应用程序的一个运行例程,是应用程序的一次动态执行过程。 线程是被系统独立调度和分派

3、的基本单位,线程自己不拥有系统资源 ,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。每 个进程至少需要一个执行线程,由系统自动创建,程序设计者可以根 据需要创建其它线程。由于多个线程共享进程中的全局变量和系统资 源,所以线程间的切换比较容易,通信也比较方便。5工控程序设计学习情景2.3 单个串口设备数据的连续接收v (2).NET Framework对多线程的支持 v .NET平台库提供了Thread类对线程进行处理,该类包含在 System.Threading命名空间中,程序中需要包含语句“using System.Threading;”。编程人员可以通过创建一个Thread类的实

4、例 来创建一个线程,并通过Thread类提供的方法对线程进行管理。 Thread类的常用属性和方法如下表: v 表2.3.1 Thread类的常用属性和方法6工控程序设计学习情景2.3 单个串口设备数据的连续接收v 2 委托的概念和使用方法 v C#中的委托的作用相当于C/C+中的函数指针,函数指针是一个函数 的入口地址。必修使用函数指针的场合是:程序员A编写了函数f,该 函数中需要执行另外一个参数和返回值已经确定,但名字暂时不能确 定函数,所以给函数设置一个函数指针类型的形式参数;当程序员B 使用函数f时,定义函数g,并把g的入口地址作为实际参数传递给函 数f,这样就可以在f中执行函数g了。

5、 v 线程的启动是使用函数指针的一个典型例子,在启动线程之前,先要 给操作系统指明线程启动后执行哪一函数中包含的代码,这时就要把 函数的指针传递给创建线程的函数。 v 回调(完成后通知)是使用函数指针的另外一个典型例子。如程序员A 编写了负责接收网络数据的函数f1,程序员B编写了负责处理数据的 函数f2,那么就可以把f2的函数指针作为参数传递给函数f1,当f1接 收数据完毕后,自动调用f2。所以回调的特点是:站在程序员B的角 度看,函数由自己编写,但是不由自己调用,且不知道什么时候被调 用(因为网络速度有快有慢),函数编写者要做的就是把函数指针传 递出去。7工控程序设计学习情景2.3 单个串口

6、设备数据的连续接收v 定义委托的关键字是delegate,它是从System.Delegate类派生出来 的。例如: v delegate int SomeDelegate(int p1,string p2); v / int p1和string p2是被引用函数的参数类型和名称。其中参数类 型和参数的个数必须和被引用函数的类型与个数一致。v 3 创建和启动线程 v 一个线程必须和一个方法的入口(委托)关联起来,线程启动后,自 动从该入口进入,执行函数体中包含的内容。 C#应用程序启动时,自动创建主线程,并进入Main方法开始执行,其它 线程需要在程序里自己定义和启动。由于委托可以代表一个方法

7、的入口 ,8工控程序设计学习情景2.3 单个串口设备数据的连续接收所以创建线程实例时只需要在Thread类的构造方法里传入一个委托实 例即可,这个委托名叫ThreadStart,已经在线程命名空间中定义作 了定义: v public delegate void ThreadStart(); v 所以创建线程方式如下: v ThreadStart functionEntrance = new ThreadStart(threadFunction); v Thread t = new Thread(functionEntrance); v 在委托ThreadStart的构造方法里面传入的是方法名,

8、这个方法可以 是静态方法,也可以是某个对象的方法。线程对象创建后,我们就可 以调用其Start方法开始线程的执行了。9工控程序设计学习情景2.3 单个串口设备数据的连续接收我们可以在主线程里建立线程,也可以在线程里再创建线程,线程启 动后会自动执行委托实例代表的方法,线程执行完后会自动销毁并释 放其占用的资源。在一个新线程中执行带参数的函数,操作步骤如下:定义线程函数:private void paramThreadFunction(object param) /函数体 用ParameterizedThreadStart委托封装线程函数:10工控程序设计学习情景2.3 单个串口设备数据的连续接

9、收v ParameterizedThreadStart functionEntrance = v new ParameterizedThreadStart(paramThreadFunction); v 创建线程对象 v hread t = new Thread(functionEntrance); v 启动线程 v t.Start(param); /param为传入的参数,可以是任意对象11工控程序设计学习情景2.3 单个串口设备数据的连续接收v 4 线程同步技术 v 多线程应用程序中的的线程启动后,执行的先后顺序是无 法预知的,通常情况下多个线程会交错执行。但是在多个 线程访问共享数据的情

10、况下,必须对数据的访问进行同步 。好比有两路车,一路自东向西,一路自南向北运行,在 一个十字路口交汇。在十字路口以外的区域可以看着私有 区域,而十字路口则是共有区域,需要红绿灯或交警来维 护秩序,即确保在同一时刻只能有一路车进入,而另外一路车必须等待,这就是现实生活中的线程同步问题。12工控程序设计学习情景2.3 单个串口设备数据的连续接收v 下面的例子展示了一个读数据线程和一个写数据线程同时运行的情况 : v private static int a = new int5; v static void Main(string args) v v Thread t1 = new Thread(

11、new ThreadStart(threadFun1); v Thread t2 = new Thread(new ThreadStart(threadFun2); v t1.Start(); v t2.Start(); v v private static void threadFun1() /线程函数1 v v while (true)13工控程序设计学习情景2.3 单个串口设备数据的连续接收v v for (int i = 0; i li) /需要在 派生类中重写该方法35工控程序设计学习情景2.3 单个串口设备数据的连续接收v public byte getData() v v byt

12、e tmp = null; v Monitor.Enter(this); /线程同步:在进行get操作时,不准进 行set操作 v if (dataBlock != null) v v tmp = new bytedataBlock.Length; v dataBlock.CopyTo(tmp, 0); v v Monitor.Exit(this); v return tmp; v v private void setData(byte tmp)36工控程序设计v Monitor.Enter(this); /线程同步:在进行set操作时,不准进行 get操作 v dataBlock = tmp

13、; v Monitor.Exit(this); v v private void threadFun() v v recvBuf = new CRecvBuf(recvBufLength); v SerialPort sp = new SerialPort(portName, baudRate, Parity.None, dataBits, v stopBits); v try v v if (sp.IsOpen) sp.Close(); v sp.Open(); v 37工控程序设计学习情景2.3 单个串口设备数据的连续接收v catch v v return; v v byte first

14、; v byte bRecv; v while (!stopFlag) v v try v v sp.ReadTimeout = readTimeOut; v first = (byte)sp.ReadByte(); v if (sp.BytesToRead + 1 recvBuf.maxLength) /堆积数 据太多 v 38工控程序设计学习情景2.3 单个串口设备数据的连续接收v (2)派生出具体类CHSDZC v 在CPassiveCOMHelper类中实现了串口打开、关闭、线程创建、数据 接收等基础操作,其中有一个虚方法getBlock,需要在派生类中根据 具体情况实现,下面实现专门

15、采集HSDZC电能综合测试仪数据的类 CHSDZC: v class CHSDZC : CPassiveCOMHelper v /构造方法 v public CHSDZC(string portName, int baudRate, int dataBits, StopBits stopBits) v : base(portName, baudRate, dataBits, stopBits) v v v /覆盖基类的getBlock方法,专门针对HSDZC获取数据 39工控程序设计学习情景2.3 单个串口设备数据的连续接收v protected override byte getBlock(List li) v v byte b = null; v if (li.Count = p + 46) v if (lip + 1 = 0xFF /已经找到,接收循环 v if (p != -1) /p为数据帧的起始位置 v 40工控程

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号