RS232接口可靠传输方法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
RS232接口的可靠传输方法 一、基本概念。 串口,一般是指RS232。RS232是协议名称,而串口还应该包括了其它协议,如:RS485、RS422等。 串口也叫UART,有时叫USART(应该写成U(S/A)RT,但是略显累赘),U是通用,A是异步,S是同步,所以,UART跟USRT区别在于有无同步时钟,所以有的串口会有三根线(地线除外)。为了避免混淆,以下均使用RS232,而不使用串口。 RS232发送是靠TXD和GND之间的电压来传数据(接收跟发送雷同),是共模电压,抗干扰能力差,导致传输距离非常有限。 因为RS232的简单、低成本,所以不管是单片机、ARM、DSP都配了这种接口(FPGA可以自制)。 二、封装成帧。 RS232的协议,分成几个部分:起始位、数据位、校验位、停止位。注意,这里用的是位(bit)。 单纯地按照协议规定的去做,会出现一些问题。 1、奇偶校验的校验能力太差。 2、传错一个数据,没法重传。 3、在总线上挂了几个从机,主机如何区分是哪台从机发出的数据(有的设备不能把校验位当地址位用)。 4、如果没有成功发送停止位,那么接收端会不会一直等待。 5、总线上传错了一组数据,没法定位是哪个地方(哪个位)出问题。 鉴于以上诸多问题,我们想到了一种解决办法,就是封装成帧。一帧数据包含多个byte,而一个byte的数据包含多个bit(起始位、数据位等)。 三、自定义协议。 根据实际需求自定义协议。下面举个例子(非通用协议/准则),并以“域”来表示协议里面各个功能模块。 1、帧起始。 帧起始,一般以0x55或者0xaa作为起始的标志,为什么要用这种数字? 十六进制的5,转为二进制是0101;十六进制的A,转为二进制是1010。这样,0x55,就。 0和1交替出现,一来方便接收方实现自适应波特率,二来避免干扰。 a、通过检测0和1之间的时间间隔,即可知道该帧数据的波特率。 b、如果设为0xff,那么,在总线上出现一个干扰,接收端很有可能误以为要接收数据。 2、命令域。 命令域,可以随意一点,如:设上行为0x1d,下行为0x3a,重传为0xb7,应答为0x89。 3、地址域。 地址域,也可以随意一点,如果所有设备的地址均不相同,那就只具备点对点的功能。 当然,你也可以视实际情况,把某几台设备的地址设为一样,这样就有点对多点的功能。 4、数据域。 数据域,一般由数据个数和数据组成。 比如,你要传3个数,分别是0x00到0x02。那么数据域就是0x03 0x00 0x01 0x02。 5、校验域。 校验域,可以使用校验和或者CRC校验。如,使用CRC16算法话,校验域为2个byte。 一般除了帧起始和帧结束以外,都送进CRC校验。 6、帧结束。 跟帧起始一样,可以设为0x5a。 好了,这样的话,我要发一个上行的数据,到地址为0x0a的设备,一共3个数据,分别是0xa0,0xb0,0xc0。 那么一帧数据就是:0x55 0x1d 0x0a 0x03 0xa0 0xb0 0xc0 0x53 0xfb 0x5a 只要把上面这一帧数据,一个byte一个byte地发送出去,即可。 7、应答和重传。 如果接收端,收到一帧数据,经过CRC校验,数据正确,这时得传一帧简易的应答帧,以告诉主机,这个帧接收成功。 应答帧, 如:0x55 0x89 0x5a。 如果接收端,收到一帧数据,经过CRC校验,发现数据有错,这时得传一帧简易的重传帧,以请求重传。 重传帧,如:0x55 0xb7 0x5a。 看,串口的功能是不是强大了很多? 四、适用于FPGA的帧。 当然,要像上面那样强化串口的功能,还是用单片机来弄,比较轻松。 如果是FPGA的话,也有另外一种简单的封装成帧的方法。 先插入start和stop标志位,再存进FIFO里面,如下图所示。 最后再读出,解帧,即可。 这一招,也能用在传输图像,比如把一帧480*320的图像传到另一台设备上,就用上述方法把每一行封装成帧,这样,能在接收端解帧,就能还原出图像了。 当然,你还可以加上行数和列数,插在一帧数据里面,方面接收端解帧,这些都视实际需求而定。 五、缓冲区。 缓冲区,一般是FIFO,也可以是cache、内存或者硬盘之类的存储器。 有的单片机的串口,是带接收缓冲器的,此外,一些设备/芯片,也有缓

文档评论(0)

xuefei111 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档