论坛风格切换切换到宽版
  • 4290阅读
  • 18回复

APRS 之 CRC 算法讨论 [复制链接]

上一主题 下一主题
离线阳达
 
发帖
57
只看楼主 倒序阅读 0楼 发表于: 2018-11-30


基于以上论述,编写APRS 之 CRC 代码,该怎么做呢?诚盼高手不吝赐教,谢谢!
QQ:959765617
Eagle Eye 软件论坛QQ群:619707043
离线BG4UVR
发帖
11205
只看该作者 1楼 发表于: 2018-11-30
你搜一下 WhereAVR,源代码里估计有很多你需要的细节。
离线阳达
发帖
57
只看该作者 2楼 发表于: 2018-12-01
回 BG4UVR 的帖子
BG4UVR:你搜一下 WhereAVR,源代码里估计有很多你需要的细节。 (2018-11-30 18:40) 

现在的问题不是没有源代码,而是找到的源代码太多了,五花八门!还有就是在线的CRC计算器,种类繁多,计算出来的结果各异,只可惜没一个跟APRS范例中给出的结果一致!
QQ:959765617
Eagle Eye 软件论坛QQ群:619707043
离线BG4UVR
发帖
11205
只看该作者 3楼 发表于: 2018-12-01
回 阳达 的帖子
阳达:现在的问题不是没有源代码,而是找到的源代码太多了,五花八门!还有就是在线的CRC计算器,种类繁多,计算出来的结果各异,只可惜没一个跟APRS范例中给出的结果一致! (2018-12-01 04:36)

我说的这个代码里,CRC校验的方法是正确的。

这是发送校验,每次校验发送的bit(在bi0位)。在发送时,除了帧标志的0x7e,和插入5个1后的0位,所有bit都需要参与这个校验。注意发送字符时bit的顺序是从低位到高位的。
  1. /******************************************************************************/
  2. extern void ax25crcBit(int lsb_int)
  3. /*******************************************************************************
  4. * ABSTRACT:    This function takes the latest transmit bit and modifies the crc.
  5. *
  6. * INPUT:        lsb_int    An integer with its least significant bit set of cleared
  7. * OUTPUT:    None
  8. * RETURN:    None
  9. */
  10. {
  11.     static unsigned short    xor_int;
  12.     xor_int = crc ^ lsb_int;                // XOR lsb of CRC with the latest bit
  13.     crc >>= 1;                                    // Shift 16-bit CRC one bit to the right
  14.     if (xor_int & 0x0001)                    // If XOR result from above has lsb set
  15.     {
  16.         crc ^= 0x8408;                            // Shift 16-bit CRC one bit to the right
  17.     }
  18.     return;
  19. }        // End ax25crcBit(int lsb_int)


这是接收字符时的校验。需要从接收到帧头开始除0x7e之外,一直到帧尾0x7e的之间的全部字节减去最后2字节,因为最后2个字符就是CRC校验值了。注意校验值是16位的,低位字节在前。
  1. /******************************************************************************/
  2. extern void ax25rxByte(unsigned char rxbyte)
  3. /*******************************************************************************
  4. * ABSTRACT:    This function calculates the crc of the incomming message.
  5. *
  6. * INPUT:        txbyte    The byte to transmit
  7. * OUTPUT:    None
  8. * RETURN:    None
  9. */
  10. {
  11.     static unsigned char        loop;            // Generic loop variable
  12.     static unsigned short    lsb_int;        // LSBit of incoming byte
  13.     static unsigned short    xor_int;        // Used for the IF statement
  14.     for (loop = 0 ; loop < 8 ; loop++)    // Loop through all eight bits
  15.     {
  16.         lsb_int = rxbyte & 0x01;            // Set aside the least significant bit
  17.         xor_int = crc ^ lsb_int;            // XOR lsb of CRC with the latest bit
  18.         crc >>= 1;                                // Shift 16-bit CRC one bit to the right
  19.         if (xor_int & 0x0001)                // If XOR result from above has lsb set
  20.         {
  21.             crc ^= 0x8408;                        // XOR the crc with magic number
  22.         }
  23.         rxbyte >>= 1;                            // Shift the reference byte one bit right
  24.     }
  25.     return;
  26. }        // End ax25rxByte(unsigned char rxbyte)


两个函数中的crc是全局变量,用于存储校验值。注意开始发送和开始接收校验前,要设置为0xffff,祝顺利~



