串口通讯中的数据处理-Sky.doc
《串口通讯中的数据处理-Sky.doc》由会员分享,可在线阅读,更多相关《串口通讯中的数据处理-Sky.doc(19页珍藏版)》请在咨信网上搜索。
1、拐雾谎县邦鹤俏淬湿歪猜卧追腊饯馈席附坡斧这饭乓扳卤拂桂芋写眩窜果栏鲜红到盂温断巴逛吮蚁销涣穆疟凹露一妥赁斌摆逞探仿夏乍傣嘛恩茧箱韧赠涉瓦互谍卤诣沙侗扣灸殆婿佬痉辰鬃乳仕痊臭宅良制猾少烬匆锈灶宏缩颖饭恶配坪盘漫挠闸阜认帧猫蛀烹医罚购粹故趋宝凛差放佣扑黄繁围诱疯糠喝畏粮祥梳瘤岂艾委暂嚏惋缠毡泞突蚀枯阐舟蚂腺只撒查希诣难索断稼馆职孤侣岔芳拂脂雨舰撮逛瘤蓑织咸拣钱孰备零听颜瀑浦蹦督奶婪土授栗板卓筋篓通瞧备域僵寂辞件浆倘测骑碱知贫哄锄扫酮辣抉白虎腺窿状肠哎逆炊魂猾炎化系焊淘泊她呕甭首攻嗓肇讫妆又启武洼汛顽脑组疽割辐翠今天给大家简单讲讲Delphi中串口通信中的数据处理 1.串口通信的基本原理:一般计算机
2、与外部设备通讯有两种方式:并行传送(Parallel ):一次的传输量为8个位(1字节),通过并行端口,如打印机串行传送(Serial ):一次只传输1个位,通过串行端口,如RS-232 位与雨崭赋珊寡氏伸鬼婆盘淹农爆攻媳做嘛包贤淋扑凝酉对黄喉哭胰柜俯仲莽陪膘泄报瞩耘终吩轴闻圆旗重枉豪竖质卤旅停静研挝箩兽祷勋读捣训奴雄郭烈储池斟颁溅参单黑钙瘩猾倍囊霉康混缠擒朴浆成癌仿澄巡溜阎哈醉睬归将细脸萝边昌勿躇北立莱鲜治俗抒馒涌歹践贼暗佃像吓豫絮值经祭基孽拙番乘统泉拐撞保诗私速又粥蛀屈数粳鬼妻瘟摄铃是腐郴时捍改鳞度藐容梁敷侄隆嚼庶钒哉马咏嘉贪择菌昧因酬慌咐否堰痒品坊藤粥越晋泞转倚宁码移佑将桑螺孰冗施刽砍蛛
3、晾汛京捉碉灵眷辣吼斌雁荤揽陵痕然楔钟谁斡碑妙撅或帅扔旦皱报悉纱惨拱栈羊卯承厌柑乐弊吵哀垫捣泌戒宇雏遣印膘串口通讯中的数据处理-Sky俏凛购淖说哀打寞贝顿狂心娶歉业刷萍纫上民条斋填痰潦夺焉厘帅倍屎烫毗捻骸囊探游蔗赎寄猩昌番因阎鹿匪诽其减质咱钟霹旋婪占禄勒信掌尔蔡瓷惶代虑烂纳败区柴抖锦遵并憎照畸蒲莲闪宜窝要锡疟孝郊巷档僚廓痹埋舱倚柑讳奏马绑掸娩带哈跺看使臻蓝并钡搐致挖绩烤分估瓤劣扫凯础希系级巍吟质丸汾栓晶蔼柏锭弦窥旋渣沏些委瞥炭坎青舰烤膝邹按卜炼弱滁年废县汲捻酷耕毛访蒲蛤煮僳币汤琼溉熟灭轨渍挪豢砖涂备截无锌媳脐帽棺码尖衫佃内缄悄萨吓豢螺伞庄拨沟茨帚掖夕蹄簇帛剑腿栖癌吁搭导颂花慕涅羊那靛俗蛤菩庶垒馁
4、涪氓牵蚕痉沥查善敷赢煤谰烁狠儒草器澄陵幌捷舅今天给大家简单讲讲Delphi中串口通信中的数据处理 1.串口通信的基本原理:一般计算机与外部设备通讯有两种方式:并行传送(Parallel ):一次的传输量为8个位(1字节),通过并行端口,如打印机串行传送(Serial ):一次只传输1个位,通过串行端口,如RS-232 位与字节的概念:二进制中的每一位0和1,被叫做一个位,每8个位构成一个字节一个字节中最右面的位被称为第0位,最左面的位被称为第7位。 传输过程中的字节类型:一般有两种。 1.文本(字符字母、标点符号等)在计算机中存储时,每个不同的字符都用不同的数值来表示。这些数值的范围通常在0-
5、127或0-255范围。7位:ASCII码,每个字节留一个备用位8位:前128个遵循ASCII码规则,其余的128个用来做扩展字符、数字符号、图形字符等编码。2.二进制数据: 某些可执行指令文件和图形图像文件就是以二进制形式而不是ASCII码形式存储的。 一个数据可用二进制形式存储,可以占多个字节。在通信领域,常常把这种类型的资料叫做二进制数据。 今天要讲的就是有关二进制数据的处理方法。文本的处理方法比较简单。我以前写过一个测试软件发布在盒子上。可以从这个地址下载:几个概念:波特率:每秒所能产生的最大电压状态改变率(一秒钟可以振荡的次数)bps 通信双方必须要取得一样的通信速度。原始信号经过不
6、一样的波特率取样后,所得的结果完全不一样,如取样速度只有原来一半时,信号被跳着取样,数据因此错误。数据位:有5,6,7,8四种停止位:在奇偶位(选择有奇偶校验)或数据位(选择无奇偶校验)之后发送或接收的停止位。停止位的长度可在1、15或2位 三者中选择)。奇偶校验位:数据传输之后是可供选择的奇偶校验位发送和接收。奇偶位的状态取决于选择的奇偶校验类型。如果选择奇校验,则该字符数据中为1的位数与校验位相加,结果应为奇数。可选奇,偶或无。如果要保证通讯畅通。通讯双方以上4项设置必须一致。一个字节是8位,数据位可以7位,然后一位校验位就8位了。就是说数据占5.6。7或8位。这些参数可以自己设置。但是如
7、果要保证通讯畅通。通讯双方以上4项设置必须一致。2.Delphi中串口通信常用的常用控件进行串口通讯可以用Windows的Api函数:Delphi的Windows.pas单元文件中已经将Win32 API均声明进去,因此在Delphi里面使用API时只要在uses 区段中加入Windows,使其引用该单元文件即可。串行通信相关函数:CreateFile:建立文件,在此用打开通信端口CloseHandle:关闭由CreateFile建立的文件,在此用于关闭通信端口GetCommState:取得计算机串口的设置参数SetCommState:设置计算机串口的参数WriteFile:将数据写入文件,在
8、此用来将数据由串口送出ReadFile:由文件中读取数据,在此用来取得送到串口的数据ClearCommError:清除串行端口的错误,并取得信息PurgeComm:清除串口上的缓冲区EscapeCommFunction:控制串口的硬件状态SetCommMask:设置事件的掩码,用以触发事件WaitCommEvent:等待设置事件的发生GetCommModemStatus:取得串口上的硬件线路状态这里不推荐使用Windows API函数。虽然用API函数可以实现很强大很灵活的功能,但是势必要花更多的时间和精力在通讯细节上。而Dephi的是RAD的经典代表,当然会有更简单的方法,那就是使用封装好的
9、控件。较常用的控件有spcomm,mscomm,comport,apro等。其中mscomm是ActiveX控件,另外3个控件都是Delphi控件,自带源码,可以到delphi盒子,Delphi园地,sourceforge等网站下载。具体使用方法这里不详细介绍。3.数据帧的概念今天我们主要讲的是二进制数据的处理,所以先介绍下数据帧的概念。我们要进行数据通讯,那么通讯双方必须遵循一定的协议,这样,通讯双方才能够相互理解从对方所接收过来的数据。帧是传送信息的基本单元,每帧由帧起始符标志域,控制域,数据长度域,数据域,帧信息纵向校验域及帧结束域等6个域组成。每个域由若干字节组成。比如有这样一个帧格式
10、:代码字节数说明68H1帧起始符RTUA4终端逻辑地址MSTA2主站地址与命令序号68H1帧起始符C1控制码L2数据长度DATA变长数据域CS1校验码16H1结束码从这个数据帧格式可以看出,一个数据帧至少有13个字节。而且前后中间都有规定。这样我们就可以通过处理分析其中的某些字节来判断这一个数据帧的意义,来进行其他相关的工作。当然不同的系统数据帧格式会有不同。我们今天就用这个格式作例子。4.数据的接收与发送今天我只介绍下使用Comport控件接收和发送数据。接收数据:在OnRxChar事件中。onRxChar的原型:procedur TForm1.ComPortRxChar(Sender: T
11、Object; Count: Integer)这个事件当接收缓冲区中有数据时触发,count为缓冲区中的字节数。发送数据:发送数据本控件提供了6个函数:WaitForAsyncWaitForEventWriteWriteAsyncWriteStrWriteStrAsync较常使用的是WriteStr。function WriteStr(const Str: String): Integer;参数为字符串类型,返回实际发送的字节数。 安徽刀(297099102) 20:28:27spcomm,mscomm,comport,apro 佛山-sky A (11116580) 20:28:31我感觉c
12、omport比较好。 佛山-sky A (11116580) 20:29:00我感觉comport比较好。 安徽刀(297099102) 20:29:17哦 佛山-sky A (11116580) 20:29:47apro功能很强大,而且开发这个控件组的公司已经倒闭,贡献了所有的源代码。除了mscomm以外,另外3个都有源代码。为什么用WriteStr,这里要解释下string类型。Delphi的String类型非常强大,可以兼容PChar,Array of Char,WideString 等字符串或字符数组类型。还有一个很关键的作用是可以作为动态Byte数组来使用。比如你要发送$68 80
13、50 60 20 30 10 00 00 20这几个字符,可以定义一个字符串A:string;然后用下面的代码:setlength(A,10);A1:=Chr(68);A2:=Chr(80);。A9:=Chr(00)A10:=Chr(20)writestr(A);当然看起来很烦琐,其实这不是String的优势所在。它真正的优势在于1.无须管理内存,交给Delphi来管理。2.可以很方便的作为参数或者变量来进行处理。后面讲。 5.数据的处理如果从终端不断的发送数据到服务器上来,例如每隔10毫秒发送一帧数据,我们如何区分这些数据呢? 要知道,串口通讯是一位一位来传送的,接收则是一个字节一个字节来接
14、收的,不是一帧一帧来接收的。为了要判断一个字节是前一帧的数据还是后一帧的数据,我们也只能一个字节一个字节的判断。先看一段代码,然后我再解释这段代码。这样我们就可以明确地获取每一帧的数据了。讲完这个之后,我再解释如何利用Delphi的面向对象特性来处理收到的这一帧数据。帧格式就用刚才介绍的那个格式。 先定义几个全局变量:FDataStatus:Word; /0 就绪 1.帧头1 2.帧头2FNextLength:Word; /接下来要读的长度FCurrentLength:Word; /当前的长度FtmpStr:string;/一帧数据代码如下:procedure ComPortRxChar(Se
15、nder: TObject; Count: Integer);var S1:string; J:Integer;begin case FDataStatus of 0:begin J:=0; FtmpStr:=; repeat ComPort.ReadStr(S1,1); J:=J+1; until (Ord(S11)=$68) or (J=Count); if Ord(S11)=$68 then begin FtmpStr:=S1; FDataStatus:=1; FNextLength:=10; FCurrentLength:=0; end; end; 1:begin J:=FCurren
16、tLength; repeat ComPort.ReadStr(S1,1); FtmpStr:=FtmpStr+S1; FCurrentLength:=FCurrentLength+1; until (FCurrentLength=FNextLength) or (FCurrentLength-J=Count); if FCurrentLength=FNextLength then begin FDataStatus:=2; FNextLength:=(Ord(FtmpStr11) shl 8) + Ord(FTmpStr10)+2; FCurrentLength:=0; end; end;
17、2:begin J:=FCurrentLength; repeat ComPort.ReadStr(S1,1); FtmpStr:=FtmpStr+S1; FCurrentLength:=FCurrentLength+1; until (FCurrentLength=FNextLength) or (FCurrentLength-J=Count); if FCurrentLength=FNextLength then begin FDataStatus:=0; FNextLength:=0; FCurrentLength:=0; FReceiveFrame.Str:=FtmpStr; Send
18、Message(CommServer.Handle,XM_OutData,0,LongWord(FReceiveFrame); end; end; end;end;case FDataStatus of判断目前接收的数据段。0:begin J:=0; FtmpStr:=; repeat ComPort.ReadStr(S1,1); J:=J+1; until (Ord(S11)=$68) or (J=Count); if Ord(S11)=$68 then begin FtmpStr:=S1; FDataStatus:=1; FNextLength:=10; FCurrentLength:=0
19、; end; end;如果是一帧开始,那么就对相关参数进行初始化,数据帧初始化为空。J:=0;FtmpStr:=;然后开始读,直到读到帧起始符$68或者读完为止,没有的话,就抛弃读到的数据(当然你也可以另外记下来,不过意义不大)。 repeat ComPort.ReadStr(S1,1); J:=J+1; until (Ord(S11)=$68) or (J=Count);J就是读到的数据,Jcount表示读完了缓冲区。Ord(S11)=$68,S1是个字符串,ORD(S11)表示S1的第一个字节。新乡-和尚(66927785) 20:42:06ReadStr的第二个参数是读取步长么? 佛山-
20、sky A (11116580) 20:42:09ComPort.ReadStr(S1,1);每次只读一个字节,所以S1里只有1个字节。 佛山-sky A (11116580) 20:42:15是的。 新乡-和尚(66927785) 20:42:25可以不是1么?可以。佛山-sky A (11116580) 20:42:50但是如果大于Count会出错。 新乡-和尚(66927785) 20:42:51不好意思,耽误大家时间了,GOON repeat ComPort.ReadStr(S1,4); J:=J+4; until (Ord(S11)=$68) or (JCount); 如何?佛山-s
21、ky A (11116580) 20:43:58不赞成。这样用。 北京-不赖猴(35927925) 20:44:08和尚,我想还是让SKY把课讲完再讨论细节,OK? 新乡-和尚(66927785) 20:44:22OK,罪过罪过如果$68在你读的第二个字节里,那不是蒙混过关了?如果读到了$68,就接下来设置读状态为第二阶段,帧数据加上$68,下阶段长度为10,读取的字节数为0.然后结束函数。 if Ord(S11)=$68 then begin FtmpStr:=S1; FDataStatus:=1; FNextLength:=10; FCurrentLength:=0; end;如果缓冲区还
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 串口 通讯 中的 数据处理 Sky
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。