单个串口设备数据的连续接收_第1页
单个串口设备数据的连续接收_第2页
单个串口设备数据的连续接收_第3页
单个串口设备数据的连续接收_第4页
单个串口设备数据的连续接收_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

工控程序设计学习情景2串口设备的数据采集学习情景2.3单个串口设备数据的连续接收2.3.1学习要点

1.知识点:线程的概念,委托的概念和使用方法,线程的创建和启动,工作者线程和用户界面线程之间的数据传递,线程同步技2.技能点:工作者线程的创建,串口数据接收和处理操作的封装2.3.2任务描述

1.在前一个情景中完成了接收和处理单一串口设备数据的工作任务。实际应用中,上位机需要连续地接收和处理下位机发送的数据,而且在等待和接收数据的时候,用户界面不能停止响应。接收数据和响应用户输入这两个工作在宏观上是同时进行的,为了满足该需求,必须采用多线程模式来进行程序设计。

2.该教学情景通过“在工作者线程中接收HSDZC电能综合测试仪的”“HSDZC电能综合测试仪数据接收和处理操作的封装”这两个实施步骤达到连续接收接收单个串口设备(下位机)数据的目的。学习情景2.3单个串口设备数据的连续接收

2.3.3相关知识1多线程技术概述(1)线程的概念Windows是一个抢占式多任务操作系统,在系统内核中提供了对多线程的支持,多线程技术可以让应用程序在一个耗时的操作中能够及时对用户操作进行响应,并且从宏观上达到多个任务“齐头并进”的目的进程是应用程序的一个运行例程,是应用程序的一次动态执行过程。线程是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。每个进程至少需要一个执行线程,由系统自动创建,程序设计者可以根据需要创建其它线程。由于多个线程共享进程中的全局变量和系统资源,所以线程间的切换比较容易,通信也比较方便。学习情景2.3单个串口设备数据的连续接收

(2).NETFramework对多线程的支持.NET平台库提供了Thread类对线程进行处理,该类包含在System.Threading命名空间中,程序中需要包含语句“usingSystem.Threading;”。编程人员可以通过创建一个Thread类的实例来创建一个线程,并通过Thread类提供的方法对线程进行管理。Thread类的常用属性和方法如下表:表2.3.1Thread类的常用属性和方法学习情景2.3单个串口设备数据的连续接收

2委托的概念和使用方法C#中的委托的作用相当于C/C++中的函数指针,函数指针是一个函数的入口地址。必修使用函数指针的场合是:程序员A编写了函数f,该函数中需要执行另外一个参数和返回值已经确定,但名字暂时不能确定函数,所以给函数设置一个函数指针类型的形式参数;当程序员B使用函数f时,定义函数g,并把g的入口地址作为实际参数传递给函数f,这样就可以在f中执行函数g了。线程的启动是使用函数指针的一个典型例子,在启动线程之前,先要给操作系统指明线程启动后执行哪一函数中包含的代码,这时就要把函数的指针传递给创建线程的函数。回调(完成后通知)是使用函数指针的另外一个典型例子。如程序员A编写了负责接收网络数据的函数f1,程序员B编写了负责处理数据的函数f2,那么就可以把f2的函数指针作为参数传递给函数f1,当f1接收数据完毕后,自动调用f2。所以回调的特点是:站在程序员B的角度看,函数由自己编写,但是不由自己调用,且不知道什么时候被调用(因为网络速度有快有慢),函数编写者要做的就是把函数指针传递出去。学习情景2.3单个串口设备数据的连续接收

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

,学习情景2.3单个串口设备数据的连续接收

所以创建线程实例时只需要在Thread类的构造方法里传入一个委托实例即可,这个委托名叫ThreadStart,已经在线程命名空间中定义作了定义:publicdelegatevoidThreadStart();所以创建线程方式如下:ThreadStartfunctionEntrance=newThreadStart(threadFunction);Threadt=newThread(functionEntrance);在委托ThreadStart的构造方法里面传入的是方法名,这个方法可以是静态方法,也可以是某个对象的方法。线程对象创建后,我们就可以调用其Start方法开始线程的执行了。学习情景2.3单个串口设备数据的连续接收

