- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
基于短距离无线传输的CSMA/CA协议实现方法
(3)无线接收数据至串口的实现
流程如图3所示。
2无线状态转换图
程序上电初始化后,第一次的无线状态为INITIAL_STATE初始化状态。初始化状态后,无线模块进入RX_STATE接收状态,将模块的接收天线打开。而后进入WAITING_FOR_ACK等待状态,等待接收无线数据。当接收到无线数据时,根据WT_Txbuffer0_Flag来判断此时接收到的数据帧为ACK还是数据帧:如果WT_Txbuffer0_Flag=0xff,则说明此时接收到的数据帧为ACK,进入WAITING_ACK处理,处理完毕,无线模块重新进入RX_STATE接收状态;如果WT_Txbuffer0_Flag=0x00,则说明此时接收到的数据为无线发送来的数据帧,进入GOOD_PACKET好包状态,处理完毕,无线模块重新进入RX_STATE接收状态。
无线状态转换图如图4所示。
3实现协议的关键
①串口数据帧的拷贝。为保存串口接收到的数据帧,并为以后能区分缓存不同的数据帧,设计了能缓存4个数据帧的缓存空间。在接收到串口的数据帧时,跟原来直接处理数据的做法不同,新的程序中,首先将数据存在缓存区中,如果缓存区满,则不再保存新的数据帧。
②串口缓存区数据帧的处理顺序。按照接收到数据的先后顺序进行处理。
③随机退避的处理。由于MCl3213不仅需要发送数据和接收数据,还需要与串口进行通信,此处随机退避采用中断方式,当退避时间到时,置退避时间完成标志位,而后进入随机退避完成的处理过程。
④无线数据帧3次重发的实现。DATA类型的数据如果发送不成功,需要有3次重传机制,实现过程与之前有很大不同。当数据发送成功后,在一定的时间内等待ACK,如果没有接收到ACK,则判断是否重传3次。
若未到3次,置重传标志位,重传数据帧,否则丢弃此帧。随机退避次数大于最大退避次数时,同样判断是否重传3次:若未到3次,置重传标志位,重传数据帧,否则丢弃此帧。在此帧数据没有发送成功,并且重传次数未到时,不处理之后的数据帧,保证重传的数据帧是需要重传的数据帧。
⑤无线模块的状态切换。为了保证无线模块状态切换的时序没有错误,防止由于无线模块状态切换而导致的严重问题,在CSMA_MAC协议实现过程中,无论对无线模块进行了什么操作,最终都需要把无线模块的状态置为RX_STATE,打开无线模块的接收天线。
⑥串口数据帧3次重发的实现。DATA类型的数据帧发送完成后,如果在一定的时间内未收到ACK,将对数据进行重发,直至收到ACK;或者重发超过3次,丢弃此帧。
4 测试结果
在我们搭建的一个无线定位小系统测试中,定位节点与定位卡通信,工作正常;两个定位节点之间的通信,定位节点收发状态正常,工作正常;定位节点将接收到的定位卡的数据帧转发至PC上,经过定位算法处理后,定位误差在2 m范围之内。
结 语
本文基于ZigBee基带芯片实现了简单的CSMA/CA协议,同时也适用于其他短距离无线通信系统。笔者已经在1套433 MHz定位系统中使用了同一协议,收到了良好的效果。本文介绍实现的只是基本的CSMA/CA协议,在应用于不同的无线通信系统中时,可以根据系统的特点再加以改进,就可以达到更好的无线通信效果。
来源:单片机与嵌入式系统应用
上一篇:基于FPGA的PROFIBUS-DP集线器设计
下一篇:探讨IP承载网络规划设计