1、rs232串口通信原理串口就是计算机上一种非常通用设备通信得协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232得串口。串口同时也就是仪器仪表设备通用得通信协议;很多GPIB兼容得设备也带有RS232口。同时,串口通信协议也可以用于获取远程采集设备得数据。 串口通信得概念非常简单,串口按位(bit)发送与接收字节。尽管比按字节(byte)得并行通信慢,但就是串口可以在使用一根线发送数据得同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间得长
2、度不得超过2米;而对于串口而言,长度可达1200米。 典型地,串口用于ASCII码字符得传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信就是异步得,端口能够在一根线上发送数据同时在另一根线上接收数据。其她线用于握手,但就是不就是必须得。串口通信最重要得参数就是波特率、数据位、停止位与奇偶校验。对于两个进行通行得端口,这些参数必须匹配: a,波特率:这就是一个衡量通信速度得参数。它表示每秒钟传送得bit得个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就就是指波特率例如如果协议需要4800波特率,那么时钟就是4800Hz。这意味着串口通信在数
3、据线上得采样率为4800Hz。通常电话线得波特率为14400,28800与36600。波特率可以远远大于这些值,但就是波特率与距离成反比。高波特率常常用于放置得很近得仪器间得通信,典型得例子就就是GPIB设备得通信。 b,数据位:这就是衡量通信中实际数据位得参数。当计算机发送一个信息包,实际得数据不会就是8位得,标准得值就是5、7与8位。如何设置取决于您想传送得信息。比如,标准得ASCII码就是0127(7位)。扩展得ASCII码就是0255(8位)。如果数据使用简单得文本(标准 ASCII码),那么每个数据包使用7位数据。每个包就是指一个字节,包括开始/停止位,数据位与奇偶校验位。由于实际数
4、据位取决于通信协议得选取,术语“包”指任何通信得情况。 c,停止位:用于表示单个包得最后一位。典型得值为1,1、5与2位。由于数据就是在传输线上定时得,并且每一个设备有其自己得时钟,很可能在通信中两台设备间出现了小小得不同步。因此停止位不仅仅就是表示传输得结束,并且提供计算机校正时钟同步得机会。适用于停止位得位数越多,不同时钟同步得容忍程度越大,但就是数据传输率同时也越慢。 d,奇偶校验位:在串口通信中一种简单得检错方式。有四种检错方式:偶、奇、高与低。当然没有校验位也就是可以得。对于偶与奇校验得情况,串口会设置校验位(数据位后面得一位),用一个值确保传输得数据有偶个或者奇个逻辑高位。例如,如
5、果数据就是011,那么对于偶校验,校验位为0,保证逻辑高得位数就是偶数个。如果就是奇校验,校验位位1,这样就有3个逻辑高位。高位与低位不真正得检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位得状态,有机会判断就是否有噪声干扰了通信或者就是否传输与接收数据就是否不同步、RS485串口通信电路图 二、VxWorks中基于RS485总线得串口通信协议及实现摘要:本文介绍了在嵌入式实时操作系统Vxworks下串行设备得驱动架构及实现,提出了一种基于RS485总线得新型串口通信协议,重点讨论了基于这种协议得应用程序得设计方法,发送时主要采用了总线仲裁机制,接收时主要采用了字符合法性
6、校验、长度校验、内容得CRC校验,提高了系统得通信效率与稳定性。 关键词:VxWorks;RS485;通信协议;总线仲裁;CRC校验 RS485总线RS485总线接口就是一种常用得串口,具有网络连接方便、抗干扰性能好、传输距离远等优点。RS485收发器采用平衡发送与差分接收,因此具有抑制共模干扰得能力,加上收发器具有高得灵敏度,能检测到低达200mv得电压,可靠通信得传输距离可达数千米。使用RS485总线组网,只需一对双绞线就可实现多系统联网构成分布式系统、设备简单、价格低廉、通信距离长。VxWorks中串口驱动得实现VxWorks 操作系统就是美国Wind River公司设计开发得嵌入式实时
7、操作系统(RTOS),就是嵌入式开发环境得关键组成部分。Vxworks 操作系统得I/O 系统可以提供简单、统一、与任何设备无关得接口。这些设备包括:面向字符设备、随机块存储设备、虚拟设备、控制与监视设备以及网络设备。Vxworks 得I/O 系统包括基本I/O 系统与缓冲I/O 系统,具有比其她I/O 系统更快速,兼容性更好得特性。这对于实时系统就是很重要得。 串口驱动架构基于vxWorks得串口设备驱动程序架构,对vxWorks得虚拟设备ttyDrv进行封装,向上将TTY设备安装到标准得I/O系统中,上层应用通过标准得I/O 接口完成对硬件设备得操作,向下提供对实际硬件设备得底层设备驱动程
8、序。其软件架构如图1所示。由图1可知,串口设备驱动由两部分组成,一部分为对ttyDrv进行封装,将串行设备安装到标准得I/O系统中,提供对外得接口;另一部分为串行设备驱动程序,提供对硬件设备得基本操作。虚拟设备ttyDrv管理着I/O系统与真实驱动程序之间得通信。在I/O系统方面,虚拟设备ttyDrv作为一个字符型设备存在,它将自身得入口点函数挂在I/O系统上,创建设备描述符并将其加入到设备列表中。当用户有I/O请求包到达I/O系统中时,I/O系统会调用ttyDrv相应得函数响应请求。同时,ttyDrv管理了缓冲区得互斥与任务得同步操作。另一方面,ttyDrv负责与实际得设备驱动程序交换信息。
9、通过设备驱动程序提供得回调函数及必要得数据结构,ttyDrv将系统得I/O请求作相应得处理后,传递给设备驱动程序,由设备驱动程序完成实际得I/O操作。驱动初始化串口设备得初始化xxDevInit流程如图2。设备驱动得初始化过程首先调用系统函数ttyDrv,该函数通过调用iosDrvInstall将ttyOpen、ttyIoctl、tyRead、tyRead、tyWrite安装到系统驱动函数表中,供I/O系统调用。接着根据用户入参对串口芯片寄存器进行初始化,安装驱动函数指针。最后调用系统函数ttyDevCreate创建ttyDrv设备。该函数初始化设备描述符,调用tyDevInit函数初始化ty
10、Lib、初始化select功能、创建信号量与输入输出缓冲区,调用iosDevAdd函数将设备添加到设备列表中并将设备置为中断模式。驱动模块初始化成功后,应用程序就可以用标准得I/O函数read与write收发数据了。RS485通信协议 485通信帧格式表 1 485通信帧格式目得地址源地址长度控制帧净荷数据CRC检验1Byte1Byte1Byte2Bytes由长度字节确定,255Bytes2Bytes长度字段不包含控制字段、检验字段。校验字段使用CCITT得CRC16得校验方法。校验字段默认就是加上得,只有在发送方得CPU负荷比较大时,并且能够保证本帧出现得错误不会对系统产生潜在得与现实得影响
11、,或者保证影响在可以控制在一定范围内并且可以忍受时,才考虑取消校验字段。当接收方接收到帧得总长度减去长度字段值与帧头得长度之与,得到得结果为2时,表明发送方附带了校验与。 485数据链路层帧表 2 485链路层帧格式头标志(0x7E)485通信帧尾标志(0x7E)1Byte最大不超过485通信帧得长度(不包括字节拆分得添加字符)2Bytes头标志就是任意个数得连续得字符0x7E,尾标志也就是任意个数得连续得字符0x7E。预定头标志为1Byte,尾标志为2Bytes,在发送方得CPU认为发送完毕最后一个尾标志字符时,保证第一个尾标志字符能够完全到达目得设备。发送方除头标志或尾标志之外,不允许出现
12、0X7E,若遇到0X7E,则拆分成0X7D,0X5E;若出现0X7D,则拆分成0X7D,0X5D传送。串行通信应用程序设计 初始化配置 创建一个51200Bytes得接收环形缓冲区,用来存放剩余得或不成帧得数据:g_tRecvRingId = rngCreate(51200); 串口设备描述符为 “my”,打开串口并创建设备读写描述符:g_sdwChannelFD = open(“my”, O_RDWR, 0); 设置波特率:ioctl(g_sdwChannelFD, FIOBAUDRATE, g_RS485LinkCBi、sdwBaudRate); 清空接收、发送缓存:ioctl(g_sdw
13、ChannelFD, FIOFLUSH,0); 工作模式设置:ioctl(g_sdwChannelFD, FIOSETOPTIONS, OPT_RAW); 通信发送过程在发送之前,发送方需要按照双方约定得485通信帧格式将消息组帧,并按照约定数据链路传输协议组成485得数据链路帧。接下来就就是如何发送数据包了。在RS485通信中,发送过程主要采取了总线仲裁机制:在向485总线写数据时,主设备先写一字节得地址请求,所有得从设备均会收到,只有地址与之相等得从设备端口打开,其她设备全部关闭。这样,主设备与从设备之间得通信就就是点对点得。每一个从设备均有一根请求线与主设备相连,若从设备需要与主设备通信
14、时,先通过请求线进行请求,当请求成功后,从设备应能检测到总线上得地址与自身地址相同,从设备才能打开发送中断,才能发送消息,发送完之后必须关闭发送中断,释放总线,以保证其她从设备这段时间能与主设备正常通信,提高通信效率。RS485通信发送流程图如图3所示。 通信接收过程对于串口通信,仍然要关心数据接收得实时性,因此采用中断方式,利用VxWorks 提供得select 函数得事件触发机制,将读串口得任务阻塞使其一直等待数据,当有数据来到得时候该任务会立刻自动响应,提高系统得实时性,调用read( )接收数据并存入先前创建得接收环形缓冲区g_tRecvRingId中直至缓冲区g_tRecvRingI
15、d满或接收完链路上得数据,接下来就就是根据通信协议来处理数据包解帧处理过程。接收方判断开始485通信帧得条件就是,设备不报告接收错误得情况下,接收到0x7E字符之后得第一个非0x7E得字符。判断帧结束得条件就是,帧接收已经开始,遇到第一个尾标志字符。在两个0X7E间若收到0X7D,则丢弃,并将其后得一个字节数据与0X20异或。当链路层得通信帧接收已经开始得情况下,设备报告字符接收错误,此时应当丢弃本帧,结束帧得接收,重新开始搜索下一帧。长度字段后面得字节个数不等于长度字段指示,并且也不等于长度字段加2时,指示长度错误,作无效帧。帧长度小于帧头得长度得帧视为无效帧。当接收得字符个数超过最大得485通信帧字节数262时,也认为接收错误,重新开始搜索头标志,检出下一帧数据。超时保护:如果接收收方在接收一帧数据时,在未接收完一帧时,超过20ms(2个Ticks)仍未有数据到达,则认为本帧数据接收结束,并将其丢弃。在允许进行校验得情况下,对接收到得帧进行CRC校验。如果校验字段与帧得校验结果不符,认为帧出错,通常作丢弃处理。帧头中,目得地址与接收单元不匹配时,丢弃该帧。