
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校验程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)