Difference between revisions of "EPEVER 485"
(→Code: comments) |
(→Code) |
||
Line 539: | Line 539: | ||
} | } | ||
/////////////// | /////////////// | ||
+ | |||
+ | //rs[] : Response array of bytes of size BUFS | ||
+ | //addr : two bytes for address being assigned | ||
+ | //set : Boolean assigned to 'addr' | ||
+ | //confirmation : set HIGH to deliver command to device. | ||
byte zerofive(byte rs[],int addr, bool set, bool confirmation) | byte zerofive(byte rs[],int addr, bool set, bool confirmation) | ||
{ | { |
Revision as of 00:22, 18 November 2020
Contents
Synopsis
Issues 485 request and display result
Notes
9000-9100 Registers
0xFFFF9000 : 0x00 0xFFFF9001 : 0x70 0xFFFF9002 : 0x00 0xFFFF9003 : 0x86 0xFFFF9004 : 0x68 0xFFFF9005 : 0x5E 0xFFFF9006 : 0x54 0xFFFF9007 : 0x54 0xFFFF9008 : 0xC8 0xFFFF9009 : 0x50 0xFFFF900A : 0x00 0xFFFF900B : 0x00 0xFFFF900C : 0x60 0xFFFF900D : 0xAC 0xFFFF900E : 0x48 0xFFFF900F : 0x00 0xFFFF9010 : 0x64 0xFFFF9011 : 0x00 0xFFFF9012 : Error 0x02 0xFFFF9013 : 0x27 0xFFFF9014 : 0x15 0xFFFF9015 : 0x0B 0xFFFF9016 : 0x1E 0xFFFF9017 : 0x4C 0xFFFF9018 : 0x00 0xFFFF9019 : 0x1C 0xFFFF901A : 0x40 0xFFFF901B : 0x34 0xFFFF901C : 0x4C 0xFFFF901D : 0x02 0xFFFF901E : 0xE8 0xFFFF901F : 0x0A 0xFFFF9020 : 0xB0 0xFFFF9021 : 0x0A 0xFFFF9022 : Error 0x02 0xFFFF9023 : Error 0x02 0xFFFF9024 : Error 0x02 0xFFFF9025 : Error 0x02 0xFFFF9026 : Error 0x02 0xFFFF9027 : Error 0x02 0xFFFF9028 : Error 0x02 0xFFFF9029 : Error 0x02 0xFFFF902A : Error 0x02 0xFFFF902B : Error 0x02 0xFFFF902C : Error 0x02 0xFFFF902D : Error 0x02 0xFFFF902E : Error 0x02 0xFFFF902F : Error 0x02 0xFFFF9030 : Error 0x02 0xFFFF9031 : Error 0x02 0xFFFF9032 : Error 0x02 0xFFFF9033 : Error 0x02 0xFFFF9034 : Error 0x02 0xFFFF9035 : Error 0x02 0xFFFF9036 : Error 0x02 0xFFFF9037 : Error 0x02 0xFFFF9038 : Error 0x02 0xFFFF9039 : Error 0x02 0xFFFF903A : Error 0x02 0xFFFF903B : Error 0x02 0xFFFF903C : Error 0x02 0xFFFF903D : 0x00 0xFFFF903E : 0x00 0xFFFF903F : 0x00 0xFFFF9040 : Error 0x02 0xFFFF9041 : Error 0x02 0xFFFF9042 : 0x00 0xFFFF9043 : 0x00 0xFFFF9044 : 0x13 0xFFFF9045 : 0x00 0xFFFF9046 : 0x00 0xFFFF9047 : 0x06 0xFFFF9048 : 0x00 0xFFFF9049 : 0x00 0xFFFF904A : 0x13 0xFFFF904B : 0x00 0xFFFF904C : 0x00 0xFFFF904D : 0x06 0xFFFF904E : Error 0x02 0xFFFF904F : Error 0x02 0xFFFF9050 : Error 0x02 0xFFFF9051 : Error 0x02 0xFFFF9052 : Error 0x02 0xFFFF9053 : Error 0x02 0xFFFF9054 : Error 0x02 0xFFFF9055 : Error 0x02 0xFFFF9056 : Error 0x02 0xFFFF9057 : Error 0x02 0xFFFF9058 : Error 0x02 0xFFFF9059 : Error 0x02 0xFFFF905A : Error 0x02 0xFFFF905B : Error 0x02 0xFFFF905C : Error 0x02 0xFFFF905D : Error 0x02 0xFFFF905E : Error 0x02 0xFFFF905F : Error 0x02 0xFFFF9060 : Error 0x02 0xFFFF9061 : Error 0x02 0xFFFF9062 : Error 0x02 0xFFFF9063 : 0x1E 0xFFFF9064 : 0x02 0xFFFF9065 : 0x00 0xFFFF9066 : Error 0x02 0xFFFF9067 : 0x02 0xFFFF9068 : Error 0x02 0xFFFF9069 : 0x00 0xFFFF906A : 0x00 0xFFFF906B : 0x78 0xFFFF906C : 0x50 0xFFFF906D : 0x1E 0xFFFF906E : 0x50 0xFFFF906F : 0x28 0xFFFF9070 : 0x00 0xFFFF9071 : Error 0x02 0xFFFF9072 : Error 0x02 0xFFFF9073 : Error 0x02 0xFFFF9074 : Error 0x02 0xFFFF9075 : Error 0x02 0xFFFF9076 : Error 0x02 0xFFFF9077 : Error 0x02 0xFFFF9078 : Error 0x02 0xFFFF9079 : Error 0x02 0xFFFF907A : Error 0x02 0xFFFF907B : Error 0x02 0xFFFF907C : Error 0x02 0xFFFF907D : Error 0x02 0xFFFF907E : Error 0x02 0xFFFF907F : Error 0x02 0xFFFF9080 : Error 0x02 0xFFFF9081 : Error 0x02 0xFFFF9082 : Error 0x02 0xFFFF9083 : Error 0x02 0xFFFF9084 : Error 0x02 0xFFFF9085 : Error 0x02 0xFFFF9086 : Error 0x02 0xFFFF9087 : Error 0x02 0xFFFF9088 : Error 0x02 0xFFFF9089 : Error 0x02 0xFFFF908A : Error 0x02 0xFFFF908B : Error 0x02 0xFFFF908C : Error 0x02 0xFFFF908D : Error 0x02 0xFFFF908E : Error 0x02 0xFFFF908F : Error 0x02 0xFFFF9090 : 0x00 0xFFFF9091 : 0x00 0xFFFF9092 : 0x00 0xFFFF9093 : 0x00 0xFFFF9094 : 0x57 0xFFFF9095 : 0x00 0xFFFF9096 : 0x00 0xFFFF9097 : 0x38 0xFFFF9098 : 0xEE 0xFFFF9099 : Error 0x02 0xFFFF909A : Error 0x02 0xFFFF909B : Error 0x02 0xFFFF909C : Error 0x02 0xFFFF909D : Error 0x02 0xFFFF909E : Error 0x02 0xFFFF909F : Error 0x02 0xFFFF90A0 : 0x00 0xFFFF90A1 : 0x00 0xFFFF90A2 : 0x00 0xFFFF90A3 : 0x00 0xFFFF90A4 : 0x00 0xFFFF90A5 : Error 0x02 0xFFFF90A6 : Error 0x02 0xFFFF90A7 : Error 0x02 0xFFFF90A8 : Error 0x02 0xFFFF90A9 : Error 0x02 0xFFFF90AA : Error 0x02 0xFFFF90AB : Error 0x02 0xFFFF90AC : Error 0x02 0xFFFF90AD : Error 0x02 0xFFFF90AE : Error 0x02 0xFFFF90AF : Error 0x02 0xFFFF90B0 : 0xD2 0xFFFF90B1 : 0x60 0xFFFF90B2 : 0x13 0xFFFF90B3 : 0x7A 0xFFFF90B4 : 0x00 0xFFFF90B5 : 0xA7 0xFFFF90B6 : 0x89 0xFFFF90B7 : 0x35 0xFFFF90B8 : 0x75 0xFFFF90B9 : 0x87 0xFFFF90BA : 0x00 0xFFFF90BB : 0x00 0xFFFF90BC : Error 0x02 0xFFFF90BD : 0x00 0xFFFF90BE : 0x00 0xFFFF90BF : 0xE0 0xFFFF90C0 : Error 0x02 0xFFFF90C1 : Error 0x02 0xFFFF90C2 : Error 0x02 0xFFFF90C3 : Error 0x02 0xFFFF90C4 : Error 0x02 0xFFFF90C5 : Error 0x02 0xFFFF90C6 : Error 0x02 0xFFFF90C7 : Error 0x02 0xFFFF90C8 : Error 0x02 0xFFFF90C9 : Error 0x02 0xFFFF90CA : Error 0x02 0xFFFF90CB : Error 0x02 0xFFFF90CC : Error 0x02 0xFFFF90CD : Error 0x02 0xFFFF90CE : Error 0x02 0xFFFF90CF : Error 0x02 0xFFFF90D0 : Error 0x02 0xFFFF90D1 : Error 0x02 0xFFFF90D2 : Error 0x02 0xFFFF90D3 : Error 0x02 0xFFFF90D4 : Error 0x02 0xFFFF90D5 : Error 0x02 0xFFFF90D6 : Error 0x02 0xFFFF90D7 : Error 0x02 0xFFFF90D8 : Error 0x02 0xFFFF90D9 : Error 0x02 0xFFFF90DA : Error 0x02 0xFFFF90DB : Error 0x02 0xFFFF90DC : Error 0x02 0xFFFF90DD : Error 0x02 0xFFFF90DE : Error 0x02 0xFFFF90DF : Error 0x02 0xFFFF90E0 : Error 0x02 0xFFFF90E1 : Error 0x02 0xFFFF90E2 : Error 0x02 0xFFFF90E3 : Error 0x02 0xFFFF90E4 : Error 0x02 0xFFFF90E5 : Error 0x02 0xFFFF90E6 : Error 0x02 0xFFFF90E7 : Error 0x02 0xFFFF90E8 : Error 0x02 0xFFFF90E9 : Error 0x02 0xFFFF90EA : Error 0x02 0xFFFF90EB : Error 0x02 0xFFFF90EC : Error 0x02 0xFFFF90ED : Error 0x02 0xFFFF90EE : Error 0x02 0xFFFF90EF : Error 0x02 0xFFFF90F0 : Error 0x02 0xFFFF90F1 : Error 0x02 0xFFFF90F2 : Error 0x02 0xFFFF90F3 : Error 0x02 0xFFFF90F4 : Error 0x02 0xFFFF90F5 : Error 0x02 0xFFFF90F6 : Error 0x02 0xFFFF90F7 : Error 0x02 0xFFFF90F8 : Error 0x02 0xFFFF90F9 : Error 0x02 0xFFFF90FA : Error 0x02 0xFFFF90FB : Error 0x02 0xFFFF90FC : Error 0x02 0xFFFF90FD : Error 0x02 0xFFFF90FE : Error 0x02 0xFFFF90FF : Error 0x02
Code
1 //#include <SoftwareSerial.h>
2 //const int SSERIAL_RX_PIN = 10; //Soft Serial Receive pin
3 //const int SSERIAL_TX_PIN = 11; //Soft Serial Transmit pin
4
5 // Create Soft Serial Port object and define pins to use
6 //SoftwareSerial RS485Serial(SSERIAL_RX_PIN, SSERIAL_TX_PIN); // RX, TX
7
8 #define DEVICE 0x01
9 #define BUFS 64 //Buffer size
10 short crc;
11 byte arry[6] = {0x00, 0x02, 0x02, 0x00, 0x02, 0x00};
12 byte Response[BUFS];
13 byte Response_size;
14 byte countdown = 2;
15 //===============================================================================
16 // Initialization
17 //===============================================================================
18 void setup()
19 {
20 Serial.begin(115200); // Start the built-in serial port
21 Serial1.begin(115200); // Start the RS485 soft serial port
22 delay(1000);
23 Serial.println();
24
25
26 }
27
28
29 //===============================================================================
30 // Main
31 //===============================================================================
32 void loop()
33 {
34 int start_register = 0x903D //binary value of register starting location
35 int num_registers = 0x0003 //Number of registers, only 16-bit for consistency
36 //0x007B is the maximum value
37
38
39 Response_size = onezero(Response, start_register, num_registers, arry, LOW);
40 if(Response_size==0) Serial.println("Received Error from 0x01");
41
42 Serial.print("Size is : ");
43 Serial.println(Response_size);
44
45 Serial.print("Response string is : ");
46 for(byte i=0;i<Response_size;i++)
47 {
48 Serial.print("0x");
49 if(Response[i]<16) Serial.print("0");
50 Serial.print(Response[i],HEX);
51 Serial.print(" ");
52 }
53 Serial.println();
54
55 while(1)
56 {}
57 }
58
59 byte zeroone(byte rs[],int start, int num)
60 {
61 byte rq[8]; //Always 8 bytes
62 //int addr;
63 //int len;
64 short c; //CRC value
65 byte i, j,sz; //Counters, size
66
67 if(num==0 || num>0x7d0)
68 {
69 Serial.println("Illegal quantity of inputs");
70 return 0;
71 }
72
73
74 rq[0]=DEVICE; //Global device IO
75 rq[1]=0x01;
76 rq[3]=byte(start&0x00FF);
77 rq[2]=byte((start&0xFF00)>>8);
78 rq[5]=byte(num&0x00FF);
79 rq[4]=byte((num&0xFF00)>>8);
80
81 c = CRC16(rq,6);
82 rq[7]=0x00FF & c;
83 rq[6]=c>>8;
84
85 for(i=0;i<8;i++)
86 {
87 Serial1.write(rq[i]);
88 }
89 sz = 5+rq[5];
90 //if((rq[5]%8)!=0 && rq[5]>8) sz++; //Refer to *N at top of Page 12
91 if(sz>BUFS)
92 {
93 Serial.println("Buffer overflow prevented in 0x01. Recompile with BUFS to a higher value");
94 return 0;
95 }
96 for(i=0;i<sz;)
97 {
98 if (Serial1.available()) //Data from the Slave is available
99 {
100 rs[i]=Serial1.read();
101 if(i==1 && rs[i]==0x83) sz=5;
102 i++;
103 }
104
105 }
106 c=CRC16(rs,sz-2);
107 if(c!=short((rs[sz-2]<<8 | rs[sz-1])))
108 {
109 Serial.println("CRC error in 0x01");
110 return 0;
111 }
112
113 return sz;
114 }
115
116
117 byte zerotwo(byte rs[], int start, int num)
118 {
119 byte rq[8]; //Always 8 bytes
120 //int addr;
121 //int len;
122 short c; //CRC value
123 byte i, j,sz; //Counters, size
124
125 rq[0]=DEVICE; //Global device IO
126 rq[1]=0x02;
127 rq[3]=byte(start&0x00FF);
128 rq[2]=byte((start&0xFF00)>>8);
129 rq[5]=byte(num&0x00FF);
130 rq[4]=byte((num&0xFF00)>>8);
131
132 c = CRC16(rq,6);
133 rq[7]=0x00FF & c;
134 rq[6]=c>>8;
135
136 for(i=0;i<8;i++)
137 {
138 Serial1.write(rq[i]);
139 }
140 sz = 5+rq[5];
141 if(sz>BUFS)
142 {
143 Serial.println("Buffer overflow prevented in 0x02. Recompile with BUFS to a higher value");
144 return 0;
145 }
146 for(i=0;i<sz;)
147 {
148
149 if (Serial1.available()) //Data from the Slave is available
150 {
151 rs[i]=Serial1.read();
152 i++;
153 }
154 }
155 c=CRC16(rs,sz-2);
156 if(c!=short((rs[sz-2]<<8 | rs[sz-1])))
157 {
158 Serial.println("CRC error in 0x02");
159 return 0;
160 }
161 return sz;
162 }
163
164 byte zerothree(byte rs[],int start, int num)
165 {
166 byte rq[8]; //Always 8 bytes
167 //int addr;
168 //int len;
169 short c; //CRC value
170 byte i, j,sz; //Counters, size
171
172 if(num==0 || num>0x7d)
173 {
174 Serial.println("Illegal quantity of inputs");
175 return 0;
176 }
177
178
179 rq[0]=DEVICE; //Global device IO
180 rq[1]=0x03;
181 rq[3]=byte(start&0x00FF);
182 rq[2]=byte((start&0xFF00)>>8);
183 rq[5]=byte(num&0x00FF);
184 rq[4]=byte((num&0xFF00)>>8);
185
186 c = CRC16(rq,6);
187 rq[7]=0x00FF & c;
188 rq[6]=c>>8;
189
190 for(i=0;i<8;i++)
191 {
192 Serial1.write(rq[i]);
193 }
194 sz = 5+rq[5]*2;
195 if(sz>BUFS)
196 {
197 Serial.println("Buffer overflow prevented in 0x03. Recompile with BUFS to a higher value");
198 return 0;
199 }
200 for(i=0;i<sz;)
201 {
202 if (Serial1.available()) //Data from the Slave is available
203 {
204 rs[i]=Serial1.read();
205 if(i==1 && rs[i]==0x83) sz=5;
206 i++;
207 }
208
209 }
210 c=CRC16(rs,sz-2);
211 if(c!=short((rs[sz-2]<<8 | rs[sz-1])))
212 {
213 Serial.println("CRC error in 0x03");
214 return 0;
215 }
216
217 return sz;
218 }
219
220
221
222 //Assigns rs[] array, returns size or zero for CRC error
223 //This does NOT detect broadcast CRC errors, or any exception
224 //handling at all
225 //
226 // rs : Response[] array
227 // start : Starting address
228 // num : Number of registers requested
229 byte zerofour(byte rs[],int start, int num)
230 {
231 byte rq[8]; //Always 8 bytes
232 //int addr;
233 //int len;
234 short c; //CRC value
235 byte i, j,sz; //Counters, size
236
237 rq[0]=DEVICE; //Global device IO
238 rq[1]=0x04;
239 rq[3]=byte(start&0x00FF);
240 rq[2]=byte((start&0xFF00)>>8);
241 rq[5]=byte(num&0x00FF);
242 rq[4]=byte((num&0xFF00)>>8);
243
244 c = CRC16(rq,6);
245 rq[7]=0x00FF & c;
246 rq[6]=c>>8;
247
248 for(i=0;i<8;i++)
249 {
250 Serial1.write(rq[i]);
251 }
252 sz = 5+rq[5]*2;
253 if(sz>BUFS)
254 {
255 Serial.println("Buffer overflow prevented in 0x04. Recompile with BUFS to a higher value");
256 return 0;
257 }
258 for(i=0;i<sz;)
259 {
260
261 if (Serial1.available()) //Data from the Slave is available
262 {
263 rs[i]=Serial1.read();
264 i++;
265 }
266 }
267 c=CRC16(rs,sz-2);
268 if(c!=short((rs[sz-2]<<8 | rs[sz-1])))
269 {
270 Serial.println("CRC error in 0x04");
271 return 0;
272 }
273
274 return sz;
275 }
276 ///////////////
277
278 //rs[] : Response array of bytes of size BUFS
279 //addr : two bytes for address being assigned
280 //set : Boolean assigned to 'addr'
281 //confirmation : set HIGH to deliver command to device.
282 byte zerofive(byte rs[],int addr, bool set, bool confirmation)
283 {
284 byte rq[8]; //Always 8 bytes
285 //int addr;
286 //int len;
287 short c; //CRC value
288 byte i, j,sz; //Counters, size
289
290
291 rq[0]=DEVICE; //Global device IO
292 rq[1]=0x05;
293 rq[3]=byte(addr&0x00FF);
294 rq[2]=byte((addr&0xFF00)>>8);
295 rq[4]=0x00;
296 if(set) rq[5]=0xFF;
297 else rq[5]=0x00;
298
299
300 c = CRC16(rq,6);
301 rq[7]=0x00FF & c;
302 rq[6]=c>>8;
303 if(confirmation)
304 {
305 for(i=0;i<8;i++)
306 {
307 Serial1.write(rq[i]);
308 }
309 }
310 sz = 6;
311 if(sz>BUFS)
312 {
313 Serial.println("Buffer overflow prevented in 0x03. Recompile with BUFS to a higher value");
314 return 0;
315 }
316 if(confirmation)
317 {
318 for(i=0;i<sz;)
319 {
320 if (Serial1.available()) //Data from the Slave is available
321 {
322 rs[i]=Serial1.read();
323 if(i==1 && rs[i]==0x83) sz=5;
324 i++;
325 }
326 }
327 }
328 else
329 {
330 for(i=0;i<sz;)
331 {
332 rs[i]=rq[i];
333 i++;
334 }
335 }
336 c=CRC16(rs,sz-2);
337 if(c!=short((rs[sz-2]<<8 | rs[sz-1])))
338 {
339 Serial.println("CRC error in 0x03");
340 return 0;
341 }
342 }
343 ///////////////
344 byte onezero(byte rs[],int start, int num, byte arr[], bool confirmation)
345 {
346 byte rq[132]; //This is the size of the maximum possible buffer
347 short c; //CRC value
348 byte i, j,sz; //Counters, size
349
350 if(num==0 || num>0x7B)
351 {
352 Serial.println("Invalid number of registers being written in 0x10.");
353 return 0;
354 }
355 rq[0]=DEVICE; //Global device IO
356 rq[1]=0x10;
357 rq[3]=byte(start&0x00FF);
358 rq[2]=byte((start&0xFF00)>>8);
359 rq[5]=byte(num&0x00FF);
360 rq[4]=byte((num&0xFF00)>>8);
361
362 rq[6]=num<<1; //num<<1 is same as num*2, but faster
363 //total number of 8-bit bytes
364
365 //Copies the array in parameter list into the request.
366 //From o to 2*num bytes
367 for(int i=0;i<(num<<1);i++)
368 {
369 rq[7+i]=arr[i];
370 }
371
372 //Calculates the CRC
373 c = CRC16(rq,7+(num<<1));
374 //copies the CRC 16 bits into two bytes in the array using bit masking
375 //High byte is stored into [8+2*num]
376 //Low byte is stored into [7+2*num]
377 rq[8+(num<<1)] = 0x00FF & c; //Erase upper bits, copy only the lower 8 by bitwise AND
378 rq[7+(num<<1)] = c>>8; //right shift the upper 8 bits into the lower 8 bits, stored into array
379
380 if(confirmation) //If true, issue the command
381 {
382 for(i=0;i<9+(num<<1);i++)
383 {
384 Serial1.write(rq[i]);
385 }
386 }
387 else //else do nothing but give the coder access to the Request.
388 {
389 for(i=0;i<9+(num<<1);i++)
390 {
391 rs[i]=rq[i]; //Request is copied into Response
392 }
393 }
394 sz = 9+(num<<1); //Size of the Request
395 if(sz>BUFS)
396 {
397 Serial.println("Buffer overflow prevented in 0x04. Recompile with BUFS to a higher value");
398 return 0;
399 }
400 if(confirmation) //We are writing to the device
401 {
402 sz=8; //The Response of 0x10 is always 8 bytes (64 bits long)
403 for(i=0;i<sz;) //always 8
404 {
405
406 if (Serial1.available()) //Data from the Slave is available
407 {
408 rs[i]=Serial1.read();
409 i++;
410 }
411 }
412 //Test the CRC values of response on the buffer (sparing the given CRC codes)
413 c=CRC16(rs,sz-2); //Test everything except last two bytes.
414 if(c!=short((rs[sz-2]<<8 | rs[sz-1]))) //If either byte of CRC is wrong, then error
415 {
416 Serial.println("CRC error in 0x04");
417 return 0;
418 }
419 }
420 return sz;
421 }
422
423
424 short CRC16(byte array[],byte s)
425 {
426 static const byte auchCRCHi[] = {
427 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
428 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
429 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
430 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
431 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
432 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
433 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
434 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
435 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
436 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
437 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
438 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
439 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
440 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
441 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
442 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
443 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
444 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
445 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
446 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
447 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
448 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
449 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
450 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
451 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
452 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
453 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
454 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
455 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
456 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
457 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
458 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ;
459
460 static const byte auchCRCLo[] = {
461 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2,
462 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04,
463 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,
464 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8,
465 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
466 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,
467 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6,
468 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10,
469 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
470 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
471 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE,
472 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,
473 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA,
474 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C,
475 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
476 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0,
477 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62,
478 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,
479 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE,
480 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
481 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,
482 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C,
483 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76,
484 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
485 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
486 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54,
487 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,
488 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98,
489 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A,
490 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
491 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86,
492 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40} ;
493
494 byte uchCRCHi = 0xFF;
495 byte uchCRCLo = 0xFF;
496 byte uIndex;
497
498 while(s--)
499 {
500 uIndex = uchCRCHi ^ *array++ ;
501 uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
502 uchCRCLo = auchCRCLo[uIndex] ;
503 }
504 return short(uchCRCHi << 8 | uchCRCLo);
505 }