CRC校验失败怎么办

CRC校验失败怎么办,第1张

CRC即循环冗余校验码,CRC校验失败可能原因和解决方法如下:

1、可能是安装包有问题 从新下载个安装包就好了。

2、有错误文件。解决方法:试着在解压时勾选保留错误文件,如果不行的话看看杀毒软件里是不是把这个文件隔离了。

3、可能是硬件原因,比如内存不够。只能换硬件了

校验原理

系统内部预先设置根据校验方法所导出的校验公式编制成的校验程序,当带有校验码的代码输入系统时,系统利用校验程序对输入的本体码进行运算得出校验结果之后,再将校验结果与输入代码的校验码进行对比来检测输入的正确与否。

如果两者一致,则表明代码输入正确,系统允许进入,如果不一致,则表明代码输入有误,系统拒绝进入,并要求代码重新输入。

'Text1Text 输入数据

'Text2Text 输出数据

Dim ReturnData(1) As Byte

Private Sub Command1_Click()

Dim CRC(2) As Byte

Dim d(6) As Byte '待传输数据

ReDim data(7) As Byte

For i = 0 To 5

data(i) = "&h" + Mid(Text1Text, 2 i + 1, 2)

DebugPrint data(i)

Next i

Call CRC16(data, UBound(data) - 2, data(6), data(7)) '调用CRC16计算函数

' CRC(0)为高位

' CRC(1)为低位

End Sub

Function CRC16(data() As Byte, i As Integer, ByRef ReturnDatalo As Byte, ByRef ReturnDatahi As Byte) As String

Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器

Dim CL As Byte, CH As Byte '多项式码&HA001

Dim SaveHi As Byte, SaveLo As Byte

Dim Flag As Integer

CRC16Lo = &HFF

CRC16Hi = &HFF

CL = &H1

CH = &HA0

For i = 0 To UBound(data) - 2

CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或

For Flag = 0 To 9

SaveHi = CRC16Hi

SaveLo = CRC16Lo

CRC16Hi = CRC16Hi \ 2 '高位右移一位

CRC16Lo = CRC16Lo \ 2 '低位右移一位

If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1

CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1

End If '否则自动补0

If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或

CRC16Hi = CRC16Hi Xor CH

CRC16Lo = CRC16Lo Xor CL

End If

Next Flag

Next i

ReturnDatahi = CRC16Hi 'CRC高位

ReturnDatalo = CRC16Lo 'CRC低位

DebugPrint Hex(CRC16Lo), Hex(CRC16Hi)

Text2Text = Text1Text & Hex(CRC16Lo) & Hex(CRC16Hi)

End Function

void vCRCCheckNumCalculate(unsigned char pCheckBuf,unsigned char u8Lth,unsigned char u8Low,unsigned char u8High)

{

unsigned char i;

unsigned char j;

unsigned int u16CRC=0xFFFF;

unsigned char TT;

for(j=0;j<u8Lth;j++)

{

u16CRC=u16CRC ^ pCheckBuf[j];

for(i=0;i<8;i++)

{

TT=u16CRC&1;

u16CRC=u16CRC>>1;

u16CRC=u16CRC&0x7fff;

if (TT==1)

u16CRC=u16CRC^0xa001;

//u16CRC=u16CRC&0xffff;

}

}

u8Low=(unsigned char)(u16CRC&0xFF);

u8High=u16CRC>>8;

0X1021 是一个16进制数,转换为十进制为4129,

二进制为00010000 00100001

存入CRC校验码中,高八位与低八位分开放,为buf[]={0X10,0X21};

你要是知道CRC怎么算的,请更新问题。我回来看,交流一下。我也弄CRC校验码呢。

uint crc16l(uchar ptr,uchar len)

就是一个宏么,uchar ptr指定数组,len是长度。你的crc算出来了?把代码发出来呗,我看看。还有CRC计算是,是整个发送的数组还是除去消息开始标识和结束标识?

先看些资料(可通过网络搜索),稍微了解CRC校验原理。其实该CRC校验的过程就是异或、移位、取余数。

目前CRC校验有直接计算和查表法。这两种方法我都用梯形图(编程语言: RSLOGIX 500 )实现过。

直接计算会让PLC的执行时间将变得很长,特别是当传输数据量大的时候,因为每个字节的每个位都要进行一次计算。

推荐用查表法,PLC执行快,一个字节查表一次,计算一次。至于算法可百度搜索,很多用C语言实现的,想办法把它转为梯形图实现就可以了,其实也并不需要知道它的原理。

以上就是关于CRC校验失败怎么办全部的内容,包括:CRC校验失败怎么办、vb,crc校验的程序、如何在Vc中编写CRC校验程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9342644.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存