rs232串口通信原理
rs232串口通信原理
VxWorks中串口驱动的实现
VxWorks操作系统是美国WindRiver公司设计开发的嵌入式实时操作系统
(RTOS),是嵌入式开发环境的关键组成部分。Vxworks操作系统的I/O系统有字的成语
可以提供简单、统一、与任何设备无关的接口。这些设备包括:面向字符设备、
随机块存储设备、虚拟设备、控制和监视设备以及网络设备。Vxworks的I/O系
统包括基本I/O系统和缓冲I/O系统,具有比其他I/O系统更快速,兼容性更
好的特性。这对于实时系统是很重要的。
串口驱动架构
基于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操作。
驱动初始化
串口设备的初始化xxDevInit流程如图2。
设备驱动的初始化过程首先调用系统函数ttyDrv(),该函数通过调用
iosDrvInstall()将ttyOpen()、ttyIoctl()、tyRead()、tyRead、tyWrite安装到
系统驱动函数表中,供I/O系统调用。
接着根据用户入参对串口芯片寄存器进行初始化,安装驱动函数指针。
最后调用系统函数ttyDevCreate()创建ttyDrv设备。该函数初始化设备描述符,
调用tyDevInit()函数初始化tyLib、初始化lect功能、创建信号量和输入输
出缓冲区,调用iosDevAdd()函数将设备添加到设备列表中并将设备置为中断
模式。
驱动模块初始化成功后,应用程序就可以用标准的I/O函数read()和write()收
发数据了。
RS-485通信协议
485通信帧格式
表1485通信帧格式
目的地址源地址长度
1Byte1Byte1Byte
控制
2Bytes
帧净荷数据CRC检验
由长度字节确定,
2Bytes
≤255Bytes
长度字段不包含控制字段、检验字段。校验字段使用CCITT的CRC16的校验
方法。校验字段默认是加上的,只有在发送方的CPU负荷比较大时,并且能够
保证本帧出现的错误不会对系统产生潜在的和现实的影响,或者保证影响在可
以控制在一定范围内并且可以忍受时,才考虑取消校验字段。当接收方接收到
帧的总长度减去长度字腐竹的做法大全家常菜 段值与帧头的长度之和,得到的结果为2时,表明发送
方附带了校验和。
485数据链路层帧
表24四四方方一座城 85链路层帧格式
头标志485通信帧尾标志
(0x7E)(0x7E)
最大不超过485通信帧的长度(不包括字节拆
2Bytes1Byte
分的添加字符)
头标志是任意个数的连续的字符0x7E,尾标志也是任意个数的连续的字符
0x7E。预定头标志为1Byte,尾标志为2Bytes,在发送方的CPU认为发送完
毕最后一个尾标志字符时,保证第一个尾标志字符能够完全到达目的设备。发
送方除头标志或尾标志之外,不允许出现0X7E,若遇到0X7E,则拆分成0X7D,
0X5E;若出现0X7D,则拆分成0X7D,0X5D传送。
串行通信应用程序设计
初始化配置
创建一个51200Bytes的接收环形缓冲区,用来存放剩余的或不成帧的数
据:g_tRecvRingId=rngCreate(51200);
•
串口设备描述符为“myCom”,打开串口并创建设备读写描述符:
•
g_sdwChannelFD=open(“myCom”,O_RDWR,0);
设置波特率:ioctl(g_sdwChannelFD,FIOBAUDRATE,
g_RS485LinkCB[i].sdwBaudRate);
•
清空接收、发送缓存:ioctl(g_sdwChannelFD,FIOFLUSH,0);
•
工作模式设置:ioctl(g_sdwChannelFD,FIOSETOPTIONS,OPT_RAW);
•
通信发送过程
在发送之前,发送方需要按照双方约定的485通信帧格式将消息组帧,并
按照约定数据链路传输协议组成485的数据链路帧。接下来就是如何发送
数据包了。
在RS-485通信中,发送过程主要采取了总线仲裁机制:
在向485总线写数据时,主设备先写一字节的地址请求,所有的从设备均会收
到,只有地址与之相等的从设备端口打开,其他设备全部关闭。这样,主设备
与从设备之间的通信就是点对点的。
每一个从设备均有一根请求线与主设备相连,若从设备需要与主设备通信时,先通过请求线进行请求,当骨折名词解释 请求成功后,从设备应能检测到总线上的地址与自
身地址相同,从设备才能打开发送中断,才能发送消息,发送完之后必须关闭
发送中断,释放总线,以保证其他从设备这段时间能与主设备正常通信,提高
通信效率。
RS-485通信发送流程图如图3所示。
通信接收过程
对于串口通信,仍然要关心数据接收的实时性,因此采用中断方式,利用
VxWorks提供的lect函数的事件触发机制,将读串口的任务阻塞使其一直
等待数据,当有数据来到的时候该任务会立超过的反义词 刻自动响应,提高系统的实时性,
调用read()接收数据并存入先前创建的接收环形缓冲区g_tRecvRingId中直至
缓冲区g_tRecvRingId满或接收完链路上的数据,接下来就是根据通信协议来
处理数据包――解帧处理过程。
接收方判断开始485通信帧的条件是,设备不报告接收错误的情况下,接收到
0x7E字符之后的第一个非0x7E的字符。判断帧结束的条件是,帧接收已经开
始,遇到第一个尾标志字符。在两个0X7E间若收到0X7D,则丢弃,并将其后
的一个字节数据与0X20异或。
当链路层的通信帧接收已经开始的情况下,设备报告字符接收错误,此时应当
丢弃本帧,结束帧的接收,重新开始搜索下一帧。
长度字段后面的字节个数不等于长度字段指示,并且也不等于长度字段加2时,
指示长度错误,作无效帧。帧长度小于帧头的长度的帧视为无效帧。当接收的
字符个数超过最大的485通信帧字节数——262时,也认为接收错误,重新开
始臭的英文 搜索头标志,检出下一帧数据。
超时保护:如果接收收方在接收一帧数据时,在未接收完一帧时,超过20ms
(2个Ticks)仍未有数据到达,则认为本帧数据接收结束,并将其丢弃。
在允许进行校验的情况下,对接收到有关春节手抄报 的帧进行CRC校验。如果校验字段与帧的
校验结果不符,认为帧出错,通常作三国历史简介 丢弃处理。
帧头中,目的地址与接收单元不匹配时,丢弃该帧。
本文发布于:2023-04-16 13:44:42,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/82/499534.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |