打印
[文档下载]

简单实用的单片机CRC

[复制链接]
2325|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dspmana|  楼主 | 2024-10-28 16:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机CRC快速算法是指在单片机上通过软件来实现的CRC计算算法,主要用于数据传输和存储中的数据正确性检验。CRC(循环冗余码)是一种常用的数据检验技术,广泛应用于测控及通信领域。CRC算法的基本思路是通过在数据序列后附加一个检验码,从而构成一个总长为n=p+r位的二进制序列,其中p位二进制数据序列D=[dp-1dp-2......d1d0],r位二进制检验码R=[rr-1rr-2....r1r0]。检验码R是通过对数据序列D进行二进制除法取余式运算得到的。本文提供了两种实用的单片机CRC快速算法,一种适用于51系列等单片机,另一种适用于PIC单片机。这两种算法都使用查表和简单的异或运算等操作,计算过程相当简捷,而计算速度却很快。第一种算法是基于CRC-CCITT标准生成多项式G=x16+x12+x5+1,用于51系列单片机。该算法将数据序列和检验码组成一个多字节序列,然后使用递推运算的规律对多字节序列进行除法取余式运算。每一次递推运算都是对一个三字节序列的计算,可以采用查表的办法来简化计算过程。第二种算法是基于CRC-CCITT标准生成多项式G=x16+x12+x5+1,用于PIC单片机。该算法与第一种算法类似,但计算过程更加简洁。它也使用递推运算的规律对多字节序列进行除法取余式运算,每一次递推运算都是对一个三字节序列的计算。这两种算法都能够快速地实现CRC计算,满足单片机的需求。它们的计算速度快,且占用资源少,非常适合小型低成本的单片机系统。crc算法的实现需要具备一定的数学基础和编程能力。开发者可以根据自己的需求选择合适的算法,并对其进行修改和优化,以满足不同的应用场景。在单片机系统中,CRC算法广泛应用于数据传输和存储中的数据正确性检验。例如,在串行通信中,CRC算法可以用于检验数据的正确性,以确保数据的可靠性。在存储器中,CRC算法可以用于检验数据的正确性,以确保数据的完整性。CRC算法是单片机系统中的一个重要组件,它能够确保数据的正确性和可靠性。开发者可以根据自己的需求选择合适的算法,并对其进行修改和优化,以满足不同的应用场景。

使用特权

评论回复
沙发
稳稳の幸福| | 2024-11-17 15:02 | 只看该作者
这个如果用的话,是不是两边都要用。

使用特权

评论回复
板凳
zhuomuniao110| | 2024-11-25 17:17 | 只看该作者
经常看到CRC,不知道如何用。

使用特权

评论回复
地板
mickit| | 2024-12-7 06:45 | 只看该作者
#include <stdint.h>

uint16_t crc16(const uint8_t *data, size_t len) {
    uint16_t crc = 0xFFFF;
    for (size_t i = 0; i < len; i++) {
        crc ^= (uint16_t)data[i];
        for (int j = 0; j < 8; j++) {
            if (crc & 0x0001) {
                crc >>= 1;
                crc ^= 0xA001;
            } else {
                crc >>= 1;
            }
        }
    }
    return crc;
}

使用特权

评论回复
5
belindagraham| | 2024-12-7 08:07 | 只看该作者
CRC算法基于一个特定的生成多项式G(x),通过二进制除法计算得到余数作为检验码。

使用特权

评论回复
6
uytyu| | 2024-12-9 11:39 | 只看该作者
程序空间受限,需要更为精简的算法设计。

使用特权

评论回复
7
primojones| | 2024-12-9 14:44 | 只看该作者
简单实用的错误检测技术,用于验证数据传输或存储过程中的准确性。

使用特权

评论回复
8
timfordlare| | 2024-12-9 17:56 | 只看该作者
对于带有硬件CRC单元的单片机,应充分利用硬件资源,以提高计算效率和节省代码空间。

使用特权

评论回复
9
AloneKaven| | 2024-12-10 11:18 | 只看该作者
CRC是不是查表法更好啊

使用特权

评论回复
10
kmzuaz| | 2024-12-10 14:22 | 只看该作者
// CRC-16多项式
#define CRC16_POLY 0x1021

// CRC-16查表
static const uint16_t crc16_table[256] = {
    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
    0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
    // ... 其他240个值 ...
};

// CRC-16初始化
uint16_t crc16_init(void) {
    return 0x0000;
}

// CRC-16更新
uint16_t crc16_update(uint16_t crc, uint8_t data) {
    return (crc << 8) ^ crc16_table[(crc >> 8) ^ data];
}

// CRC-16计算
uint16_t crc16_calculate(const uint8_t *data, uint16_t length) {
    uint16_t crc = crc16_init();
    for (uint16_t i = 0; i < length; i++) {
        crc = crc16_update(crc, data[i]);
    }
    return crc;
}

使用特权

评论回复
11
mikewalpole| | 2024-12-11 16:34 | 只看该作者
常见的算法包括查表法和直接计算法。

使用特权

评论回复
12
1988020566| | 2024-12-11 18:33 | 只看该作者
在单片机程序中,你可以在数据发送前计算CRC,并将CRC值附加到数据末尾。接收方收到数据后,可以重新计算CRC并与接收到的CRC值进行比较,以验证数据的完整性。

使用特权

评论回复
13
jimmhu| | 2024-12-11 19:30 | 只看该作者
单片机CRC快速算法通过简化计算过程、预计算表格和优化编码策略,实现了高效且资源友好的CRC计算。

使用特权

评论回复
14
macpherson| | 2024-12-11 20:53 | 只看该作者
#define POLYNOMIAL 0x07 // CRC-8标准多项式

uint8_t crc8(const uint8_t *data, size_t length) {
    uint8_t crc = 0xFF;
    for (size_t i = 0; i < length; ++i) {
        crc ^= data[i];
        for (int j = 0; j < 8; ++j) {
            if (crc & 0x80) {
                crc = (crc << 1) ^ POLYNOMIAL;
            } else {
                crc <<= 1;
            }
        }
    }
    return crc;
}

使用特权

评论回复
15
geraldbetty| | 2024-12-12 11:41 | 只看该作者
通过对原始查找表进行分析,找到其中重复或可以预测的数据模式,并根据这些模式设计一种更紧凑的数据结构。

使用特权

评论回复
16
hilahope| | 2024-12-12 22:38 | 只看该作者
单片机中的CRC(循环冗余校验)算法是一种常用的数据校验技术,用于确保数据的完整性和可靠性。

使用特权

评论回复
17
linfelix| | 2024-12-14 16:43 | 只看该作者
现在很多单片机都自带有硬件CRC单元,这为CRC的计算提供了硬件支持,可以大大提高计算速度,并节省代码空间

使用特权

评论回复
18
mikewalpole| | 2024-12-15 10:58 | 只看该作者
实现CRC检验的关键是通过软件高效快速地完成CRC计算。

使用特权

评论回复
19
yorkbarney| | 2024-12-15 12:21 | 只看该作者
这些算法不仅提高了数据处理的效率,还确保了通信系统的可靠性和稳定性。

使用特权

评论回复
20
primojones| | 2024-12-15 12:40 | 只看该作者
在单片机系统中,CRC算法广泛应用于数据传输和存储中的数据正确性检验。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

2583

帖子

2

粉丝