另外有几个问题:
1. 关于第二点,原作者也提到正确的数据包,无论是aprs的数据还是普通tnc的数据传输过程都会以5、6个0x7e开始,这是为什么呢?原作者认为这是通讯系统用来互相同步时钟精度用的,但我也没看到原作者在代码里来测量这段时间,然后校正0x7e脉冲的时间误差。而是用一段经验值的范围来解0x7e。
2. 第四点,我观察到噪声的随机脉冲,和正确的数据的脉冲的方向和脉冲的宽度都不一样,不知道你有没有这样的体会?
3. 另外我看了你的流程图,你是找到0x7e之后开始,通过IO中断和定时器中断来逐位读取数据位的,对吗?定时器设置838us中断,到达后认为是1,没到达之前就有IO中断,则设定时器为430us,到达后为1?
1、引导码7E的位数不限,起码有1个,考虑到1个7E可能是乱码,一般发送方,发送大于5个连续的7E,接收方检测到连续5个7E(乱码同时是连续5个7E的概率很低,几乎不可能),才认为是找到了数据头,同时考虑到电台PTT触发的延时,有些电台有休眠功能,唤醒需要500MS左右,或是中继转发时,中继打开需要一些时间,为避免接收到的数据时,发送方7E起始数据已发完,可以适当调整7E的长度,比如连发30个7E,当然也可以发1200单音或2200单音来做延时,单听上去比较单调而已。
和时钟同步没有关系,解码也不是测量7E的误差的。
2、噪声的随机数据,通过解码程序来处理,流程图写的很清楚,当连续检测到2-5个以上的7E时,认为是有效数据包开头,否则认为是误码,循环检测7E,检测7E过程中,同时检查DET信号,在接收过程中,DET信号消失,认为是信号意外中断。这个参考FX604/614芯片手册的时序图。
解码的过程大致梳理下:
1、DET引发CPU中断,以任何一个电平做起始点,0、1均可,如是连续5个都是乱码(没有7E),一般认为是非数据信号比如语音信号等,退出中断;解码过程中DET消失,同样信号意外中断退出中断
2、检索到首个7E,直到起始段7E结束,继续解码直到再次遇到数据尾部的7E标志符,认为接收完一段完整的数据,接收过程中如遇DET消失,认为数据异常中断作废处理,退出中断
3、对接收的完整数据校验,需要校验的长度=字节总长度字节-2,不含7E。
比如接收到20个字节的数据,最后2个字节是接收到的校验值,对前18个数据进行计算校验和接收到的最后2个校验值对比,完全相同则数据有效,转换成KISS数据格式输出或其他格式串口输出。反之作废。噪音高、杂音等导致的数据误码是导致校验不成功的常见原因,因此接收保持信号59,解码成功率才会高。
3、解码就只有DET中断,没有其他中断了。解码过程中没有定时器中断参与,定时器就设置在定时状态。HDLC编码是用0、1电平的反转来表示数据位0、1,因此当接收脚的电平发生反转后,认为接收到一位0,从反转位置作为同步位置,开始计时,延时433us,是字节0位,重设定时器833US,在833US内如没有遇到反转,则读字节1位写入1,依次收完1个字节的8位。
保持位变化(上升沿/下降沿)同步,确保数据接收正确,可以对时序不是很标准的一些tt一定的兼容。
这种同步位解码的方法可以适应不同设备的时钟误差造成的时序(脉冲宽度)稍许误差。具体参考上面几楼的的流程示意图。
另外要说明的是,HDLC的解码和传统的串口不同,没有起始位和结束位,起始电平0、1任意,HDLC编码是用0、1电平的反转来表示数据位0、1,参考我画的HDLC编码格式示意图。
[ 此帖被BH4TDV在2012-06-25 22:46重新编辑 ]