modbusなどに用いられるチェックサムを計算する関数を用意したのでこちらに置いておきます。
CalcCRC.cs
/// <summary>
/// CRCを付加したいbyte列を第一引数に、第2引数の2byteに付加すべきCRC値を返します。[0]=下位[1]=上位(電文として送る時は下位から)
/// </summary>
/// <param name="message"></param>
/// <param name="CRC"></param>
public static void CalcCRC(List<byte> message, ref byte[] CRC)
{
ushort CRCFull = 0xFFFF;
byte CRCHigh = 0xFF, CRCLow = 0xFF;
char CRCLSB;
foreach (byte i in message)
{
CRCFull = (ushort)(CRCFull ^ i);
for (int j = 0; j < 8; j++)
{
CRCLSB = (char)(CRCFull & 0x0001);
CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF);
if (CRCLSB == 1)
CRCFull = (ushort)(CRCFull ^ 0xA001);
}
}
CRC[1] = CRCHigh = (byte)((CRCFull >> 8) & 0xFF);
CRC[0] = CRCLow = (byte)(CRCFull & 0xFF);
}
CalcLRC.cs
/// <summary>
/// LRCを計算します。先頭のヘッダ(:)をのぞいた伝文をbyteで渡してください。
/// binaryで計算していたものを放り込んでもOK(binaryではヘッダがないため)
/// </summary>
/// <param name="packet"></param>
/// <returns></returns>
private string GetLRC(byte[] packet)
{
int checksum = 0;
foreach (int c in packet)
{
checksum += c;
}
checksum = ~checksum;
checksum = checksum + 1;
checksum = checksum & 0xFF;
string result = string.Format("{0,2:X}", checksum);
return result;
}