这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 奇偶校验算法实现一则

共1条 1/1 1 跳转至

奇偶校验算法实现一则

院士
2025-10-13 19:42:54     打赏
奇偶校验算法(Parity Check Algorithm)是一种简单的错误检测方法,用于验证数据传输中是否发生了位错误。通过在数据中添加一个附加的奇偶位(即校验位),来实现错误的检测和纠正。

在奇偶校验算法中,假设每个字节由8个比特(位)组成。奇偶校验位的值取决于数据字节中的1的个数。如果数据字节中1的个数是偶数个,奇偶校验位被设置为0;如果1的个数是奇数个,奇偶校验位被设置为1。这样,在接收端,通过统计接收到的数据字节中1的个数,就可以检测出位错误。


原理比较简单,我们再来看看在MCU中如何实现?我们设计以下应用场景,使用偶校验来验证保存在内存中一个word长度的数值,其最高为偶校验位,剩余31bit为有效位为例。C代码如下:
/**
 * @brief:  even check for uint32_t
 *
 * @param:
 * @return: 0= pass; 1= failed;
 * @note:
 */
int even_check(uint32_t dat)
{
    uint8_t i;
    uint8_t cnt = 0;
    for (i = 0; i < 32; i++)
    {
        if ((dat & 0x01) == 0x01)
        {
            cnt++;
        }
        dat = dat >> 1;
    }
    return (cnt & 0x01);
}

void even_ck_gen(uint32_t *buf)
{
    uint8_t i;
    uint8_t cnt = 0;
    uint32_t dat;
    *buf &= ~(0x80000000);
    dat = *buf;
    printf("dat = 0x%08X\r\n", dat);
    for (i = 0; i < 31; i++)
    {
        if ((dat & 0x01) == 0x01)
        {
            cnt++;
            printf("cnt = %d, dat= %08X\r\n", cnt, dat);
        }
        dat = dat >> 1;
    }
    if ((cnt & 0x01) == 0x01)
    {
        *buf |= 0x80000000;
    }
}

在没有ECC这样外置校验位的情况下,通过bit32来代表奇偶校验位,虽然舍弃了一位,但可以实现数据的自校验,带来一定的可靠性。在数据量不需要32bit长度时,可以采用此方法。




关键词: 偶校验     算法    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]