[ 此帖被BG4UVR在2018-12-01 13:57重新编辑 ]
离线BG4UVR
发帖
11205
只看该作者 4楼 发表于: 2018-12-01
这个回复的表述不正确,删除。
[ 此帖被BG4UVR在2018-12-01 14:56重新编辑 ]
离线阳达
发帖
57
只看该作者 5楼 发表于: 2018-12-01
附件是电脑合成的位置信标录音,拜托有设备的台友测试一下能否识别吧,谢谢!
附件: 电脑合成位置信标.mp3 (11 K) 下载次数:23 [试播]
QQ:959765617
Eagle Eye 软件论坛QQ群:619707043
离线阳达
发帖
57
只看该作者 6楼 发表于: 2018-12-01
回 BG4UVR 的帖子
BG4UVR:我说的这个代码里,CRC校验的方法是正确的。
这是发送校验,每次校验发送的bit(在bi0位)。在发送时,除了帧标志的0x7e,和插入5个1后的0位,所有bit都需要参与这个校验。注意发送字符时bit .. (2018-12-01 09:02) 

反复核对过,你贴出的代码跟首帖文本描述一致,跟我的函数也是一致的,运算结果与CRC(循环冗余校验)在线计算(http://www.ip33.com/crc.html)选择:CRC-16/X25参数模型的计算结果也一致,但是,跟首贴文本随附范例的CRC值不一致,如果前帖附件中的音频大家都能够识别的话,那么就可以认为范例中的CRC值有误,否则,还有的折腾呢!
QQ:959765617
Eagle Eye 软件论坛QQ群:619707043
离线BG4UVR
发帖
11205
只看该作者 7楼 发表于: 2018-12-02
装AGWPE软件,是POCKET驱动引擎,内置多种TNC的驱动(最主要是里面有声卡虚拟TNC的驱动,让你不必拥有硬件TNC就能使用)。然后再装个AGWUIdigi软件,这是个aprs digi/igate软件,可以和上面的引擎配合工作。这两个软件本来就是同一个作者写的,就是写 AGW Tracker那位SV2AGW,应该在他的网站上可以找到。软件有些老,那个pe有时更改设置时可能不太稳定,但可以用,都是绿色软件。

这样你就可以用电脑来解码aprs音频并显示出来了,信号是否正确一看便知。
[ 此帖被BG4UVR在2018-12-02 08:41重新编辑 ]
离线BG4UVR
发帖
11205
只看该作者 8楼 发表于: 2018-12-02
回 阳达 的帖子
阳达:附件是电脑合成的位置信标录音,拜托有设备的台友测试一下能否识别吧,谢谢! (2018-12-01 18:29)

恭喜您了,经过测试,您的CRC结果是正确的,我解调出的数据是:

82 A0 88 8C 60 60 60 AE 6C B0 B2 B4 40 7E AE 92 88 8A 62 40 62 AE 92 88 8A 64 40 65 03 F0 21 33 33 35 33 2E 32 38 4E 2F 31 30 38 35 33 2E 32 38 45 3E 32 36 34 2F 30 30 30 43 4F 4D 4D 45 4E 54



W6XYZ-15 To APDF00 Via WIDE1-1,WIDE2-2 <UI pid=F0 Len=34 >[16:17:40]
!3353.28N/10853.28E>264/000COMMENT
[ 此帖被BG4UVR在2018-12-02 16:22重新编辑 ]
离线阳达
发帖
57
只看该作者 9楼 发表于: 2018-12-05
回 BG4UVR 的帖子
BG4UVR:恭喜您了,经过测试,您的CRC结果是正确的,我解调出的数据是:
82 A0 88 8C 60 60 60 AE 6C B0 B2 B4 40 7E AE 92 88 8A 62 40 62 AE 92 88 8A 64 40 65 03 F0 21 33 33 35 33 2E 32 38 4E 2F 31 30 38 35 33 2E 32 38 45 3E 32 36 34 2F 30 30  .. (2018-12-02 16:19) 

你提供的帮助非常专业,除了感激还有敬意!谢谢你!

这个结果符合预期,该做的功课都做了,如果还是通不过测试就没天理了;解码模块已经开始做了,预期应该比编码模块难度要高一些,毕竟传输链路的噪音和干扰不可避免;继续努力吧...
QQ:959765617
Eagle Eye 软件论坛QQ群:619707043
离线BG4RFF
发帖
1581
只看该作者 10楼 发表于: 2018-12-12
参观学习
BG4RFF
江苏如东、四川泸县
BG4RFF#163.com
QQ:4俩8拐拐勾4勾
手机:妖怪怪儿,五个妖狗动钩钩(防止恶意电话,先短信联系)
离线bh3pxn
发帖
754
只看该作者 11楼 发表于: 2019-02-18
回 BG4UVR 的帖子
BG4UVR:恭喜您了,经过测试,您的CRC结果是正确的,我解调出的数据是:
82 A0 88 8C 60 60 60 AE 6C B0 B2 B4 40 7E AE 92 88 8A 62 40 62 AE 92 88 8A 64 40 65 03 F0 21 33 33 35 33 2E 32 38 4E 2F 31 30 38 35 33 2E 32 38 45 3E 32 36 34 2F 30 30  .. (2018-12-02 16:19) 

学习了,请问哪有关于编解码的详细资料,一直以为是明文,没想到每个字节都是经过算法处理的
离线BG4UVR
发帖
11205
只看该作者 12楼 发表于: 2019-02-19
回 bh3pxn 的帖子
bh3pxn:学习了,请问哪有关于编解码的详细资料,一直以为是明文,没想到每个字节都是经过算法处理的 (2019-02-18 15:21) 

HDLC协议
离线bh3pxn
发帖
754
只看该作者 13楼 发表于: 2019-02-19
回 BG4UVR 的帖子
BG4UVR:HDLC协议 (2019-02-19 10:01) 

多谢,多谢
离线bh3pxn
发帖
754
只看该作者 14楼 发表于: 2019-02-23
回 BG4UVR 的帖子
BG4UVR:恭喜您了,经过测试,您的CRC结果是正确的,我解调出的数据是:
82 A0 88 8C 60 60 60 AE 6C B0 B2 B4 40 7E AE 92 88 8A 62 40 62 AE 92 88 8A 64 40 65 03 F0 21 33 33 35 33 2E 32 38 4E 2F 31 30 38 35 33 2E 32 38 45 3E 32 36 34 2F 30 30  .. (2018-12-02 16:19) 

40 40 6A 59 BB 5D 57 CF D4 76 4E 09 CF D2 A6 BA 49 CF D2 A6 BB 99 55 25 44 46 F4 BB E8 83 8B 51 73 17 89 6F FB ED 5C 04 00 5D 57 D7 46 64 7B 99 E0 01 40 40 00
我使用TCM3105解出来的数据是上面那些,难道这个输出端不能直接接到串口么?需要按要位来运算后才能得到正确数据?还是应该得到数据后再进行位运算
离线BG4UVR
发帖
11205
只看该作者 15楼 发表于: 2019-02-23
回 bh3pxn 的帖子
bh3pxn:40 40 6A 59 BB 5D 57 CF D4 76 4E 09 CF D2 A6 BA 49 CF D2 A6 BB 99 55 25 44 46 F4 BB E8 83 8B 51 73 17 89 6F FB ED 5C 04 00 5D 57 D7 46 64 7B 99 E0 01 40 40 00
我使用TCM3105解出来的数据是上面那些,难道这个输出端不能直接接到串口 .. (2019-02-23 10:22) 

CRC的计算过程最终只影响CRC校验值,并不会改变源数据。

“难道这个输出端不能直接接到串口么?”,这个输出是肯定不能直接输出到串口的,因为这并不是实际的数据,它是数据经过HDLC协议编码后的电平状态(变化和不变化)。

离线bh3pxn
发帖
754
只看该作者 16楼 发表于: 2019-02-23
回 BG4UVR 的帖子
BG4UVR:CRC的计算过程最终只影响CRC校验值,并不会改变源数据。
“难道这个输出端不能直接接到串口么?”,这个输出是肯定不能直接输出到串口的,因为这并不是实际的数据,它是数据经过HDLC协议编 .. (2019-02-23 11:11) 

今天用逻辑分析仪拿到了电平变化的图,但是怎么也得不到正确的数据,可能是硬件电路的问题了。非觉感谢您的回答。
离线bh3pxn
发帖
754
只看该作者 17楼 发表于: 2019-03-14
终于成功解码了楼主的那段音频
离线bi3nkc
只看该作者 18楼 发表于: 2019-03-14
坐小板凳顶楼上