43 lines
1.4 KiB
C#
43 lines
1.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace DM_Weight.Common
|
|
{
|
|
public class CRC16MODBUS
|
|
{
|
|
/// Name: CRC-16/MODBUS x16+x15+x2+1
|
|
/// Poly: 0x8005
|
|
/// Init: 0xFFFF
|
|
/// Refin: true
|
|
/// Refout: true
|
|
/// Xorout: 0x0000
|
|
///******************************添加数据CRC16MODBUS校验位*******************************************
|
|
public static byte[] CrcModBus(byte[] buffer, int start = 0, int len = 0)
|
|
{
|
|
if (buffer == null || buffer.Length == 0) return null;
|
|
if (start < 0) return null;
|
|
if (len == 0) len = buffer.Length - start;
|
|
int length = start + len;
|
|
if (length > buffer.Length) return null;
|
|
ushort crc = 0xFFFF;// Initial value
|
|
for (int i = start; i < length; i++)
|
|
{
|
|
crc ^= buffer[i];
|
|
for (int j = 0; j < 8; j++)
|
|
{
|
|
if ((crc & 1) > 0)
|
|
crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005
|
|
else
|
|
crc = (ushort)(crc >> 1);
|
|
}
|
|
}
|
|
byte[] ret = BitConverter.GetBytes(crc);
|
|
//Array.Reverse(ret);
|
|
return ret;
|
|
}
|
|
}
|
|
}
|