当前位置: 首页 > 知识库问答 >
问题:

CRC16 CCITT代码-如何适应制造商样品源

傅啸
2023-03-14

当RFID阅读器处于自动模式时,它每读取一个标签就自动发送11个字节。CRC-此值使用除最后两个字节外的所有字节计算,这两个字节是CRCH(CRC高字节)和CRCL(CRC低字节)。

当我从阅读器读取RFID标签时,我得到了11个字节的传输...即(十六进制)<代码>01 0B 03 01 06 87分贝C7 FF E5 68。最后两个字节E568是消息的CRC16校验和。为了确认数据是否正确,我需要在目标点对010b03010687 DB C7 ff计算相同的CRC16。

我试着把所有的东西放在一起,但我没有太多的C编程经验,我的代码不起作用。

以下是源代码:

#include <stdio.h>
#include <stdlib.h>

// CRC16 from Netronix datasheet
void CRC16(unsigned char * Data, unsigned short * CRC, unsigned char Bytes)
    {
        int i, byte;
        unsigned short C;

        *CRC = 0;
        for (byte = 1; byte <= Bytes; byte ++, Data ++)
            {
                C = ((*CRC >> 8) ^ *Data) << 8;
                for (i = 0; i < 8; i ++)
                    {
                        if (C & 0x8000)
                            C = (C << 1) ^ 0x1021;
                        else
                            C = C << 1;
                    }
                *CRC = C ^ (*CRC << 8);
            }
    }


int main(void)
    {
        puts("Test...");

        unsigned char * Data16="10ac0501ff";
        unsigned short * CRC=0;
        unsigned char Bytes16=4;

        CRC16(Data16,CRC,Bytes16);

        puts(CRC);

        return EXIT_SUCCESS;
    }

我想做的是学习如何在工作示例中使用制造商代码-意味着如何得到crc16计算。

你能帮我做这个吗?谢了。

共有1个答案

长孙德惠
2023-03-14

使用您的源代码,我创建了以下程序

#include <stdio.h>
#include <stdlib.h>

// CRC16 from Netronix datasheet
void CRC16(unsigned char * Data, unsigned short * CRC, unsigned char Bytes)
{
    int i, byte;
    unsigned short C;

    *CRC = 0;
    for (byte = 1; byte <= Bytes; byte++, Data++)
    {
        C = ((*CRC >> 8) ^ *Data) << 8;
        for (i = 0; i < 8; i++)
        {
            if (C & 0x8000)
                C = (C << 1) ^ 0x1021;
            else
                C = C << 1;
        }
        *CRC = C ^ (*CRC << 8);
    }
}


int main(void)
{

    // When I read RFID tag from a reader I got 11 bytes transferred... i.e.
    // (hex)01 0B 03 01 06 87 DB C7 FF E5 68.
    // Last two bytes E5 68 are crc16.
    // In order to confirm the data is OK I need to calculate the same crc16
    // against 01 0B 03 01 06 87 DB C7 FF at the destination point.
    unsigned char  Data16[] = { 0x01, 0x0B, 0x03, 0x01, 0x06, 0x87, 0xDB, 0xC7, 0xFF };
    unsigned short CRC = 0;
    unsigned char Bytes16 = 9;

    CRC16(Data16, &CRC, Bytes16);

    printf(" CRC calculated is %x\n", CRC);

    return EXIT_SUCCESS;
}

输出为CRC computed is e568

我做了几个改变。

从您引用的文档中,有两种类型的框架或消息,其格式如下:

命令帧:

  • 模块地址(1字节)网络中每个模块的唯一地址
  • 帧长度(1字节)帧的全长(包括2字节校验和)
  • 命令(1字节)为偶数值的命令代码
  • 参数(可变长度)取决于命令的可选参数
  • CRCH(1字节)CRC16的上层字节
  • CRCL(1字节)CRC16的低字节
    null
 类似资料:
  • 源代码控制系统(又称版本控制系统)让你高效地管理工程。他们对一个人是很有用的,对一个团队是至关重要的。它们追踪不同版本里的所有改变,以至于所有代码都未曾丢失,其含义可以归属于改变。有了源代码控制系统,一个人可以自信地写一些而半途而废的代码和调试的代码,因为你修改的代码被仔细地与提交的、官方的即将与团队共享或发布的代码分割开。 我挺晚才开始意识到源代码控制系统的好处,但现在即使是一个人的工程,我也不

  • 我有这个nodeJS代码,但每当我发布数据时,最新的数据都会添加到末尾而不是开始。我试着添加

  • 我是android新手,所以,基本上我正在开发一个应用程序,它可以从ble设备获取数据,以便对其进行进一步的操作。我到目前为止所做的:- 我扫描了设备,得到了它们的rssi和macaddress,但当我试图在回调方法中获取scanRecord时,为了访问制造商数据,我得到了如下sparseArray:- 但是我想要的是这样,

  • 问题内容: 我正在尝试使用Java创建一个小程序来分叉两个新的子进程。它是针对初学者的编程课程的,他们的教程都使用C语言编写,因此,我正在寻求一些帮助,以了解此技巧,以及将其适应基于Java的程序的最佳方法(最终在它)。 更新: 我应该给每个子进程及其父进程附加一个ID,在子进程执行时打印信息,并在终止时打印终止通知。现在,我看到上面的这段代码列出了当前目录的内容,并在进程终止时显示“ Child

  • 合约持仓数据 接口名称 variety_positions 接口描述 合约持仓数据接口 请求参数 参数名 说明 举例 fields 多头/空头 longs: 返回多头数据; shorts: 返回空头数据 code 合约代号 rb1810 date 查询日期 2018-08-08 返回参数 参数名 类型 说明 longs array 多头龙虎榜 shorts array 空头龙虎榜 broker s

  • 一、商品品牌 为商品分类绑定品牌后,在商家后台发布商品或编辑的商品的时候页面中会根据商品所属分类调用分类所绑定的品牌列表,否则不会显示出品牌列表。 添加商品品牌: 1、品牌首字母:指品牌的首字母。 2、图片(建议使用宽22像素-高60像素内的GIF或PNG透明图片;点击下方”保存“按钮后生效):指上传品牌的图片。 3、品牌推荐广告图(建议使用宽22像素-高60像素内的GIF或PNG透明图片;点击下