我们可以在主线程里建立线程,也可以在线程里再创建线程,线程启动后会自动执行委托实例代表的方法,线程执行完后会自动销毁并释放其占用的资源。在一个新线程中执行带参数的函数,操作步骤如下:●定义线程函数:privatevoidparamThreadFunction(objectparam){ //函数体}●用ParameterizedThreadStart委托封装线程函数:学习情景2.3单个串口设备数据的连续接收

ParameterizedThreadStartfunctionEntrance=newParameterizedThreadStart(paramThreadFunction);●创建线程对象hreadt=newThread(functionEntrance);●启动线程

t.Start(param);//param为传入的参数,可以是任意对象学习情景2.3单个串口设备数据的连续接收

4线程同步技术多线程应用程序中的的线程启动后,执行的先后顺序是无法预知的,通常情况下多个线程会交错执行。但是在多个线程访问共享数据的情况下,必须对数据的访问进行同步。好比有两路车,一路自东向西,一路自南向北运行,在一个十字路口交汇。在十字路口以外的区域可以看着私有区域,而十字路口则是共有区域,需要红绿灯或交警来维护秩序,即确保在同一时刻只能有一路车进入,而另外一路车必须等待,这就是现实生活中的线程同步问题。学习情景2.3单个串口设备数据的连续接收

下面的例子展示了一个读数据线程和一个写数据线程同时运行的情况:privatestaticint[]a=newint[5];staticvoidMain(string[]args){Threadt1=newThread(newThreadStart(threadFun1));Threadt2=newThread(newThreadStart(threadFun2));t1.Start();t2.Start();}privatestaticvoidthreadFun1()//线程函数1{while(true)学习情景2.3单个串口设备数据的连续接收

{for(inti=0;i<a.Length;i++)//将数组元素全部输出

System.Console.Write(a[i]+"");System.Console.WriteLine();}}privatestaticvoidthreadFun2()//线程函数2{intflag=0,i;while(true){for(i=0;i<a.Length;i++)//将数组元素全部改为0或1

a[i]=flag;flag=flag==0?1:0;}}学习情景2.3单个串口设备数据的连续接收

下面采用Monitor类来进行线程同步,使数据读、写操作称为原子操作。即达到这样的目的:在线程2写数据时,线程1等待,在线程1读数据时,线程2等待,使每次输出的结果全部为0或全部为1。当调用Monitor类的Enter(Objectobj)方法时,会获取对象obj的独占权,直到调用Exit(Objectobj)方法时,才会释放对obj的独占权。注意调用Enter方法的次数要和,调用Exit方法的次数相等。Monitor类还提供了TryEnter方法,该方法尝试获取obj对象的独占权,当获取独占权失败时,将返回false。实现代码如下:

学习情景2.3单个串口设备数据的连续接收

privatestaticint[]a=newint[5];privatestaticobjectobj=newobject();staticvoidMain(string[]args){Threadt1=newThread(newThreadStart(threadFun1));Threadt2=newThread(newThreadStart(threadFun2));t1.Start();t2.Start();}privatestaticvoidthreadFun1(){while(true){Monitor.Enter(obj);//线程1进入临界区活动时,线程2等待

for(inti=0;i<a.Length;i++)System.Console.Write(a[i]+"");System.Console.WriteLine();学习情景2.3单个串口设备数据的连续接收

Monitor.Exit(obj);//线程1出临界区后,线程2才可以进入

}}privatestaticvoidthreadFun2(){intflag=0,i;while(true){Monitor.Enter(obj);//线程2进入临界区活动时,线程1等待

for(i=0;i<a.Length;i++)a[i]=flag;

flag=flag==0?1:0;Monitor.Exit(obj);//线程2出临界区后,线程1才可以进入

}}学习情景2.3单个串口设备数据的连续接收

5工作者线程向用户界面线程传递数据用户界面线程简称UI线程,其主要特点是能响应Windows消息,主要负责接收用户输入和向用户展示程序执行结果。为了及时响应用户的输入,UI线程中不应执行费时的运算,更不能被阻塞。工作者线程一般用于在后台进行费时运算或和慢速设备打交道,这种线程不响应Windows消息。在通信程序中,数据的发送和接收耗费的时间不确定。为了在通信过程中能够响应用户输入,通常在建立一个或多个工作者线程,在后台完成通信任务。工作者线程向运行在UI线程中的用户控件传递数据时,不能直接对对控件的属性和方法进行调用,而要先定义一个委托,再用控件的Invoke方法,切换到UI线程去执行委托所指向的函数,来更新控件显示的内容。在下面的程序中,工作线程每循环完一次,就更新UI线程中的控件属性,向用户报告当前步骤。程序界面和后台代码如下:学习情景2.3单个串口设备数据的连续接收

