一、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检验1Byte 1Byte 1Byte 2Bytes 由长度字节确2Bytes定,≤255Byt es长度字段不包含控制字段、检验字段。
校验字段使用CCITT得CRC16得校验方法,其生成多项式为。
校验字段默认就是加上得,只有在发送方得CPU负荷比较大时,并且能够保证本帧出现得错误不会对系统产生潜在得与现实得影响,或者保证影响在可以控制在一定范围内并且可以忍受时,才考虑取消校验字段。
当接收方接收到帧得总长度减去长度字段值与帧头得长度之与,得到得结果为2时,表明发送方附带了校验与。
4、2 485数据链路层帧表 2 485链路层帧格式头标志(0x7E) 485通信帧尾标志(0x7E) 1Byte 最大不超过485通信帧得长度(不包括字节拆分2Bytes得添加字符)头标志就是任意个数得连续得字符0x7E,尾标志也就是任意个数得连续得字符0x7E。
预定头标志为1Byte,尾标志为2Bytes,在发送方得CPU认为发送完毕最后一个尾标志字符时,保证第一个尾标志字符能够完全到达目得设备。
发送方除头标志或尾标志之外,不允许出现0X7E,若遇到0X7E,则拆分成0X7D,0X5E;若出现0X7D,则拆分成0X7D,0X5D传送。
5 串行通信应用程序设计5、1 初始化配置•创建一个51200Bytes得接收环形缓冲区,用来存放剩余得或不成帧得数据:g_tRecvRingId = rngCreate(51200);•串口设备描述符为“my”,打开串口并创建设备读写描述符:g_sdwChannelFD = open(“my”, O_RDWR, 0);•设置波特率:ioctl(g_sdwChannelFD, FIOBAUDRATE, g_RS485LinkCB[i]、sdwBaudRate);•清空接收、发送缓存:ioctl(g_sdwChannelFD, FIOFLUSH,0);•工作模式设置:ioctl(g_sdwChannelFD, FIOSETOPTIONS, OPT_RAW);5、2 通信发送过程在发送之前,发送方需要按照双方约定得485通信帧格式将消息组帧,并按照约定数据链路传输协议组成485得数据链路帧。
接下来就就是如何发送数据包了。
在RS-485通信中,发送过程主要采取了总线仲裁机制:在向485总线写数据时,主设备先写一字节得地址请求,所有得从设备均会收到,只有地址与之相等得从设备端口打开,其她设备全部关闭。
这样,主设备与从设备之间得通信就就是点对点得。
每一个从设备均有一根请求线与主设备相连,若从设备需要与主设备通信时,先通过请求线进行请求,当请求成功后,从设备应能检测到总线上得地址与自身地址相同,从设备才能打开发送中断,才能发送消息,发送完之后必须关闭发送中断,释放总线,以保证其她从设备这段时间能与主设备正常通信,提高通信效率。
RS-485通信发送流程图如图3所示。
5、3 通信接收过程对于串口通信,仍然要关心数据接收得实时性,因此采用中断方式,利用VxWorks 提供得select 函数得事件触发机制,将读串口得任务阻塞使其一直等待数据,当有数据来到得时候该任务会立刻自动响应,提高系统得实时性,调用read( )接收数据并存入先前创建得接收环形缓冲区g_tRecvRingId中直至缓冲区g_tRecvRingId满或接收完链路上得数据,接下来就就是根据通信协议来处理数据包――解帧处理过程。
接收方判断开始485通信帧得条件就是,设备不报告接收错误得情况下,接收到0x7E字符之后得第一个非0x7E得字符。
判断帧结束得条件就是,帧接收已经开始,遇到第一个尾标志字符。
在两个0X7E间若收到0X7D,则丢弃,并将其后得一个字节数据与0X20异或。
当链路层得通信帧接收已经开始得情况下,设备报告字符接收错误,此时应当丢弃本帧,结束帧得接收,重新开始搜索下一帧。
长度字段后面得字节个数不等于长度字段指示,并且也不等于长度字段加2时,指示长度错误,作无效帧。
帧长度小于帧头得长度得帧视为无效帧。
当接收得字符个数超过最大得485通信帧字节数——262时,也认为接收错误,重新开始搜索头标志,检出下一帧数据。
超时保护:如果接收收方在接收一帧数据时,在未接收完一帧时,超过20ms(2个Ticks)仍未有数据到达,则认为本帧数据接收结束,并将其丢弃。
在允许进行校验得情况下,对接收到得帧进行CRC校验。
如果校验字段与帧得校验结果不符,认为帧出错,通常作丢弃处理。
帧头中,目得地址与接收单元不匹配时,丢弃该帧。
6、结束语VxWorks就是一种高性能嵌入式实时操作系统,它以其良好得可靠性与卓越得实时性被广泛地应用在通信、自动化、航空等各个领域中。
许多外部终端设备如打印机、逻辑分析仪等都采用串行方式,以及对单板得调试也要用到串行口,因此掌握在Vxworks下得串行通信就是非常重要得。
本文得创新之处在于提出一种新得RS-485通信协议,在这种协议中,发送方根据协议组帧,再采用总线仲裁机制将消息发送出去,而接收方则将收到得字符合法性校验,当收到一帧完整得帧后,根据帧头中长度字段做帧长度校验,再采用CCITT得CRC16校验方法做内容校验,如果长度校验已经出错,则不再做内容校验,提高了通信效率。
文章给出了基于这种协议得串口通信应用程序得设计,详细描述了通信双方遵循约定得通信协议得通信过程及如何保证通信过程中信号得正确性、完整性。
笔者在VxWorks开发过程中已将应用程序用于实例,而且运行可靠,具有很强得实用价值。