PC间通信,stm32串口接收数据端接受的消息全是00这种情况是什么原因导致的呢?

在Windows平台下利用VB实现电脑与三菱Q00PLC的串行通信-机电之家网PLC技术网
您好,欢迎来到机电之家网! [
国家企业信息化
电子商务示范平台
当前位置: && &&
在Windows平台下利用VB实现电脑与三菱Q00PLC的串行通信
添加:不详
摘要:本文分析了WINOOWs环境下串行通信的编程技术,介绍了在WINOOWs环境下用VB6.0语言编写串行通信程序,实现了PC机与三菱&Q00PLC&之间的串行通信,并提出了在实际应用中提高串行通信性能的方法。关键词:VB;Win32API函数;串行通信;Q00PLC 一&概述&&&&在工业控制中,串口是常用的计算机与外部串行设备之间的数据传输通道。由于串行通信结构简单、可靠性强、实现及使用成本低、通讯标准统一,因此在测控系统和工程中应用十分广泛。目前WINOOWs在工业生产监控管理系统中已成为主流平台&,WINOOWs环境下的上、下位机之间的串行通信是设计与开发监控管理系统和集散控制系统的重要组成部分。&&&&Microsoft公司的VB++6.0是一种高级编程语言,它提供的串列通信控件封装了封装了Win32API中的标准通信函数,可以让开发者方便开发串列通信上位机程序。&&&&&PLC是现在控制领域不可缺少的部分,已经非常普及,如何简便的与PLC交互已经成为众多厂商新的竞争战场。由此产生了人机界面、组态软件等产品。这些产品的产生大大简化了对PLC的控制,操作,使用更方便。但也有共同的缺点:价格过高和开放性较差。VB作为“原始"的编程语言在这两方面无疑有着明显的优势。&二&串行通信&&&&串行通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。&&&&&2.1&串行通信的分类&&&&&串行通信可以分为同步通信和异步通信两类。同步通信是按照软件识别同步字符来实现数据的发送和接收,异步通信是一种利用字符的再同步技术的通信方式。&&&&&2.1.1&同步通信&&&&&同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。&&&&&它们均由同步字符、数据字符和校验字符(CRC)组成。其中同步字符位于帧开头,用于确认数据字符的开始。数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。&2.1.2&&异步通信&&&&&异步通信中,在异步通行中有两个比较重要的指标:字符帧格式和波特率。数据通常以字符或者字节为单位组成字符帧传送。字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。&&&&&接收端检测到传输线上发送过来的低电平逻辑"0"(即字符帧起始位)时,确定发送端已开始发送数据,每当接收端收到字符帧中的停止位时,就知道一帧字符已经发送完毕。&&&&2.2&几种流行的串行通信协议&&&&RS-232、RS-422和RS-485都是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,RS-232在1962年发布,后来陆续有不少改进版本,其中最常用的是RS-232-C版。&&&&&目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通信中增加通信距离的单端标准。RS-232采取不平衡传输方式,即所谓单端通信。标准规定,RS-232的传送距离要求可达50英尺(约15米),最高速率为20kbps。图1&RS232端口的硬件握手和连接方式&&&&RS232的通讯信号电平为正负5~15V,这不同于数字电路的0~3V或0~5V,所以要以RS232的方式进行通讯,源信号不匹配时需要进行电压转换。&&&&当进行数据传送时,只用一根数据线且只能进行单向传输的方式,称为单工方式;&当进行数据传送时,只用一根数据线利用不同时段进行双向传输的方式,称为半双工方式;当进行数据传送时,利用两根数据线同时进行发送和接收的方式,称为全双工方式。&&&&由于RS-232存在传输距离有限等不足,于是RS-422诞生了。RS-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了一种平衡通信接口,将传输速率提高到10Mbps,传输距离延长到4000英尺(约1219米),并允许在一条平衡总线上连接最多10个接收器。当然,RS-422也有缺陷:&因为其平衡双绞线的长度与传输速率成反比,所以在100kbps速率以内,传输距离才可能达到最大值,也就是说,只有在很短的距离下才能获得最高传输速率。一般在100米长的双绞线上所能获得的最大传输速率仅为1Mbps。另外有一点必须指出,在RS-422通信中,只有一个主设备(Master),其余为从设备(Salve),从设备之间不能进行通信,所以RS-422支持的是点对多点的双向通信。&&&&&为扩展应用范围,RS于1983年在RS-422基础上制定了RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/RS-485-A标准。&&&&&由于RS-485是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿,如都采用平衡传输方式、都需要在传输线上接终接电阻、最大传输距离约为1219米、最大传输速率为10Mbps等。但是,RS-485可以采用二线与四线方式,采用二线制时可实现真正的多点双向通信,而采用四线连接时,与RS-422一样只能实现点对多点通信,但它比RS-422有改进,&无论四线还是二线连接方式总线上可接多达32个设备。&&&三菱的&Q00PLC&的通讯接口为RS232。三&三菱&Q00PLC&的通讯方式&&&&3.1&通讯协议&&&&三菱的&Q00PLC&采用列&MELSEC&通讯协议,即&MC&协议。MC协议采用帧的形式进行通讯,它包括以下几种形式:&&&&(1)、QnA&兼容3C&帧。此种帧包括1-4种格式。&&&&(2)、QnA&兼容4C&帧。此种帧包括1-5种格式。&&&&(3)、QnA&兼容2C&帧。此种帧包括1-4种格式。&&&&(4)、QnA&兼容3E&帧。此种帧包括1-4种格式。&&&&(5)、A&兼容1E&帧。&&&&3.2&&实现方式&&&&(1)&命令文件的发送&&&&采用MC&协议进行的数据通讯采用半双工通讯方式进行。访问PLC&CPU&时对于刚刚进行的命令文件发送请在接收PLC&CPU&侧发送的响应文件后发送下一个命令文件(在响应文件的接受尚未完成之前不能进行下一个命令文件的发送)&图2&命令文件和响应的顺序&&&&(2)&对于命令文件不能接收正常结束的响应文件时&&&&&接受异常结束的响应文件时,可根据响应文件中的出错代码进行处理&&&&3.3&Q00PLC&的帧格式&&&&Q00PLC内置了MC通讯协议的QnA&兼容3C&帧和&RS232&通讯接口,所以不用外加通讯模块就可以实现与上位机的通讯。本例拟采用QnA&兼容3C&帧的第4种格式进行通讯。&&&&3.3.1&对方设备读出上位站PLC&CPU&的数据时&&&&a&上位机向&PLC&CPU&侧传输命令传输文件,下图中箭头所指的区域为请求数据区。&图3&读取时的发送帧格式&&&&b&PLC&CPU&侧响应上位机的应答传输文件,下图中箭头所指的区域为从PLC中读出并返回的数据&图4&返回的帧格式&&&&3.3.2&对方设备向上位站PLC&CPU&写入数据时&&&&a&帧格式与图3中的格式类似,只是帧中的命令和子命令为读取时的命令,请求数据区中增加了写入的数据。&&&&b&帧格式与图34中的格式类似,只是没有返回的数据。四&WINOOWs环境下&VB&与&Q00PLC&通信的实现&&&&4.1&系统分析与说明&&&&WINOOWs系统为每个通信设备开辟了用户定义的输入/输出缓冲区,数据进出通信口均由系统后台来完成,应用程序只需完成对输入/输出缓冲区操作就可以了。实际过程是每接收一个字符就产生一个低级硬件中断,WINOOWs系统中的串行驱动程序就取得了控制权,并将接收到的字符放入缓冲区,然后将控制权返还给正在运行的应用程序。如果输入缓冲区数据已满,串行驱动程序用当前定义的流控制机制通知发送方停止发送数据,而队列中的数据按先进先出&(FIFO)的次序处理。  在WINOOWs中,串行通信有两种工作方式:查询方式和事件驱动方式。查询方式占用大量的CPU时间,效率较低,但是数据不易丢失;而Win32操作系统基于事件驱动&(也称为消息驱动)机制的内核,支持基于进程的协同式多任务和基于多线程的抢先式多任务。基于事件驱动的多线程应用程序实际上在其内部实现了多任务扩展,为代码赋予了并行执行的特性,可以使应用程序对CPU的利用率大大提高,从而提高系统的响应能力,加快信息处理速度,提高通信程序的实时性和增大数据吞吐量。  基于以上分析,以事件驱动方式实现WINOOWs下的串行通信更具优势,它能完成较大数据量的实时通信,大大提高了通信的效率,故本程序采用此种方式进行串行通信,至于通信的可靠性可以通过软件设计来保证。WINOOWs平台下利用VB实现串口通信主要有以下两种方法:&&&&1)使用WINOOWs&API(Application&Program&Interface)函数。这种方法可编写移植性强的通信程序,但必须首先用Declare声明VB中所要用的动态链接库DLL,这需要对WINOOWs&API函数有深入的了解,编程较复杂。&&&&2)使用Microsoft公司提供的Active&X控件MSComm。该通信控件通过改变对象属性,向对象发送消息及为对象事件编写响应代码,可以方便地完成用户应用程序间的串行通信,既可实现API函数的所有功能,又使得编程效率提高,应用功能增强,并且程序简单明了。&&&&对于MSComm控件实现串口通信的操作很多文献都有论述,该控件的主要属性可参考相关文献,在此仅列出常用的属性和方法。需要强调的是:在数据发送与接收过程中,都要通过一个Variant类型变量作为中介。发送数据时,必须先将要发送的数据赋给一个Variant类型变量,再把该Variant变量赋值给MSComm的Output属性;同样接受数据时,也应先将MSComm的Input属性赋值给Variant变量,待接收端收到后必须转换成其它类型(如字符型、二进制型)的数据才能进行处理。本例采用MSComm控件来实现。下面介绍MSCOMM控件的属性:&&&&CommPort:设定通信连接端口代号,程序必须指定所要使用的串行端口号,WINOOWs系统使用所设定的端口与外界通信。&&&&PortOpen:设定通信口状态,若为真,通信端口打开,否则关闭。&&&&Settings:设定通信口参数,其格式是"bbbb,p,d,s",其中bbbb为通信速率(波特率),p为通信检查方式(奇偶校验),d为数据位数,s为停止位数,其设定应与PLC的设定一致。&&&&Input:将对方传送至输入缓冲区的字符读入到程序。&&&&Output:将字符写入输出缓冲区。&&&&InBufferCount:传回接收缓冲区中的字符数。&&&&OutBufferCount:传回输出缓冲区中的字符数。&&&&InputLen:设定串行端口读入字符串的长度。&&&&InputMode:设定接收数据的方式。&&&&Rthreshold:设定引发接收事件的字符数。&&&&CommEvent:传回OnComm事件发生时的数值码&&&&OnComm事件:无论是错误或事件发生,都会触发此事件。&&&&4.2&具体实现&&&&本例程序为读取Q00PLC的输入输出点的状态。监控界面如下所示:&图5&监控界面&&&&4.2.1&控件参数的初始化&&MSComm1.InBufferCount&=&0&&&&&&&&‘清空输入缓冲区&&MSComm1.OutBufferCount&=&0&&&&&&&‘清空输出缓冲区&&mPort&=&1&&&&&&&&&&&‘设定串行通信口为com1&&MSComm1.Settings&=&"19200,O,8,1"&&‘波特率19200,奇校验,8位数据位,1位停止位&&MSComm1.InputLen&=&0&&&&&&&&&&&&‘一次读入输入缓冲区中的字符串的长度为缓冲区中的所有数据&&MSComm1.RThreshold&=&62&&&&&&&‘输入缓冲区中每次接到62个字符就产生一次OnComm事件&&MSComm1.PortOpen&=&True&&&&&&&&‘打开端口&&&&&&Dim&STX&As&String&&&&&&&&&&&&&&&&‘以下为MC协议中的ASCII码&&Dim&ENQ&As&String&&Dim&ACK&As&String&&Dim&CR&As&String&&Dim&LF&As&String&&Dim&NAK&As&String&&STX&=&Chr$(&H2)&&ENQ&=&Chr$(&H5)&&ACK&=&Chr$(&H6)&&CR&=&Chr$(&HD)&&LF&=&Chr$(&HA)&4.2.2&计算机与PLC通信程序Private&Sub&Timer1_Timer()&&??Dim&SD&As&String&&&&&MSComm1.InBufferCount&=&0&&&&&MSComm1.OutBufferCount&=&0&&&&&&If&F&=&1&Then&&&&&&&&&SD&=&ENQ&+&"F9"&+&"0000FF00"&+&"0401"&+&"0001"&+&"X*"&+&"000020"&&&&&&&&&&&&&&+&"0030"&+&CR&+&LF&&&&&&Else&&&&&&&&SD&=&ENQ&+&"F9"&+&"0000FF00"&+&"0401"&+&"0001"&+&"Y*"&+&"000050"&&&&&&&&&&&&&+&"0030"&+&CR&+&LF&&&&&End&If&&&&&MSComm1.Output&=&SD&&&Timer1.Enabled&=&False&&End&Sub&&&‘OnComm事件Private&Sub&MSComm1_OnComm()&&Dim&i,&j&As&Integer&&Dim&RD,&Temp,&RDw&As&String&&If&mEvent&=&comEvReceive&Then&&&&&RD&=&MSComm1.Input&&&&If&Left(RD,&1)&=&STX&Then&&&&&&RDw&=&Mid(RD,&12,&48)&&&&&&&j&=&0&&&&&Select&Case&F&&&&&&&Case&1&&&&&&&&j&=&48&&&&&&&Case&-1&&&&&&&&j&=&96&&&&&End&Select&&&&&&&&For&i&=&1&To&48&&&&&&&&&&&&Temp&=&Mid(RDw,&i,&1)&&&&&&&&If&F&=&1&Then&&&&&&&&&&&If&Temp&=&"1"&Then&&&&&&&&&&&&&&&Lalel(i&-&1).BackColor&=&&H80FF80&&&&&&&&&&&Else&&&&&&&&&&&&&If&i&&=&3&Then&&&&&&&&&&&&&&&Lalel(i&-&1).BackColor&=&&HFF&&&&&&&&&&&&&Else&&&&&&&&&&&&&Lalel(i&-&1).BackColor&=&&HFFFF00&&&&&&&&&&&&&End&If&&&&&&&&&&End&If&&&&&&&Else&&&&&&&&&&If&Temp&=&"1"&Then&&&&&&&&&&&&&If&i&=&42&Then&&&&&&&&&&&&&&&Lalel(i&-&1&+&48).BackColor&=&&HFF&&&&&&&&&&&&&Else&&&&&&&&&&&&&&&Lalel(i&-&1&+&48).BackColor&=&&H80FF80&&&&&&&&&&&&&End&If&&&&&&&&&&Else&&&&&&&&&&&&&Lalel(i&-&1&+&48).BackColor&=&&HFFFF00&&&&&&&&&&End&If&&&&&&&End&If&&&&&&&&Next&i&&&&F&=&F&*&(-1)&&&&&Timer1.Enabled&=&True&&&&&‘F&=&F&*&(-1)&&&&End&If&&End&IfEnd&Sub&五&结束语&&&&VB是一种成熟的、面向对象的程序设计语言,采用它编写的WINOOWs环境下PC机与Q00PLC的串行通讯软件具有程序实现简便、通用性强的特点,减轻了软件开发者的工作量,对于国内的中、小型企业具有现实意义。参考文献[1]&王栋,Visual&Basic6.0程序设计实用教程[M],清华大学出版社,2003[2]&工业接口与通讯,吕志艺,2003[3]&Q&系列&MELSEC&通讯协议参考手册[4]&三菱&Q&系列可编程控制器编程手册;作者简介:马磊:日出生;性别:女;籍贯:山东省魏桥镇南郑村;在读研究生;研究方向:造纸装备与控制。吕多勇:1982年6月出生;男;籍贯:山东省济南市历城区;本科,学士学位;联系方式:通讯地址:山东省济南市&大学科技园&山东轻工业学院&轻化与环境工程学院,06级研究生,马磊。&&邮编:250353&&&邮箱:
作者:未知 点击:1670次
本文标签:在Windows平台下利用VB实现电脑与三菱Q00PLC的串行通信
* 由于无法获得联系方式等原因,本网使用的文字及图片的作品报酬未能及时支付,在此深表歉意,请《在Windows平台下利用VB实现电脑与三菱Q00PLC的串行通信》相关权利人与机电之家网取得联系。
关于“在Windows平台下利用VB实现电脑与三菱Q00PLC的串行通信”的更多资讯
:东莞市中芯防静电科技有限公司
&【求购】 &&&
&【求购】 &&&
&【求购】 &&&
&【求购】 &&&
&【求购】 &&&
&【求购】 &&&
&【求购】 &&&
&【求购】 &&&
VIP公司推荐PC与TC35I的通信!返回的老是可恶的00 00! - 维库电子市场网
PC与TC35I的通信!返回的老是可恶的00 00!
作者:zhjq007 栏目:
PC与的通信!返回的老是可恶的00 00!做与PC的通信,接上外围电路启动后SYNC的发光二极管显示模块处于待机状态!通过与PC通信.用串口调试助手(波特率:,校验位无,数据位:8停止位:1)给模块发指令,可是不管我写什么指令进去返回的总是00 00.检查了很久的电路,确定电路是没有问题了.小弟真的是无计可施了!哪位高手可以指点下吗?
作者: chunyang 于
16:45:00 发布:
肯定是电路有问题先检查连线是否正确,收发是否接对了
作者: zhjq007 于
17:54:00 发布:
查过了!其实就那几条线!查了一下午了!想不通,LED是隔3秒亮一下的.TXD接TXD,RXD接RXD.在站内查了以前的老贴好象都没有我这种情况的!会不会是模块坏了?又没示波器.怎么图贴不上来啊?
作者: computer00 于
19:19:00 发布:
倒塌了.....00很可恶吗?会不会你把收和发搞反了?
作者: xwj 于
19:22:00 发布:
可恨的00 可恼的00 讨厌的00 该死的00 ...&
作者: chunyang 于
19:33:00 发布:
你先用别的电话呼叫一下这个模块吧如果模块真工作了,RING会有输出的,SYNC也会有指示,没工作,查你的电路、电源、SIM卡吧。
作者: zhjq007 于
9:53:00 发布:
可以打通.但是SYNC也是显待机状态.电话可以打通,但是SYNC也是显待机状态.没有什么不同的表现.RING是要用示波器才能看的到的吧?
作者: zhjq007 于
14:42:00 发布:
苦恼啊!原来昨天我来测这个模块用的是COM2可我跟电脑连接的是COM1.但是COM1根本就不能跟模块连接上!我用单片机与我原来用来跟连接那个232的电路来与PC通信!一切都正常,说明我的电路应该没错才对啊!可是再接回又是不能连接上!电话又可以打通,说明模块已经在工作状态了,怎么就是不能通信啊?我的头都快爆了!
作者: chunyang 于
16:08:00 发布:
如果能呼叫通证明模块方面没问题问题出在PC串口或插头、连线上。
作者: zhjq007 于
17:28:00 发布:
问题解决了!谢谢各位的帮助啊!问题解决了!原来是232的外围的电容不对!原来是用的,现在改成1uF的就可以通信了!真的很感谢chunyang及各位的帮忙啊!
作者: hanker510 于
15:22:00 发布:
是这样的吗&&&&不过我们产品上的外围一直是 0.1u的电容阿
作者: chunyang 于
15:56:00 发布:
202是的没错但232就不一定了,的还得用呢,其它公司的232所配储能电容从起,1uF、的都有。
讨论内容:
Copyright &
浙ICP证030469号2013年4月 硬件/嵌入开发大版内专家分月排行榜第二2007年9月 硬件/嵌入开发大版内专家分月排行榜第二
2013年5月 硬件/嵌入开发大版内专家分月排行榜第三2012年9月 硬件/嵌入开发大版内专家分月排行榜第三2007年11月 硬件/嵌入开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
单片机技术与应用 刘松 单元5 串行通信新.ppt文档全文免费阅读、在线看 56页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:80 &&
你可能关注的文档:
··········
··········
【例5.1】89S52串行口按双工方式收发ASCII字符,甲机发送的字符从外部RAM的1000H开始,检测到结束字符0AH就结束发送,乙机将接收的字符放在内部RAM的30H开始的空间。要求通信的波特率为9600波特,用中断方式编写通信程序。 主程序: MOV
TMOD,#20H
;定时器1设为工作方式2
TLl,#0FDH
;定时器初值
THl,#0FDH
;8位重装值 SETB
;启动定时器1
SCON,#50H ;将串行口设置为方式1,
DPTR,#1000H ;发送数据区首址送
;接收数据区首址送R0 SETB
;开中断 ACALL
;先发送一个字符
;等待中断 发送子程序 SEND:CLR TI
MOV A,@DPTR
;取发送数据到A
;修改发送数据指针
;发送ASCII码
A,#0AH,SEN1
;是否是结束字符
;关闭串口中断 SEN1:RET
;返回 中断服务程序
;串行口中断入口
;转至中断服务程序
0100H RSI:JNB
SEN ;TI=1,为发送中断
;RI=1,为接收中断
;转至统一的出口 SEN:ACALL
;调用发送子程序 NEXT:
;中断返回 接收子程序 REV: CLR
;读出接收缓冲区内容
A ;读入接收缓冲区
;修改接收数据指针
A,#0AH,RES
;是否是结束字符
;关闭串口中断 RES: RET
;返回 3. 工作方式2 SM1 SM0= 10,串行接口选择工作方式2。
方式2是11位异步通信方式,每帧数据由1个起始位“0”、9个数据位和1个停止位“1”共11构成。其中发送的第9位由SCON的TB8提供,接收的第9位存在SCON的RB8位。其波特率是固定的为fosc/32或fosc/64。 方式2发送:CPU执行一条写入SBUF的指令就启动串行口的发送,并把TB8的内容装入发送寄存器的第9位。首先发送起始位0,此后每经过一个时钟周期产生一个移位脉冲,并且由TXD输出一个数据位,当11位数据全部发送后,使TI置1。 方式2接收:接收过程和方式1类似,当REN=1时,允许串行口接收数据。数据由RXD端输入,接收11位数据。在方式2的接收中,若RI=0, SM2=0或接收到的第9位数据为1,成立则RI=1,8位数据进入SBUF,第九位进入RB8。
若不满足上述两个条件则接收到的信息将丢失,不再恢复,也不置位RI。 【例5.2】设计一个发送程序,将片内RAM30H~3FH中的数据串行发送,串行口设定为方式2状态,TB8作奇偶校验位。在数据写入发送缓冲器之前,先将数据的奇偶位P写入TB8,这时第9位数据作奇偶校验用。 程序清单如下: TRT: MOV
SCON,#80H
;方式2设定
MOV PCON,#80H
;取波特率为fosc/32
正在加载中,请稍后...嵌入式系统中串口通信帧的同步方法
嵌入式系统中串口通信帧的同步方法
  串口通信是日前单片机和DSP等 嵌入式系统 之间,以及嵌入式系统与PC机或无线模块之间的一种非常重要且普遍使用的通信方式。在嵌入式系统的硬件结构中,通常只有一个8位或16位的CPU,不仅要完成主流程的工作,同时还要处理随时发生的各种中断,因而嵌入式系统中的串口通信程序设计与PC机有很大的不同。若嵌入式系统中.中
  串口通信是日前单片机和DSP等 嵌入式系统 之间,以及嵌入式系统与PC机或无线模块之间的一种非常重要且普遍使用的通信方式。在嵌入式系统的硬件结构中,通常只有一个8位或16位的CPU,不仅要完成主流程的工作,同时还要处理随时发生的各种中断,因而嵌入式系统中的串口通信程序设计与PC机有很大的不同。若嵌入式系统中.中断服务子程序在系统运行过程中占用了较多的时间,就有可能在中断眼务子程序正运行时,又产生一个同类型或其他类型的中断,从而造成主程序得不到执行或后续中断数据丢失。所以,嵌入式系统中的串口通信虽然看似简单,但其中仍有许多问题值得研究,例如串口通信过程中的帧同步问题。本文针对该问题给出了逐次比较、基于FIFO队列和基于状态机的3种帧 同步方法 。通过测试、分析和比较得出,基于有限状态机的方法是嵌入式系统串口通信中很有效的帧同步方法,同时也是一种很不错的串口通信程序设计结构。
  1 串口通信的数据帧结构
  现代工业控制,往往需要由多个独立的控制模块来共同完成。它们之间通过串口通信完成复杂的控制过程,必须在通信过程中加入必要的通信协议,以提高系统的可靠性和稳定性;而要完成特定的通信协议,就得有一定的同步机制。下面介绍一下简化的串口通信数据帧结构,以便分析说明嵌入式系统串口通信过程中的帧同步方法。
  假定串口发送的数据帧结构为:
  其中:包头用于同步,一般是一个或多个ASCII字符,本文中假定数据帧同步头有2字节(0xAA、0x55);包长表示数据包中除去包头和包长的字节数,一般用约定好的几个字节表示;类型为通信协议里规定的命令类型;数据为应发送的主要信息;校验通常采用单字节“异或”的方法。
  2 串口通信中的帧同步方法
  2.1 逐次比较的帧同步方法
  首先等待串口数据,将接收到的第1个字节数据与约定好的包头信息的第1个字节进行比较。如果不正确,则等待新字节,直到接收的数据与包头信息的第1个字节相同。第1个字节比较正确以后,将收到的第2个字节与包头信息的第2个字节进行比较。如果仍然正确,则说明串口接收已经同步,可以开始接收数据帧中的数据部分;否则,重新开始同步过程。其程序流程如图1所示。
  此种方法代码量小,编程简单,一般用于在主程序中以非中断方式接收串口数据、实时性很差、数据帧较短的场合。但是,在串口速度过快且包头字节数比较多的情况下,串口实现同步花费的时间很长或很难实现同步。例如,串口接收到序列Ox0O OxAA0xAA 0x55…,当遇到第一个“0xAA”时,该方法认为第1个字节正确开始比较第2个同步头。第2个字节仍是“0xAA”而不是“0x55”,所以必须等待新的字节重新开始比较第1个同步头。而紧随其后的是“0x55”,因而,此时包头的第1个字节也没有同步上。事实上,“0x00 OxAA”是干扰字节,“0xAA 0x55”才是通信协议中的同步头。
  2.2 基于FIFO队列的帧同步方法
  根据同步包头的长度,定义一个相同长度的全局字节数组,把该数组看成是一个如图2所示的先入先出(FIFO)的队列。程序流程如图3所示。
  本例中定义两个字节HEADl和HEAD2,都初始化为0xFF。同步时,丢弃数组头字节HEADl,数组中的所有数据向前
移动一个字节,串口接收到的新字节存入数组末字节HEAD2中,将整个数组与协议中的包头信息比较。如果正确,则置位已同步标志位,然后开始接收、存储有用数据;否则,继续等待同步。串口数据接收完后,不仅要清除已同步标志,还要把HEADl和HEAD2两个字节都赋值0xFF;否则,将会影响下一帧数据的同步和接收。用前面提到的序列“0x00 0xAA 0xAA 0x55…”进行测试,随着串口接收中断收到新的字节。帧同步队列中的数据依次为:[0xFF,0xFF]→[0x00,0xFF]→[0xAA,0x00]→[0xAA,0xAA]→[0x55,0xAA]。此时,该算法检测出[HEAD2,HEAD2]==[0x55,0xAA],从而实现了同步,置位已同步标志位以便下次进入串口接收中断服务子程序时开始接收数据包的数据部分。
  此种方法与逐次比较的帧同步方法相比,能够比较快速、正确地检测出同步包头;但是如果包头的字节数很多,同步过程中每次进入串口中断服务子程序都要进行大量的字节搬移,将必然耗费很长的时间。为了使嵌入式系统更健壮,程序设计应把握的基本原则之一就是使中断处理程序最短。所以基于FIFO队列的帧同步方法也不是最优的。  2.3 基于有限状态机的帧 同步方法
  为解决以上问题,可以采用基于有限状态机的设计方法。该方法将数据帧的接收过程分为若干个状态:接收信息头HEADl状态、接收信息头HEAD2状态、接收包长状态、接收数据类型状态、接收数据状态及接收校验和状态。系统的初始状态为HEADl状态,各接收状态间的状态转移图如图4所示,仍用前面提到的序列“0x00 0xAA 0xAA 0x55…”进行测试。随着串口接收中断新字节的接收,系统的接收状态依次为HEAD1→HEAD1→HEAD2→HEAD2→LEN。可见此时就是同步状态。该方法也快速、有效地实现了同步;但是需要注意的是,在每一次接收完1帧完整的数据之后,必须把系统的接收状态重新设置为HEADl,否则将会影响下一帧的数据接收。
  此后,程序按照协议开始依次接收数据帧长度、命令类型、数据和校验位。接收完后,重新设置系统接收状态为HEADl,同时对该数据帧进行校验。校验正确后,利用消息机制通知主程序根据命令类型对数据帧进行处理或执行相应的命令操作。
  下面给出该方法在KeilC5l中的示例程序:
  由于采用了状态机和消息机制的结构,上述设计思路快速有效地实现了串口通信的同步,而且程序结构清晰,便于维护,也易于向其他的串口通信协议移植。另外,串口中断服务子程序中需要处理的工作很少,每个串口接收中断平均耗时不超过20个机器周期(在单片机
AT89C5l中),大大减轻了串口接收中断服务程序的压力,缓解了 嵌入式系统 有限资源与需求之问的矛盾,提高了嵌入式系统的稳定性。
  3 结论
  从上面的分析和测试可以看出,基于有限状态机的 串口通信帧 同步方法是本文中提出的3种帧方法中最优的,结构清晰且系统资源利用率高。
  对一个有着完整通信协议的串口中断来说,因为要比较命令头、完成校验、解析数据等需要耗费大量的机器周期,所以嵌入式系统中的串口中断服务程序设计显得更为重要。在实际的串口通信程序中,可采用状态机和消息机制相结合的方法,仅在中断服务程序中设置一个标志,而在主程序中根据相应标志来作处理,这样就回避了某些中断可能需要较长处理时间的问题。在程序结构上,由于采用状态机的结构,既提高了可读性。同时又提高了运行速度,因而该方法不仅是一种很好的帧同步方法,还是一种很不错的串口通信程序设计方法。
型号/产品名
worldchinatrade
深圳市盛芯世纪科技有限公司
陈文彬(个体经营)
绍兴市华龙微电子有限公司
深圳市福田区越壹电子经营部}

我要回帖

更多关于 c 串口接收 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信