RS-485通信原理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、RS485串口通信电路图

二.VxWorks中基于RS485总线的串口通信协议及实现

摘要:本文介绍了在嵌入式实时操作系统Vxworks下串行设备的驱动架构及实现,提出了一种基于RS-485总线的新型串口通信协议,重点讨论了基于这种协议的应用程序的设计方法,发送时主要采用了总线仲裁机制,接收时主要采用了字符合法性校验、长度校验、内容的CRC校验,提高了系统的通信效率和稳定性。

关键词:VxWorks;RS-485;通信协议;总线仲裁;CRC校验

1 引言

随着信息技术和互联网的飞速发展,以及计算机、通讯、数码产品等领域的高速增长,数字化时代已经来临。嵌入式设备是数字化时代的主流产品,嵌入式软件是数字化产品的核心,作为嵌入式软件的基础和关键,嵌入式操作系统在产业发展过程中扮演着越来越重要的角色,应用遍及工业自动化、网络通信、航空航天、医疗仪器等领域。

2 RS-485总线

RS-485总线接口是一种常用的串口,具有网络连接方便、抗干扰性能好、传输距离远等优点。RS-485收发器采用平衡发送和差分接收,因此具有抑制共模干扰的能力,加上收发器具有高的灵敏度,能检测到低达200mv的电压,可靠通信的传输距离可达数千米。使用RS-485总线组网,只需一对双绞线就可实现多系统联网构成分布式系统、设备简单、价格低廉、通信距离长。

3 VxWorks中串口驱动的实现

VxWorks 操作系统是美国Wind River公司设计开发的嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。Vxworks 操作系统的I/O 系统可以提供简单、统一、与任何设备无关的接口。这些设备包括:面向字符设备、随机块存储设备、虚拟设备、控制和监视设备以及网络设备。Vxworks 的I/O 系统包括基本I/O 系统和缓冲I/O 系统,具有比其他I/O 系统更快速,兼容性更好的特性。这对于实时系统是很重要的。

3.1 串口驱动架构

基于vxWorks的串口设备驱动程序架构,对vxWorks的

虚拟设备ttyDrv进行封装,向上将TTY设备安装到标

准的I/O系统中,上层应用通过标准的I/O 接口完成

对硬件设备的操作,向下提供对实际硬件设备的底层设

备驱动程序。其软件架构如图1所示。

由图1可知,串口设备驱动由两部分组成,一部分为对

ttyDrv进行封装,将串行设备安装到标准的I/O系统

中,提供对外的接口;另一部分为串行设备驱动程序,

提供对硬件设备的基本操作。

虚拟设备ttyDrv管理着I/O系统和真实驱动程序之间

的通信。在I/O系统方面,虚拟设备ttyDrv作为一个

字符型设备存在,它将自身的入口点函数挂在I/O系统

上,创建设备描述符并将其加入到设备列表中。当用户有I/O请求包到达I/O 系统中时,I/O系统会调用ttyDrv相应的函数响应请求。同时,ttyDrv管理了缓冲区的互斥和任务的同步操作。另一方面,ttyDrv负责与实际的设备驱动程序交换信息。通过设备驱动程序提供的回调函数及必要的数据结构,ttyDrv将系统的I/O请求作相应的处理后,传递给设备驱动程序,由设备驱动程序完成实际的I/O操作。

3.2 驱动初始化

串口设备的初始化xxDevInit流程如图2。

设备驱动的初始化过程首先调用系统函数ttyDrv(),该

函数通过调用iosDrvInstall()将ttyOpen()、

ttyIoctl()、tyRead()、tyRead、tyWrite安装到系统

驱动函数表中,供I/O系统调用。

接着根据用户入参对串口芯片寄存器进行初始化,安装

驱动函数指针。

最后调用系统函数ttyDevCreate()创建ttyDrv设备。

该函数初始化设备描述符,调用tyDevInit()函数初始化tyLib、初始化select 功能、创建信号量和输入输出缓冲区,调用iosDevAdd()函数将设备添加到设备列表中并将设备置为中断模式。

驱动模块初始化成功后,应用程序就可以用标准的I/O函数read()和write()收发数据了。

4 RS-485通信协议

4.1 485通信帧格式

表 1 485通信帧格式

目的地址源地址长度控制帧净荷数据CRC检验

2Bytes

1Byte 1Byte 1Byte 2Bytes 由长度字节确定,

≤255Bytes

长度字段不包含控制字段、检验字段。校验字段使用CCITT的CRC16的校验方法,其生成多项式为。校验字段默认是加上的,只有在发送方的CPU负荷比较大时,并且能够保证本帧出现的错误不会对系统产生潜在的和现实的影响,或者保证影响在可以控制在一定范围内并且可以忍受时,才考虑取消校验字段。当接收方接收到帧的总长度减去长度字段值与帧头的长度之和,得到的结果为2时,表明发送方附带了校验和。

4.2 485数据链路层帧

表 2 485链路层帧格式

头标志(0x7E)485通信帧尾标志

(0x7E)

2Bytes 1Byte 最大不超过485通信帧的长度(不包括字节拆分

的添加字符)

头标志是任意个数的连续的字符0x7E,尾标志也是任意个数的连续的字符0x7E。预定头标志为1Byte,尾标志为2Bytes,在发送方的CPU认为发送完毕最后一个尾标志字符时,保证第一个尾标志字符能够完全到达目的设备。发送方除头标志或尾标志之外,不允许出现0X7E,若遇到0X7E,则拆分成0X7D,0X5E;若出现0X7D,则拆分成0X7D,0X5D传送。

5 串行通信应用程序设计

5.1 初始化配置

•创建一个51200Bytes的接收环形缓冲区,用来存放剩余的或不成帧的数据:g_tRecvRingId = rngCreate(51200);

相关文档
最新文档