图2.3.1工作者线程向UI线程传递数据privatevoidbtnRun_Click(objectsender,EventArgse){ThreadStartfunEntrance=newThreadStart(threadFun);Threadt=newThread(funEntrance);t.IsBackground=true;t.Start();}学习情景2.3单个串口设备数据的连续接收

privatedelegatevoidcrossThreadDelegate(inti);//定义委托voidshowValue(inti){lblReport.Text="执行到了第"+i+"步";}privatevoidthreadFun(){crossThreadDelegatecdt=newcrossThreadDelegate(showValue);for(inti=1;i<=5;i++){ //Invoke方法将当前线程切换到UI线程,再执行委托指向的函数

this.Invoke(cdt,i);//this指代当前窗口

Thread.Sleep(1000);//延时,便于看清中间执行过程

}学习情景2.3单个串口设备数据的连续接收

下面的程序在工作者线程的线程函数中直接使用lblReport.Text属性,而没有用Invoke方法:privatevoidthreadFun(){for(inti=1;i<=5;i++){lblReport.Text="执行到了第"+i+"步";Thread.Sleep(1000);}}在运行时会捕获到图所示的异常:学习情景2.3单个串口震设备数据过的连续接激收图2.3造.2后台线程玩向UI线程传递宋数据学习情景2.3单个串口与设备数据侵的连续接戴收使用委阴托和Inv犯oke方法会使糟代码复杂彻度增加,抵在实际应凳用中,可闪以用匿名践委托来简束化代码:pri黄vat给ed疼ele葬gat仰ev枝oid抛cr烘oss辣Thr葛ead报Del氏ega怨te(悠);pri协vat外ev赏oid浮th今rea陶dFu个n(){for申(i设nt缘瑞i=柿1;台i陈<=禾5;烘i++芝){cro滋ssT壳hre翼adD欠ele誉gat察ec阵dt膜=d委ele需gat陪e挥//匿名委屠托(无呀函数名sho清wVa获lue){lbl蔬Rep浙ort沉.Te脾xt卡="执行到捕了第"+罪i+樱"步";};thi吹s.I现nvo蚂ke(灰cdt滑);岛//指向委贵托指向利的函数Thre口ad.S脏leep座(100闸0);}}学习情悄景2.3单个串口亮设备数据虑的连续接采收2.3.旱4任务实施1在工作者扣线程中接途收HSD还ZC电能综合我测试仪的格数据(1)设计手界面在转机性掌能测试中尽需要读取HSD笨ZC电能综合顽测试仪采厚集到的3个数值:按输入功率影、输出功凉率和功率孕因数,以测试电哲机效率,气此时测试皱仪的是选效择测量方吸式1。程序设兵计时的界仍面如图2.3固.3,用3个文本根框分别红显示输丘入功率著、输出北功率和竞功率因愈数,控偶件名称蹄分别为txt够Srg常l、txt迹Scg疾l和txtG夕lys。该界面宗是整个毯钻机性叮能测试泽系统主酬界面的抖一部份评,为了蔽便于观本察和调蛛试,在米界面的全右边以脑十六进恢制形式浸显示收摘到的数赌据帧,蒜程序运揪行时的佣界面如浸图2.3.旦4所示。学习情景2.3单个串口挺设备数据罪的连续接黑收图2.3.么3电机效廉率测试青程序设阻计时界亲面学习情景2.3单个串口征设备数据雄的连续接策收图2.3疗.4电机效我率测试爹程序运茂行时界减面学习情景2.3单个串口额设备数据与的连续接党收pri震vat雪ev价oid翁bt智nSt菌art驱_Cl育ick迫(ob碰jec胀ts株end惩er,糊Ev许ent绕Arg滋se馆){/埋/启动工幸作者线茧程Thr荣ead股Sta抛rt嫂fun恒Ent械ran杆ce义=n追ew拐Thr锹ead件Sta役rt(趣thr匹ead春Fun糟);Thre纹adt悠=n拨ewT行hrea污d(fu智nEnt惯ranc紧e);t.I在sBa气ckg饶rou羽nd灵=t楚rue耳;stop场=f喘alse森;t.S炕tar民t()很;}(3)编写在芽工作者线临程中执行怒的函数点击“迅开始读劣数”按咐钮后时浴,启动赵一个工的作者线领程,线嘉程执行计函数thr宣ead层Fun中的内唉容。thre量adFu妻n在执行时川先打开串叶口,设置邮超时毫秒俯数,并创绝建数据接柱收队列rec迎vBu宪f,然后就嗓进入whi与le循环开裕始不断跌地接收吓串口数痒据并进轮行分析送和显示奋。whi武le循环受第到bool型变量sto棵p的控制,坐可以通过枕设置该变幅量值为true,来结束错线程中的检循环。其记中用到recv钢Buf对象和getB南lock方法,特它们的陡用法在丘前一节弊已经进桨行了详庸细说明挖。学习情泉景2.3单个串烟口设备波数据的挠连续接崖收pri约vat诵ev狱oid森th卡rea株dFu疑n(){Seri斧alPo铺rts床p=味new诱Seri竖alPo龄rt("滋COM1丑",9危600,垄Par连ity.耽None缓,8,田Sto轻pBit内s.On歌e);try{sp.O龙pen(渴);}cat模ch唯(Ex耍cep殖tio虎ne莫x){Mess勾ageB源ox.S变how(巷"打开串口初失败!");retu缸rn;}byt桨ef个irs脉t;byte乞[]b魄Recv铺;//HS袜DZC在工作卖方式1时,数据怨帧长度为46字节学习情景2.3单个串镜口设备喷数据的盗连续接闭收priv脂ate禾void摄thr御eadF滴un(){Ser殊ial酱Por攀ts距p=揉ne译wS守eri汗alP脑ort控("C朴OM1息",谦960甚0,适Par亮ity累.No蹄ne,乏8,喝St赔opB衔its哭.On惰e);try{sp.嫩Ope惯n()伶;}catc沈h(E圈xcep端tion坦ex){Mess陈ageB阔ox.S孝how(党"打开串口落失败!");ret播urn斧;}byte陷fir剥st;byt刃e[]饿bR斑ecv录;//HS假DZC在工作方瞧式1时,数青据帧长债度为46字节学习情景2.3单个串秤口设备蓄数据的顽连续接坟收(4)编写显都示数据到聋控件的show收Data方法在线程函亡数中调用帮了show摩Data方法显抬示数据棕,代码荒如下:pri胀vat戴ed牢ele容gat涨ev贪oid稍cr具oss在Thr尺ead鲜Del莲ega寻te(弱);priv瞧ate裳void弟sho悄wDat迁a(by牢te[]蒸b){flo僚at番v;//跨线程访够问UI控件cros漂sThr揭eadD玩eleg桨ate缎cdt寻=de逃lega夹te/纹/匿名委疾托{if(牢b==饥nul夺l)饭//没有接只收到数担据{txt烧Srg贞l.T具ext草=参"Er清ror菌";txtS哄cgl.黑Text里="每Erro魂r";txt贱Gly谦s.T弯ext狗=阁"Er鬼ror芦";}els哭e{学习情景2.3单个串骂口设备巨数据的澡连续接番收//以十六进爱制形式在txtD懒ata文本框中陆显示数据狗帧的内容txt评Dat已a.T顺ext舅=果CCh暑eck旬.Bi须nar刘yTo雁Hex室Str换ing朵(b)窑;//对浮点乌数进行挽解码(牛用Hex槽ToF毛loa纳t函数),照并分别显泳示在3个文本酒框中v=困HexT跃oFlo胀at(b盛[4+模9*画3],真b[4姨+9脂*3售+1侄],b蜻[4+葡9*胜3+老2])持;txt协Srg丽l.T驴ext响=狐v.T苹oSt春rin吐g("迹0.0殃0")庆;/似/输入功御率(第9个数值)v=伴HexT搭oFlo狼at(b事[4+车12早*3]规,b[仙4+泪12*肉3+胜1],初b[4济+1符2*血3+捞2]);txt泪Scg拌l.T柜ext刘=莲v.T叔oSt拣rin贺g("盒0.0叫0")禁;/习/输出功率滋(第12个数值)v=讯He貌xTo题Flo态at(叛b[4鹅+迎6*炊3]祝,b症[4贸+6波*足3+愁1]缘瑞,b叨[4粥+6纲*央3+课2]芬);txtG洲lys.息Text涉=v劲.ToS脾trin伶g("0缎.00"盛);/娘/功率因鼓数(第6个数值医)}};thi稻s.I往nvo蚂ke(齿cdt叛);}学习情景2.3单个串口袋设备数据隙的连续接舒收(5)编写代蜡码处理“矮停止读数渠”按钮的纲点击事件哥:priv殃ate劲void浙btn播Stop很_Cli却ck(o蕉bjec局tse活nder壳,Ev鸭entA担rgs塔e){stop勿=t占rue;练//设置标乎志,使召线程中贝的循环样自然结厦束}2HS做DZC电能综合日测试仪数还据接收和律处理操作体的封装在前一个奥步骤中已狮经实现了村串口数据剧接收、解漫析和显示量的功能,粪并且在工玩作者线程部中接收和脂处理数据王,在此期禽间前台的UI线程能响麻应用户输葛入。从功手能上看,台已经能够昂满足用户恭需求,但五是从代码涌的组织和抚管理角度庙看,该程剂序还有比筒较大问题尾:负责接权收和处理虫数据的代鹊码和负责新显示的代术码混杂在骂一起,不术能重复使逮用,若增孩加一个同含类设备,篇很多代码斩还要重写俭,而且给张查看和调合试程序也安带来较大甩困难。下麦面用面向泛对象方法父对程序进赔行重新设翼计。学习情悬景2.3单个串口替设备数据世的连续接仅收(1)创建店抽象类CPas谈sive厉COMH省elpe刻rpub耍lic听cl虏ass惊CP叉ass踏ive研COM探Hel讯per{pub首lic栋in文tr朋ead疫Tim絮eOu忽t,r货ecv摧Buf羡Len文gth惭;/爹/读取超适时毫秒皇数,接泻收队列迟大小pro法tec猫ted展CR肺ecv毕Buf馅re灵cvB颜uf;抵//接收队央列pri吩vat誉eb软ool痰st美opF刘lag估;/诵/线程循万环结束蛾标志priv阿ate咐stri李ngp伪ortN红ame;分//串口名虏称pri从vat冠ei元nt株bau蛙dRa拐te,访da刃taB帐its画;/麦/波特率,挺数据位数pri件vat局eS拿top桨Bit碑ss席top舟Bit抵s;阴//停止位priv艺ate跌byte婶[]d顾ataB猾lock奖;//一个完整桃的数据帧学习情眉景2.3单个串口窄设备数据唱的连续接案收publ启icd节eleg哗ate刮void哑Dat绝aRec筒eive皮dHan角dler干();pub辜lic服ev化ent肿Da念taR胶ece池ive炭dHa日ndl沙er袭Dat公aRe仇cei搂ved吩;/宴/数据接算收完毕厦事件//构造方露法publ雷icC搞Pass强iveC威OMHe械lper舱(str青ing咱port萍Name日,in需tba林udRa锄te,薯int伸data兄Bits巴,Sto绕pBi佣ts勾sto微pBi引ts){thi谁s.p灯ort恩Nam苗e=热po盲rtN腰ame禾;thi虫s.b僻aud掏Rat绕e=宁ba年udR冠ate翁;this乐.dat庄aBit膨s=闻data戚Bits兼;thi播s.s民top够Bit狮s=迹st真opB测its宣;thi揪s.r陵ead葛Tim汪eOu滩t=辨50览0;/颠/默认500毫秒读纱取超时this闯.rec骗vBuf钻Leng径th=痕100饰;//默认接收棚队列大小渴为100字节}学习情摘景2.3单个串口陆设备数据晕的连续接抵收publ戴icv揪oid岛star场t()塔//启动线陡程{Thre牲adt趣=n蓝ewT贸hrea炒d(ne挽wTh怪read误Star自t(th胀read次Fun)烤);t.I道sBa岸ckg概rou纯nd认=t静rue角;stop脂Flag伶=f回alse急;t.St六art(域);}publ躁icv订oid剑stop堡()/摇/停止线狮程循环枪,自然诱终止线卡程{sto薄pFl茧ag俱=t狡rue献;}prot晕ecte兽dvi稿rtua芹lby怜te[]估get爽Bloc毕k(Li滋st<b崇yte>鬼li)呆//需要在派亭生类中重存写该方法学习情供景2.3单个串口逗设备数据文的连续接角收pub另lic教by仆te[薯]g南etD宽ata团(){byte嫁[]t节mp=茫nul尚l;Moni肾tor.赠Ente勾r(th涌is);盾//线程同佣步:在垄进行get操作时,祝不准进行set操作if载(da偶taB肤loc煎k!逝=n确ull钢){tmp爸=ne同wby尸te[d妥ataB泼lock乱.Len宣gth]青;dat丹aBl瓦ock狐.Co飘pyT竿o(t疏mp,变0)则;}Mon尝ito状r.E暗xit垮(th邪is)吹;ret雅urn叉tm滴p;}priv俱ate沿void乱set滥Data补(byt动e[]随tmp)Mon施ito驼r.E践nte寇r(t比his隆);俱//线程同油步:在均进行set操作时拖,不准与进行get操作dat剪aBl漫ock帐=汉tmp践;Mon桌ito麻r.E炎xit蹦(th眠is)拦;}priv耕ate热void庙thr颤eadF辞un(){recv跃Buf留=ne喂wCR佳ecvB满uf(r迅ecvB键ufLe牺ngth脱);Ser诱ial江Por卧ts堪p=语ne轿wS很eri烘alP反ort先(po窜rtN爬ame朗,b采aud狠Rat贫e,传Par趋ity民.No卸ne,晓da体taB漂its疲,sto异pBi若ts)牺;try{if声(sp梦.Is栽Ope桃n)状sp.激Clo呜se(铸);sp.O犁pen(摄);}学习情景2.3单个串楚口设备食数据的裁连续接酬收cat造ch{retu罩rn;}byte暗fir扔st;byte狮[]b突Recv闲;whil扇e(!渣stop贺Flag迟){try{sp.R弃eadT插imeo序ut=犯rea号dTim比eOut舞;firs钩t=战(byt烦e)sp霞.Rea业dByt解e();if度(sp远.By捏tes索ToR述ead眼+船1>饺re舍cvB红uf.倦max脑Len督gth孟)/巷/堆积数落据太多学习情嚷景2.3单个串己口设备我数据的值连续接盯收(2)派生出掘具体类CHS险DZC在CPa续ssi贱veC馒OMH女elp层er类中实现抢了串口打悲开、关闭惧、线程创面建、数据体接收等基语础操作,拉其中有一落个虚方法getB久lock,需要卷在派生磁类中根雕据具体习情况实惩现,下有面实现花专门采迫集HSD吃ZC电能综合遵测试仪数掠据的类CHS毙DZC:clas逢sCH秀SDZC仅:C预Pass莫iveC由OMHe低lper{/扔/构造方法publ讨icC兼HSDZ较C(st不ring杠por液tNam忘e,i义ntb主audR逗ate,茶int护dat陶aBit虎s,S犁topB沙its萍stop僻Bits鼻):ba盆se(p歪ortN忧ame,洁bau届dRat参e,d订ataB瘦its,输sto国pBit痕s){}//覆盖基普类的getB骨lock方法,专拢门针对HSDZ狱C获取数据学习情景2.3单个串口妹设备数据柄的连续接币收pro助tec鼠ted炕ov益err致ide越by蛋te[匪]g竭etB组loc秩k(L悔ist岔<by圆te>候li爷){byte乳[]b弦=n遣ull;if(梨li.C接ount完<4招6)r殊etur除nb;缩慧//总长度狸不足46字节//查找最后朋一个完整寺的数据帧int集p=窝li.C问ount恩;//从右向遥左查找怒起始标决志“FFFF跃FFFF危H”,获取拍下标whil像e((复p=医li.L滑astI答ndex闭Of(0冷xFF,输p-禁1))绢!=港-1)if(及li.C贴ount粱>=零p+田46)if(偷li[p绒+1净]==干0xF傻F&&松li[阵p+两2]=盖=0x昼FF&糊&li恒[p+陷3]锄==0陡xFF)brea改k;悟//已经找饭到,接岛收循环if祖(p强!=客-1)红//移p为数据稀帧的起摧始位置{学习情郑景2.3单个串口冠设备数据微的连续接民收b=思ne络wb寄yte移[46颠];li.液Cop险yTo喝(p,冲b,园0,违46理);蝇//拷贝数据小帧到b数组}ret存urn视b;统//返回找酷到的完侵整数据众帧}(3)在UI模块中翁使用CHSD债ZC类实现妨数据采铅集在前面禾所作工枪作的基犯础上编眉写UI模块就非从常轻松了干。在UI模块中牢不用关肤心串口贝通信、而线程操械作等复荡杂问题选,只需园要创建CHS除DZC对象并梅启动它扫即可,伶当有完叮整的数哄据帧收毛到时,四会引发Data区Rece斥ived事件,并掉自动调用hsd系zc_顾Dat牵aRe揉cei树ved方法处捡理数据强。不过塑这里需旺要注意亡的是,hsd聚zc_捧Dat拴aRe区cei担ved是个回调井函数,虽赠然包含在Form贯6类中,臂但是在妥工作者默线程中森进行调决用,需史要跨线冠程操作UI线程中的骂文本框等那控件,因县此把操作古控件的代能码封装到孝一个匿名备委托中,倾并用this叠.Inv双oke进行调用乓。学习情景2.3单个串口悉设备数据灿的连续接稍收2.3.欠5考核要棒点学习情景2.3单个串口泽设备数据圣的连续接脚收2.3盛.6能力拓叉展1.什么是诵委托,症委托在准什么场执合使用稿,如何碌使用委浴托?2.在什么情原况下需要存使用多线易程技术,挤使用Thre杰ad类要引入雷什么命名智空间,如善何创建和走启动线程满?3.如何将惯工作者锈线程中违的数据努显示在UI线程的痒控件中疼?4.安照说置明书里诵规定的哲数据格沃式,设萌计一个HSD呈ZC电能综顽合测试模仪的模原拟程序绳(包含挪两种测耻量方式狂)。5.在图2.3.洽3的窗体上距增加一个Tim柴er控件,抛并结合1.1坦.4小节的任员务二,将坦采集到的某输入功率悬、输出功代率、功率汤因数值存狗储到Par橡ams集合中(翁不立即显朗示在文本赔框中),秃每隔1秒钟用Par栋ams集合中的您值刷新文储本框的内化容9、静夜四堵无邻,荒五居旧业贫挂。。4月-2卡34月-2页3Frid贪ay,汇Apri尾l28阅,20绘2310、雨中黄堆叶树,灯繁下白头人必。。05:音41:臣0705:4酿1:0705:痛414/2裕8/2坛023枪5:致41:貌07蠢AM11、以我独胳沈久,愧争君相见频赛。。4月-描2305:葬41:弯0705:宜41Apr敬-2328-A朱pr-2倾312、故人江宾海别,几葵度隔山川贫。。05:4守1:0705:4呀1:0705:残41Frid烘ay,亲Apri捉l28演,20蓝2313、乍见翻规疑梦,相惭悲各问年迁。。4月-2话34月-2凑305:素41:延0705:4晋1:07Apri愁l28右,20逝2314、他乡生眉白发,旧士国见青山档。。28四花月20害235:4斤1:0梅7上售午05:新41:童074月-2洲315、比不了球得就不比耀,得不到淹的就不要涌。。。四月2姥35:41逢上午4月-2庄305:4气1Apri菌l28氏,20表2316、行动讽出成果扫,工作颈出财富鞠。。202利3/4杏/28叛5:额41:稻0805:4第1:0828A碎pril柿202菠317、做前,狸能够环视硬四周;做过时,你只骑能或者最让好沿着以铺脚为起点我的射线向婆前。。5:4堵1:0爱8上咽午5:41百上午05:寨41:哀084月-豪239、没有番失败,篮只有暂索时停止疾成功!老。4月-血234月-2贞3Frid养ay,少Apri菊l28下,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论