[제품종류] IEC1000Lite
[개발환경] Visual Studio 2008 C#
=============== 질 문 ===============안녕하세요 ZEUS 이상현 입니다.
우리쪽 PC와 SmartXDevice간 COM통신시 우리쪽에서 CRC16을 생성 후 전송하려고 하고 있습니다.
전송 받은 후 SmartX에 내장되어(SmartSerialPort - Propertice - ErrorCheckMode - CRC16) 있는 CRC16기능을 사용하여 Error Check를 하는 방식을 생각하고 있습니다.
SmartX에서 받을 수 있는 CRC16를 생성 하기 위해서는 Seed(Polynormal,Start)알아야 하는데 확인이 어려워 진행에 어려움이 있습니다.
Seed 값을 알려 주실수 있나요?
=============== 답 변 ===============
안녕하세요.
말씀하신 SmartX Framework에서 지원하는 CRC16 계산 관련 Code입니다. 참고하시어 적용하기시 바랍니다.
참고로 저희가 사용하는 CRC는 modbus CRC16 입니다.
초기값 -> 0xFFFF, Poly값 -> 0xA001 입니다.
public CRC16()
{
crctbl[0] = 0x0; crctbl[1] = 0xC1; crctbl[2] = 0x81; crctbl[3] = 0x40; crctbl[4] = 0x1; crctbl[5] = 0xC0; crctbl[6] = 0x80; crctbl[7] = 0x41; crctbl[8] = 0x1; crctbl[9] = 0xC0;
crctbl[10] = 0x80; crctbl[11] = 0x41; crctbl[12] = 0x0; crctbl[13] = 0xC1; crctbl[14] = 0x81; crctbl[15] = 0x40; crctbl[16] = 0x1; crctbl[17] = 0xC0; crctbl[18] = 0x80; crctbl[19] = 0x41;
crctbl[20] = 0x0; crctbl[21] = 0xC1; crctbl[22] = 0x81; crctbl[23] = 0x40; crctbl[24] = 0x0; crctbl[25] = 0xC1; crctbl[26] = 0x81; crctbl[27] = 0x40; crctbl[28] = 0x1; crctbl[29] = 0xC0;
crctbl[30] = 0x80; crctbl[31] = 0x41; crctbl[32] = 0x1; crctbl[33] = 0xC0; crctbl[34] = 0x80; crctbl[35] = 0x41; crctbl[36] = 0x0; crctbl[37] = 0xC1; crctbl[38] = 0x81; crctbl[39] = 0x40;
crctbl[40] = 0x0; crctbl[41] = 0xC1; crctbl[42] = 0x81; crctbl[43] = 0x40; crctbl[44] = 0x1; crctbl[45] = 0xC0; crctbl[46] = 0x80; crctbl[47] = 0x41; crctbl[48] = 0x0; crctbl[49] = 0xC1;
crctbl[50] = 0x81; crctbl[51] = 0x40; crctbl[52] = 0x1; crctbl[53] = 0xC0; crctbl[54] = 0x80; crctbl[55] = 0x41; crctbl[56] = 0x1; crctbl[57] = 0xC0; crctbl[58] = 0x80; crctbl[59] = 0x41;
crctbl[60] = 0x0; crctbl[61] = 0xC1; crctbl[62] = 0x81; crctbl[63] = 0x40; crctbl[64] = 0x1; crctbl[65] = 0xC0; crctbl[66] = 0x80; crctbl[67] = 0x41; crctbl[68] = 0x0; crctbl[69] = 0xC1;
crctbl[70] = 0x81; crctbl[71] = 0x40; crctbl[72] = 0x0; crctbl[73] = 0xC1; crctbl[74] = 0x81; crctbl[75] = 0x40; crctbl[76] = 0x1; crctbl[77] = 0xC0; crctbl[78] = 0x80; crctbl[79] = 0x41;
crctbl[80] = 0x0; crctbl[81] = 0xC1; crctbl[82] = 0x81; crctbl[83] = 0x40; crctbl[84] = 0x1; crctbl[85] = 0xC0; crctbl[86] = 0x80; crctbl[87] = 0x41; crctbl[88] = 0x1; crctbl[89] = 0xC0;
crctbl[90] = 0x80; crctbl[91] = 0x41; crctbl[92] = 0x0; crctbl[93] = 0xC1; crctbl[94] = 0x81; crctbl[95] = 0x40; crctbl[96] = 0x0; crctbl[97] = 0xC1; crctbl[98] = 0x81; crctbl[99] = 0x40;
crctbl[100] = 0x1; crctbl[101] = 0xC0; crctbl[102] = 0x80; crctbl[103] = 0x41; crctbl[104] = 0x1; crctbl[105] = 0xC0; crctbl[106] = 0x80; crctbl[107] = 0x41; crctbl[108] = 0x0; crctbl[109] = 0xC1;
crctbl[110] = 0x81; crctbl[111] = 0x40; crctbl[112] = 0x1; crctbl[113] = 0xC0; crctbl[114] = 0x80; crctbl[115] = 0x41; crctbl[116] = 0x0; crctbl[117] = 0xC1; crctbl[118] = 0x81; crctbl[119] = 0x40;
crctbl[120] = 0x0; crctbl[121] = 0xC1; crctbl[122] = 0x81; crctbl[123] = 0x40; crctbl[124] = 0x1; crctbl[125] = 0xC0; crctbl[126] = 0x80; crctbl[127] = 0x41; crctbl[128] = 0x1; crctbl[129] = 0xC0;
crctbl[130] = 0x80; crctbl[131] = 0x41; crctbl[132] = 0x0; crctbl[133] = 0xC1; crctbl[134] = 0x81; crctbl[135] = 0x40; crctbl[136] = 0x0; crctbl[137] = 0xC1; crctbl[138] = 0x81; crctbl[139] = 0x40;
crctbl[140] = 0x1; crctbl[141] = 0xC0; crctbl[142] = 0x80; crctbl[143] = 0x41; crctbl[144] = 0x0; crctbl[145] = 0xC1; crctbl[146] = 0x81; crctbl[147] = 0x40; crctbl[148] = 0x1; crctbl[149] = 0xC0;
crctbl[150] = 0x80; crctbl[151] = 0x41; crctbl[152] = 0x1; crctbl[153] = 0xC0; crctbl[154] = 0x80; crctbl[155] = 0x41; crctbl[156] = 0x0; crctbl[157] = 0xC1; crctbl[158] = 0x81; crctbl[159] = 0x40;
crctbl[160] = 0x0; crctbl[161] = 0xC1; crctbl[162] = 0x81; crctbl[163] = 0x40; crctbl[164] = 0x1; crctbl[165] = 0xC0; crctbl[166] = 0x80; crctbl[167] = 0x41; crctbl[168] = 0x1; crctbl[169] = 0xC0;
crctbl[170] = 0x80; crctbl[171] = 0x41; crctbl[172] = 0x0; crctbl[173] = 0xC1; crctbl[174] = 0x81; crctbl[175] = 0x40; crctbl[176] = 0x1; crctbl[177] = 0xC0; crctbl[178] = 0x80; crctbl[179] = 0x41;
crctbl[180] = 0x0; crctbl[181] = 0xC1; crctbl[182] = 0x81; crctbl[183] = 0x40; crctbl[184] = 0x0; crctbl[185] = 0xC1; crctbl[186] = 0x81; crctbl[187] = 0x40; crctbl[188] = 0x1; crctbl[189] = 0xC0;
crctbl[190] = 0x80; crctbl[191] = 0x41; crctbl[192] = 0x0; crctbl[193] = 0xC1; crctbl[194] = 0x81; crctbl[195] = 0x40; crctbl[196] = 0x1; crctbl[197] = 0xC0; crctbl[198] = 0x80; crctbl[199] = 0x41;
crctbl[200] = 0x1; crctbl[201] = 0xC0; crctbl[202] = 0x80; crctbl[203] = 0x41; crctbl[204] = 0x0; crctbl[205] = 0xC1; crctbl[206] = 0x81; crctbl[207] = 0x40; crctbl[208] = 0x1; crctbl[209] = 0xC0;
crctbl[210] = 0x80; crctbl[211] = 0x41; crctbl[212] = 0x0; crctbl[213] = 0xC1; crctbl[214] = 0x81; crctbl[215] = 0x40; crctbl[216] = 0x0; crctbl[217] = 0xC1; crctbl[218] = 0x81; crctbl[219] = 0x40;
crctbl[220] = 0x1; crctbl[221] = 0xC0; crctbl[222] = 0x80; crctbl[223] = 0x41; crctbl[224] = 0x1; crctbl[225] = 0xC0; crctbl[226] = 0x80; crctbl[227] = 0x41; crctbl[228] = 0x0; crctbl[229] = 0xC1;
crctbl[230] = 0x81; crctbl[231] = 0x40; crctbl[232] = 0x0; crctbl[233] = 0xC1; crctbl[234] = 0x81; crctbl[235] = 0x40; crctbl[236] = 0x1; crctbl[237] = 0xC0; crctbl[238] = 0x80; crctbl[239] = 0x41;
crctbl[240] = 0x0; crctbl[241] = 0xC1; crctbl[242] = 0x81; crctbl[243] = 0x40; crctbl[244] = 0x1; crctbl[245] = 0xC0; crctbl[246] = 0x80; crctbl[247] = 0x41; crctbl[248] = 0x1; crctbl[249] = 0xC0;
crctbl[250] = 0x80; crctbl[251] = 0x41; crctbl[252] = 0x0; crctbl[253] = 0xC1; crctbl[254] = 0x81; crctbl[255] = 0x40; crctbl[256] = 0x0; crctbl[257] = 0xC0; crctbl[258] = 0xC1; crctbl[259] = 0x1;
crctbl[260] = 0xC3; crctbl[261] = 0x3; crctbl[262] = 0x2; crctbl[263] = 0xC2; crctbl[264] = 0xC6; crctbl[265] = 0x6; crctbl[266] = 0x7; crctbl[267] = 0xC7; crctbl[268] = 0x5; crctbl[269] = 0xC5;
crctbl[270] = 0xC4; crctbl[271] = 0x4; crctbl[272] = 0xCC; crctbl[273] = 0xC; crctbl[274] = 0xD; crctbl[275] = 0xCD; crctbl[276] = 0xF; crctbl[277] = 0xCF; crctbl[278] = 0xCE; crctbl[279] = 0xE;
crctbl[280] = 0xA; crctbl[281] = 0xCA; crctbl[282] = 0xCB; crctbl[283] = 0xB; crctbl[284] = 0xC9; crctbl[285] = 0x9; crctbl[286] = 0x8; crctbl[287] = 0xC8; crctbl[288] = 0xD8; crctbl[289] = 0x18;
crctbl[290] = 0x19; crctbl[291] = 0xD9; crctbl[292] = 0x1B; crctbl[293] = 0xDB; crctbl[294] = 0xDA; crctbl[295] = 0x1A; crctbl[296] = 0x1E; crctbl[297] = 0xDE; crctbl[298] = 0xDF; crctbl[299] = 0x1F;
crctbl[300] = 0xDD; crctbl[301] = 0x1D; crctbl[302] = 0x1C; crctbl[303] = 0xDC; crctbl[304] = 0x14; crctbl[305] = 0xD4; crctbl[306] = 0xD5; crctbl[307] = 0x15; crctbl[308] = 0xD7; crctbl[309] = 0x17;
crctbl[310] = 0x16; crctbl[311] = 0xD6; crctbl[312] = 0xD2; crctbl[313] = 0x12; crctbl[314] = 0x13; crctbl[315] = 0xD3; crctbl[316] = 0x11; crctbl[317] = 0xD1; crctbl[318] = 0xD0; crctbl[319] = 0x10;
crctbl[320] = 0xF0; crctbl[321] = 0x30; crctbl[322] = 0x31; crctbl[323] = 0xF1; crctbl[324] = 0x33; crctbl[325] = 0xF3; crctbl[326] = 0xF2; crctbl[327] = 0x32; crctbl[328] = 0x36; crctbl[329] = 0xF6;
crctbl[330] = 0xF7; crctbl[331] = 0x37; crctbl[332] = 0xF5; crctbl[333] = 0x35; crctbl[334] = 0x34; crctbl[335] = 0xF4; crctbl[336] = 0x3C; crctbl[337] = 0xFC; crctbl[338] = 0xFD; crctbl[339] = 0x3D;
crctbl[340] = 0xFF; crctbl[341] = 0x3F; crctbl[342] = 0x3E; crctbl[343] = 0xFE; crctbl[344] = 0xFA; crctbl[345] = 0x3A; crctbl[346] = 0x3B; crctbl[347] = 0xFB; crctbl[348] = 0x39; crctbl[349] = 0xF9;
crctbl[350] = 0xF8; crctbl[351] = 0x38; crctbl[352] = 0x28; crctbl[353] = 0xE8; crctbl[354] = 0xE9; crctbl[355] = 0x29; crctbl[356] = 0xEB; crctbl[357] = 0x2B; crctbl[358] = 0x2A; crctbl[359] = 0xEA;
crctbl[360] = 0xEE; crctbl[361] = 0x2E; crctbl[362] = 0x2F; crctbl[363] = 0xEF; crctbl[364] = 0x2D; crctbl[365] = 0xED; crctbl[366] = 0xEC; crctbl[367] = 0x2C; crctbl[368] = 0xE4; crctbl[369] = 0x24;
crctbl[370] = 0x25; crctbl[371] = 0xE5; crctbl[372] = 0x27; crctbl[373] = 0xE7; crctbl[374] = 0xE6; crctbl[375] = 0x26; crctbl[376] = 0x22; crctbl[377] = 0xE2; crctbl[378] = 0xE3; crctbl[379] = 0x23;
crctbl[380] = 0xE1; crctbl[381] = 0x21; crctbl[382] = 0x20; crctbl[383] = 0xE0; crctbl[384] = 0xA0; crctbl[385] = 0x60; crctbl[386] = 0x61; crctbl[387] = 0xA1; crctbl[388] = 0x63; crctbl[389] = 0xA3;
crctbl[390] = 0xA2; crctbl[391] = 0x62; crctbl[392] = 0x66; crctbl[393] = 0xA6; crctbl[394] = 0xA7; crctbl[395] = 0x67; crctbl[396] = 0xA5; crctbl[397] = 0x65; crctbl[398] = 0x64; crctbl[399] = 0xA4;
crctbl[400] = 0x6C; crctbl[401] = 0xAC; crctbl[402] = 0xAD; crctbl[403] = 0x6D; crctbl[404] = 0xAF; crctbl[405] = 0x6F; crctbl[406] = 0x6E; crctbl[407] = 0xAE; crctbl[408] = 0xAA; crctbl[409] = 0x6A;
crctbl[410] = 0x6B; crctbl[411] = 0xAB; crctbl[412] = 0x69; crctbl[413] = 0xA9; crctbl[414] = 0xA8; crctbl[415] = 0x68; crctbl[416] = 0x78; crctbl[417] = 0xB8; crctbl[418] = 0xB9; crctbl[419] = 0x79;
crctbl[420] = 0xBB; crctbl[421] = 0x7B; crctbl[422] = 0x7A; crctbl[423] = 0xBA; crctbl[424] = 0xBE; crctbl[425] = 0x7E; crctbl[426] = 0x7F; crctbl[427] = 0xBF; crctbl[428] = 0x7D; crctbl[429] = 0xBD;
crctbl[430] = 0xBC; crctbl[431] = 0x7C; crctbl[432] = 0xB4; crctbl[433] = 0x74; crctbl[434] = 0x75; crctbl[435] = 0xB5; crctbl[436] = 0x77; crctbl[437] = 0xB7; crctbl[438] = 0xB6; crctbl[439] = 0x76;
crctbl[440] = 0x72; crctbl[441] = 0xB2; crctbl[442] = 0xB3; crctbl[443] = 0x73; crctbl[444] = 0xB1; crctbl[445] = 0x71; crctbl[446] = 0x70; crctbl[447] = 0xB0; crctbl[448] = 0x50; crctbl[449] = 0x90;
crctbl[450] = 0x91; crctbl[451] = 0x51; crctbl[452] = 0x93; crctbl[453] = 0x53; crctbl[454] = 0x52; crctbl[455] = 0x92; crctbl[456] = 0x96; crctbl[457] = 0x56; crctbl[458] = 0x57; crctbl[459] = 0x97;
crctbl[460] = 0x55; crctbl[461] = 0x95; crctbl[462] = 0x94; crctbl[463] = 0x54; crctbl[464] = 0x9C; crctbl[465] = 0x5C; crctbl[466] = 0x5D; crctbl[467] = 0x9D; crctbl[468] = 0x5F; crctbl[469] = 0x9F;
crctbl[470] = 0x9E; crctbl[471] = 0x5E; crctbl[472] = 0x5A; crctbl[473] = 0x9A; crctbl[474] = 0x9B; crctbl[475] = 0x5B; crctbl[476] = 0x99; crctbl[477] = 0x59; crctbl[478] = 0x58; crctbl[479] = 0x98;
crctbl[480] = 0x88; crctbl[481] = 0x48; crctbl[482] = 0x49; crctbl[483] = 0x89; crctbl[484] = 0x4B; crctbl[485] = 0x8B; crctbl[486] = 0x8A; crctbl[487] = 0x4A; crctbl[488] = 0x4E; crctbl[489] = 0x8E;
crctbl[490] = 0x8F; crctbl[491] = 0x4F; crctbl[492] = 0x8D; crctbl[493] = 0x4D; crctbl[494] = 0x4C; crctbl[495] = 0x8C; crctbl[496] = 0x44; crctbl[497] = 0x84; crctbl[498] = 0x85; crctbl[499] = 0x45;
crctbl[500] = 0x87; crctbl[501] = 0x47; crctbl[502] = 0x46; crctbl[503] = 0x86; crctbl[504] = 0x82; crctbl[505] = 0x42; crctbl[506] = 0x43; crctbl[507] = 0x83; crctbl[508] = 0x41; crctbl[509] = 0x81;
crctbl[510] = 0x80; crctbl[511] = 0x40;
}
public UInt16 crc16(byte[] modbusframe, int iStart, int iLen)
{
uint i;
uint index;
uint crc_Low = 0xFF;
uint crc_High = 0xFF;
for (i = (uint)iStart; i < (uint)iLen; i++)
{
index = crc_High ^ (char)modbusframe[i];
crc_High = crc_Low ^ crctbl[index];
crc_Low = (byte)crctbl[index + 256];
}
return (UInt16)(crc_High * 256 + crc_Low);
}
- 감사합니다.