当然了,你要做的就是给它传递参数,也就是你要计算的数据,char类型。一般的串口通信、网络通信都是字符型通信,更适用于LINUX里面的字符型设备。这个类是在Suse10.1下面用Kdevelop写的,全部使用ANSI C/C++编写,在Linux和WINOOWs均可以编译通过并且正确运行。 /************************************************************
crc16校验程序
uint crc16(uint crcdata,uchar bufdata)
形参:bufdata 需要校验数据
crcdata 校验后的数据
功能:接收字节crc校验,返回校验值
*************************************************************/
uint crc16(uint crcdata,uchar bufdata)
{
uchar i; PLC资料网
crcdata^=bufdata;
for(i=8;i>0;i--)
{
crcdata>>=1;
if(crcdata&0x01)
crcdata^=0xa001;
}
return crcdata;
} VBvbvbvbvbvbvbvvvvvvvvvvvvvvvvvvbbbbbbbbbbbbbbbbbb Private Sub Command1_Click()
Dim CRC() As Byte
Dim d() As Byte '待传输数据
ReDim d(5) As Byte
d(0) = 2 '02 03 00 00 00 04 lo44 hi3A d(1) = 3
d(2) = 0 PLC
d(3) = 0
d(4) = 0
d(5) = 4 '02 03 20 40 00 04 hi2E Lo4E
CRC = CRC16(d) '调用CRC16计算函数
'CRC(0)为高位
'CRC(1)为低位
End Sub
'注意:在数据传输时CRC的低位可能在前,而高位在后。
Function CRC16(data() As Byte) As String
Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器 PLC
Dim CL As Byte, CH As Byte '多项式码&HA001
Dim SaveHi As Byte, SaveLo As Byte
Dim i As Integer
Dim Flag As Integer
CRC16Lo = &HFF
CRC16Hi = &HFF
CL = &H1
CH = &HA0
For i = 0 To UBound(data) PLC
CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或
For Flag = 0 To 7
SaveHi = CRC16Hi
SaveLo = CRC16Lo
CRC16Hi = CRC16Hi \ 2 '高位右移一位
CRC16Lo = CRC16Lo \ 2 '低位右移一位
If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1 PLC资料网
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
Dim ReturnData(1) As Byte
ReturnData(0) = CRC16Hi 'CRC高位
ReturnData(1) = CRC16Lo 'CRC低位
CRC16 = ReturnData
End Function
本文关键字:C语言 PLC入门,plc技术 - PLC入门