摘 要: 在利用单片机和无线数传模块进行无线数据通信时,通常的办法是通过单片机的串行I/ O 口来完成数据的串行通信。然而方法存在许多不足之处,如差错检测能力差、帧格式不灵活等。针对低速通信的场合,提出了一种通过单片机和无线数传模块以软件方式实现对传输数据编码、解码的原理和方法。数据的编码采用了曼彻斯特编码格式,每帧数据包括同步头、有效数据位和冗余校验位三部分。解码包括同步头和数据位的判定及循环冗余校验。在数据位的判定中提出了用软件实现“测三取二”的判定方法。该判定方法不但可以提高采样的准确度,而且还具有一定的滤波功能。实验结果表明,与单片机的串口通信相比,该编解码方法具有抗干扰能力强、传输数据灵活等优点。
利用单片机和无线数传模块来完成无线数据通信在石油、电力、水文、冶金等行业的无线控制、数据采集、报警诸多领域中有着广泛的应用前景。通常采用的办法是用单片机的串行I/ O 口来完成数据通信,但是该方法有许多不足之处:第一、在利用单片机的串口进行发送和接收数据时,对传输的数据只能进行奇偶校验,然而在无线通信场合,被传输的数据极易受到电磁、静电等的干扰,奇偶校验一般不能检测出这类干扰所引起的突发性错误,所以该方法无法满足差错检测要求较高的场合;第二、由于单片机一般采用异步通信方式,接受器通常不能很快的接收到有效数据,因而该方法也不能满足要求多路进行快速切换的场合;第三、单片机的串口通信在传输速率和每帧的有效数据位数等方面都受到了严格的限制,缺乏灵活性。本文针对低速无线通信的场合,提出了一种通过单片机用软件实现编解码的方案,该方案可以有效克服上述单片机串口通信的不足之处, 在无线通信中得到了令人满意的效果[1 - 4 ] 。
1 编码原理及程序流程
1. 1 编码原理
假设传输的数据精度为12 位,以A8BH 为例,其帧格式如图1 所示,高位在先,低位在后[5 ] 。数据的编码采用了曼彻斯特编码格式,每帧数据由同步头、有效数据位和校验位三部分组成。其中数据位“1”由高到低的跳变表示,数据位“0”由低到高的跳变表示,而且数据位“1”和“0”高低电平周期各为0. 5 T (设T 为一个数据位宽度) 。根据曼彻斯特码的特点,每个数据位都由高低电平组成,因而在连续传输的有效数据位中不会存在超过一个数据位宽度的高电平或低电平,因此在每个数据的前面设一个同步头,高低电平各为1. 5 T 。这样在进行接收数据时,只要采样得到的电平满足1. 5 T ,则认为该电平是同步头,开始接收数据。因为寻找同步头的时间最长不会超过一个数据的长度,所以此编码方式非常适合于要求多路进行快速切换的场合。为了简化电路和节省功耗,本文采用了单极性曼彻斯特码。
本文采用了循环冗余校验,即后四位为循环冗余校验码。循环冗余校验码简称为CRC ( CyclicRedundancy Code) 。循环冗余校验的指导思想是发送端将被传输的数据流多项式除以生成多项式得到冗余位,接收端将被传输的数据(包括冗余位) 除以事先确定的生成多项式,如果余数为零,则认为没有错误发生,不为零则表示有错。由于使用这种方法获得冗余位具有很强的信息覆盖能力,它善于发现各种类型的错误,特别是一些突发性错误,所以它是一种效率极高的差错校验法[6 ] 。
根据CRC 码的编码思想[7 ] ,对(16 ,12) 码,由x 16 + 1 确定生成多项式为G ( x ) = x 4 + 1 ,该多项式也可表示成(10001) 。对被传输的12 位数据和生成多项式采用模2 运算便可以得到每个数据的四位循环冗余位。
1. 2 编码子程序流程图及说明
曼彻斯特编码子程序包括计算冗余位和曼彻斯特编码发送两部分,首先调用CRC 求余子程序(流程图略) ,将得到的冗余校验位作为待发送16 位数据的低四位,然后对该16 位,并通过无线数传模块调制成模拟信号发射出去(单片机的TXD 端与无线数传模块发的DATA IN 端相连) 。同步头及数据位发送是通过对单片机的TXD 端( P3. 1) 置“1”和清“0”并进行软件延时来实现。TIME1 和TIME2 为软件延时,以满足同步头高低电平宽度的要求。值得注意的是,在编写编码子程序时,应确保P3. 1 置“1”和清“0”时间间隔满足数据位或同步头宽度的要求。
2 解码原理及程序流程
2. 1 解码原理
解码的思想是:首先进行同步头的判定,然后采用“测三取二”的法判断数据位,得到每帧的16 位数据,最后对得到的数据进行CRC 校验。
(1) 同步头的判定
首先对单片机的RXD 端( P3. 0) 进行连续采样,从P3. 0 引脚变低时开始计时,若低电平的时间达到1. 3 T ,则认为该电平为同步头。因为用无线数传模块得到的信号波形一般为梯形,所以接收到的实际高低电平宽度可能变小,因此若接收到低电平宽度达到1. 3 T ,则可近似认为该电平为某数据的同步头。
(2) 数据位的判定
对每个数据位的判定采用“测三取二”的方法,既将每个数据位的前半部分成16 个状态,在第7 、8 、9 状态检测P3. 0 引脚上的电平,取其大于等于2的相同值作为测得值,如表1 所示(表中“ x ”表示“0”或“1”) 。此检测方法是在高电平或低电平的中间位置进行采样,既提高了采样准确度又有一定的滤波功能。
(3) 循环冗余校验
对解码得到的16 位数据进行循环冗余校验,若余数为零,则认为传输正确,否则进行出错处理。
2. 2 解码子程序流程图及说明
解码子程序包括曼彻斯特解码和差错校验两部分,其流程图如图3 所示。首先进行同步头的判定,从RXD 端( P3. 0) 为低电平时开始计时(单片机的RXD 端与无线数传模块收的DATA OU T 端相连) ,并对P3. 0 引脚进行连续采样,采样时间间隔可自行设定,若P3. 0 引脚的低电平时间达到1. 3 T ,则认为该低电平为某数据的同步头,然后对同步头后面的数据位的前半位采用“测三取二”的方法进行数据位的判定,最后对采样得到的16 位数据进行循环冗余校验,若余数为0 ,则置错误标志,若不为0 ,则去掉冗余位, 得到12 位有效数据。TIME1~TIME3 是凑采样的时间间隔。
3 结论
实验证明,与单片机串口通信相比,使用该方案来进行无线数据通信抗干扰能力强,数据传输格式灵活。同时从软件编解码中可以发现,如果改变软件延时时间则可以改变系统的通信速率,设计者可以根据数据通信的实际需要自行设定。而且该编解码方案适合任何种类的单片机。因此该方案适合各种无线数据通信的场合。尽管软件编解码的最大缺点是系统独占主机,在有中断任务的系统中,将无法保证编解码程序运行时独占主机,但是可以使用上述方案用专门单片机作为编译码器,将其嵌入系统中,这样既克服了软件编解码程序独占主机的缺点,又充分利用了软件编解码的优点, 因此该方案也具有一定的通用性 。
来源:DVBCN数字电视中文网