串口发送 CRC校验 数据组合

/*==========================================
串口发送 CRC校验(程翔宇 chanceller@163.com)
==========================================*/

#include <stdio.h>
#include <string.h>

//模拟串口发送程序
void UartSendStr(unsigned char *p,unsigned char len)
{
    while (len--)
    {
        printf("%02x",*p++);
    }
}

//CRC校验程序
unsigned short CrcCheck(unsigned char*bufOut,unsigned char *buf,unsigned char length)
{
    unsigned short tmp,CRC;
    unsigned char i,j,CRCHi,CRCLo;    
    
     memcpy(bufOut,buf,length);    //前端存储原字符
    bufOut[length+2]='\0';        //后端存储结束符                 
    
    //CRC校验核心代码
    CRC=0xFFFF;
    for(i=0; i<length; i++)
    {        
                
        CRC=buf[i]^CRC;
            
        for(j=0;j<8;j++)
        {    
            tmp=CRC&0x0001;
            CRC=CRC>>1;
            if(tmp)
            CRC=CRC^0xA001;
        }    
    }    
    CRCLo = CRC & 0x00FF;
    CRCHi = CRC >> 8;
    
    bufOut[length]=CRCLo;    //CRC校验码存在原字符后面(低前高后)
    bufOut[length+1]=CRCHi;    //CRC校验码存在原字符后面(低前高后)
    
    return CRC;    //返回CRC校验码(高前低后)
}

int main()
{
    unsigned char i,j;
    
    unsigned char BufSize=12;//串口移位缓存大小(9(=7+2)个有效字节)    
    unsigned char SedBuf[BufSize];//模拟串口发送的数据存储字符串
//        'x','y','1',0x14,0x00,0x00,0x00,0x90,0x9A,'\r','\n','\0',
//        'x','z','1',0x26,0x00,0x00,0x00,0x9E,0x11,'\r','\n','\0',
//        'x','a','1',0x6A,0x19,0x00,0x00,0x5A,0xAD,'\r','\n','\0',    
    
    unsigned char ch[3][2]={{0x78,0x79},{'x','z'},"xa"};//识别字符串(命令头)
        
    //共用体。通过实际数据neData,获得存储的有效字节DP[4]
    union dataInt{
        unsigned char DP[4];
        int neData;
    }DataSed[3];
    
    char Adress='1';//地址位
    
    unsigned char CRCStr[10];    //存储CRC校验字符串
    unsigned char CRCRe;        //CRC校验值    
    
    unsigned char EndStr[3]={'\r','\n','\0'};//结束符
        
    //发送的有效整形数据
    DataSed[0].neData=20;
    DataSed[1].neData=38;
    DataSed[2].neData=6506;
        
    for(i=0;i<3;i++)//模拟串口发送3条不同命令头的数据程序
    {
        memcpy(SedBuf,ch[i],2);//命令头(2字节)
        memcpy(SedBuf+2,&Adress,1);//地址位(1字节)
        memcpy(SedBuf+2+1,DataSed[i].DP,4);//数据位(4字节)
        CRCRe=CrcCheck(SedBuf,SedBuf,2+1+4);//CRC校验位(2字节)
        memcpy(SedBuf+7+2,&EndStr,3);//末端标志位(3字节)
        
        //获得发往串口的字符串SedBuf(共12字节)
        UartSendStr(SedBuf,12);
        printf("\r\n");
        
    }
   return 0;
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程 翔宇

串口发送 CRC校验 数据组合

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值