Difference between revisions of "EPEVER 485"

From Public Wiki
Jump to navigation Jump to search
Line 295: Line 295:
 
void loop()  
 
void loop()  
 
{
 
{
 +
 
 +
  Response_size = zeroone(Response, 0x0002, 0x0001);
 +
    if(Response_size==0) Serial.println("Received Error from 0x01");
  
if(countdown>0)
+
   Serial.print("Size is ");
{
+
  Serial.println(Response_size);
   Response_size = zerofour(Response, 0x3302, 0x0012);
+
    
    if(Response_size==0) Serial.println("Received Error from 0x04");
 
 
 
   //Print result
 
 
   for(byte i=0;i<Response_size;i++)
 
   for(byte i=0;i<Response_size;i++)
 
   {
 
   {
 
     Serial.print("0x");
 
     Serial.print("0x");
 +
    if(Response[i]<16) Serial.print("0");
 
     Serial.print(Response[i],HEX);
 
     Serial.print(Response[i],HEX);
 
     Serial.print(" ");
 
     Serial.print(" ");
 
   }
 
   }
   Serial.println("Finished 0x04");
+
/*
 +
   if(Response[1]!=0x83)
 +
  { 
 +
    Serial.print("0x");
 +
    if(Response[4]<16) Serial.print("0");
 +
    Serial.print(Response[4],HEX);
 +
  }
 +
  else
 +
  {
 +
    Serial.print("Error 0x0");
 +
    Serial.print(Response[2]);
 +
  }
 +
*/
 +
  Serial.println();
 +
 
 +
  while(1)
 +
  {}
 +
}
 +
 
 +
byte zeroone(byte rs[],int start, int num)
 +
{
 +
  byte rq[8];  //Always 8 bytes
 +
  //int addr;
 +
  //int len;
 +
  short c; //CRC value
 +
  byte i, j,sz;  //Counters, size
 +
 
 +
  if(num==0 || num>0x7d0)
 +
  {
 +
    Serial.println("Illegal quantity of inputs");
 +
    return 0; 
 +
  }
  
  delay(1000);
 
 
    
 
    
   Response_size = zerotwo(Response, 0x2000, 0x0001);
+
   rq[0]=DEVICE; //Global device IO
   if(Response_size==0) Serial.println("Received Error from 0x04");
+
  rq[1]=0x01;
 
+
  rq[3]=byte(start&0x00FF);
   //Print result
+
  rq[2]=byte((start&0xFF00)>>8);
   for(byte i=0;i<Response_size;i++)
+
  rq[5]=byte(num&0x00FF);
 +
  rq[4]=byte((num&0xFF00)>>8);
 +
 
 +
  c = CRC16(rq,6);
 +
  rq[7]=0x00FF & c;
 +
  rq[6]=c>>8;
 +
 
 +
  for(i=0;i<8;i++)
 +
  {
 +
    Serial1.write(rq[i]);
 +
   }
 +
  sz = 5+rq[5];
 +
  //if((rq[5]%8)!=0 && rq[5]>8) sz++;  //Refer to *N at top of Page 12
 +
  if(sz>BUFS)
 +
  {
 +
    Serial.println("Buffer overflow prevented in 0x01.  Recompile with BUFS to a higher value");
 +
    return 0;
 +
   }
 +
   for(i=0;i<sz;)
 +
  {
 +
    if (Serial1.available())            //Data from the Slave is available
 +
    {
 +
      rs[i]=Serial1.read();
 +
      if(i==1 && rs[i]==0x83) sz=5;
 +
      i++;
 +
    }
 +
 
 +
  }
 +
  c=CRC16(rs,sz-2);
 +
  if(c!=short((rs[sz-2]<<8 | rs[sz-1])))
 
   {
 
   {
     Serial.print("0x");
+
     Serial.println("CRC error in 0x01");
     Serial.print(Response[i],HEX);
+
     return 0;
    Serial.print(" ");
 
 
   }
 
   }
  Serial.println();
+
 
  delay(1000);
+
   return sz;
   countdown--;
 
}
 
 
}
 
}
 +
  
 
byte zerotwo(byte rs[], int start, int num)
 
byte zerotwo(byte rs[], int start, int num)
Line 374: Line 432:
 
   return sz;
 
   return sz;
 
}
 
}
 +
 +
byte zerothree(byte rs[],int start, int num)
 +
{
 +
  byte rq[8];  //Always 8 bytes
 +
  //int addr;
 +
  //int len;
 +
  short c; //CRC value
 +
  byte i, j,sz;  //Counters, size
 +
 +
  if(num==0 || num>0x7d)
 +
  {
 +
    Serial.println("Illegal quantity of inputs");
 +
    return 0; 
 +
  }
 +
 +
 
 +
  rq[0]=DEVICE; //Global device IO
 +
  rq[1]=0x03;
 +
  rq[3]=byte(start&0x00FF);
 +
  rq[2]=byte((start&0xFF00)>>8);
 +
  rq[5]=byte(num&0x00FF);
 +
  rq[4]=byte((num&0xFF00)>>8);
 +
 +
  c = CRC16(rq,6);
 +
  rq[7]=0x00FF & c;
 +
  rq[6]=c>>8;
 +
 +
  for(i=0;i<8;i++)
 +
  {
 +
    Serial1.write(rq[i]);
 +
  }
 +
  sz = 5+rq[5]*2;
 +
  if(sz>BUFS)
 +
  {
 +
    Serial.println("Buffer overflow prevented in 0x03.  Recompile with BUFS to a higher value");
 +
    return 0;
 +
  }
 +
  for(i=0;i<sz;)
 +
  {
 +
    if (Serial1.available())            //Data from the Slave is available
 +
    {
 +
      rs[i]=Serial1.read();
 +
      if(i==1 && rs[i]==0x83) sz=5;
 +
      i++;
 +
    }
 +
 
 +
  }
 +
  c=CRC16(rs,sz-2);
 +
  if(c!=short((rs[sz-2]<<8 | rs[sz-1])))
 +
  {
 +
    Serial.println("CRC error in 0x03");
 +
    return 0;
 +
  }
 +
 +
  return sz;
 +
}
 +
 +
  
 
//Assigns rs[] array, returns size or zero for CRC error
 
//Assigns rs[] array, returns size or zero for CRC error

Revision as of 03:57, 17 November 2020

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 Response[BUFS];
 12 byte Response_size;
 13 byte countdown = 2;
 14 //===============================================================================
 15 //  Initialization
 16 //===============================================================================
 17 void setup()
 18 {
 19   Serial.begin(115200);           // Start the built-in serial port   
 20   Serial1.begin(115200);   // Start the RS485 soft serial port 
 21   delay(1000);
 22   Serial.println();
 23 
 24 
 25 }
 26 
 27 
 28 //===============================================================================
 29 //  Main
 30 //===============================================================================
 31 void loop() 
 32 {
 33   
 34   Response_size = zeroone(Response, 0x0002, 0x0001);
 35     if(Response_size==0) Serial.println("Received Error from 0x01");
 36 
 37   Serial.print("Size is ");
 38   Serial.println(Response_size);
 39   
 40   for(byte i=0;i<Response_size;i++)
 41   {
 42     Serial.print("0x");
 43     if(Response[i]<16) Serial.print("0");
 44     Serial.print(Response[i],HEX);
 45     Serial.print(" ");
 46   }
 47 /*
 48   if(Response[1]!=0x83)
 49   {  
 50     Serial.print("0x");
 51     if(Response[4]<16) Serial.print("0");
 52     Serial.print(Response[4],HEX);
 53   }
 54   else
 55   {
 56     Serial.print("Error 0x0");
 57     Serial.print(Response[2]);
 58   }
 59 */
 60   Serial.println();
 61 
 62   while(1)
 63   {}
 64 }
 65 
 66 byte zeroone(byte rs[],int start, int num)
 67 {
 68   byte rq[8];  //Always 8 bytes
 69   //int addr;
 70   //int len;
 71   short c; //CRC value
 72   byte i, j,sz;  //Counters, size
 73 
 74   if(num==0 || num>0x7d0)
 75   {
 76     Serial.println("Illegal quantity of inputs");
 77     return 0;  
 78   }
 79 
 80   
 81   rq[0]=DEVICE; //Global device IO
 82   rq[1]=0x01;
 83   rq[3]=byte(start&0x00FF);
 84   rq[2]=byte((start&0xFF00)>>8);
 85   rq[5]=byte(num&0x00FF);
 86   rq[4]=byte((num&0xFF00)>>8);
 87 
 88   c = CRC16(rq,6);
 89   rq[7]=0x00FF & c;
 90   rq[6]=c>>8;
 91 
 92   for(i=0;i<8;i++)
 93   {
 94     Serial1.write(rq[i]);
 95   }
 96   sz = 5+rq[5];
 97   //if((rq[5]%8)!=0 && rq[5]>8) sz++;  //Refer to *N at top of Page 12
 98   if(sz>BUFS)
 99   {
100     Serial.println("Buffer overflow prevented in 0x01.  Recompile with BUFS to a higher value");
101     return 0;
102   }
103   for(i=0;i<sz;)
104   {
105     if (Serial1.available())            //Data from the Slave is available
106     {
107       rs[i]=Serial1.read();
108       if(i==1 && rs[i]==0x83) sz=5;
109       i++;
110     }
111    
112   }
113   c=CRC16(rs,sz-2);
114   if(c!=short((rs[sz-2]<<8 | rs[sz-1])))
115   {
116     Serial.println("CRC error in 0x01");
117     return 0;
118   }
119 
120   return sz;
121 }
122 
123 
124 byte zerotwo(byte rs[], int start, int num)
125 {
126   byte rq[8];  //Always 8 bytes
127   //int addr;
128   //int len;
129   short c; //CRC value
130   byte i, j,sz;  //Counters, size
131   
132   rq[0]=DEVICE; //Global device IO
133   rq[1]=0x02;
134   rq[3]=byte(start&0x00FF);
135   rq[2]=byte((start&0xFF00)>>8);
136   rq[5]=byte(num&0x00FF);
137   rq[4]=byte((num&0xFF00)>>8);
138 
139   c = CRC16(rq,6);
140   rq[7]=0x00FF & c;
141   rq[6]=c>>8;
142 
143   for(i=0;i<8;i++)
144   {
145     Serial1.write(rq[i]);
146   }
147   sz = 5+rq[5];
148   if(sz>BUFS)
149   {
150     Serial.println("Buffer overflow prevented in 0x02.  Recompile with BUFS to a higher value");
151     return 0;
152   }
153   for(i=0;i<sz;)
154   {
155     
156     if (Serial1.available())            //Data from the Slave is available
157     {
158       rs[i]=Serial1.read();
159       i++;
160     }
161   }
162   c=CRC16(rs,sz-2);
163   if(c!=short((rs[sz-2]<<8 | rs[sz-1])))
164   {
165     Serial.println("CRC error in 0x02");
166     return 0;
167   }
168   return sz;
169 }
170 
171 byte zerothree(byte rs[],int start, int num)
172 {
173   byte rq[8];  //Always 8 bytes
174   //int addr;
175   //int len;
176   short c; //CRC value
177   byte i, j,sz;  //Counters, size
178 
179   if(num==0 || num>0x7d)
180   {
181     Serial.println("Illegal quantity of inputs");
182     return 0;  
183   }
184 
185   
186   rq[0]=DEVICE; //Global device IO
187   rq[1]=0x03;
188   rq[3]=byte(start&0x00FF);
189   rq[2]=byte((start&0xFF00)>>8);
190   rq[5]=byte(num&0x00FF);
191   rq[4]=byte((num&0xFF00)>>8);
192 
193   c = CRC16(rq,6);
194   rq[7]=0x00FF & c;
195   rq[6]=c>>8;
196 
197   for(i=0;i<8;i++)
198   {
199     Serial1.write(rq[i]);
200   }
201   sz = 5+rq[5]*2;
202   if(sz>BUFS)
203   {
204     Serial.println("Buffer overflow prevented in 0x03.  Recompile with BUFS to a higher value");
205     return 0;
206   }
207   for(i=0;i<sz;)
208   {
209     if (Serial1.available())            //Data from the Slave is available
210     {
211       rs[i]=Serial1.read();
212       if(i==1 && rs[i]==0x83) sz=5;
213       i++;
214     }
215    
216   }
217   c=CRC16(rs,sz-2);
218   if(c!=short((rs[sz-2]<<8 | rs[sz-1])))
219   {
220     Serial.println("CRC error in 0x03");
221     return 0;
222   }
223 
224   return sz;
225 }
226 
227 
228 
229 //Assigns rs[] array, returns size or zero for CRC error
230 //This does NOT detect broadcast CRC errors, or any exception
231 //handling at all
232 //
233 //     rs : Response[] array
234 //  start : Starting address
235 //    num : Number of registers requested
236 byte zerofour(byte rs[],int start, int num)
237 {
238   byte rq[8];  //Always 8 bytes
239   //int addr;
240   //int len;
241   short c; //CRC value
242   byte i, j,sz;  //Counters, size
243   
244   rq[0]=DEVICE; //Global device IO
245   rq[1]=0x04;
246   rq[3]=byte(start&0x00FF);
247   rq[2]=byte((start&0xFF00)>>8);
248   rq[5]=byte(num&0x00FF);
249   rq[4]=byte((num&0xFF00)>>8);
250 
251   c = CRC16(rq,6);
252   rq[7]=0x00FF & c;
253   rq[6]=c>>8;
254 
255   for(i=0;i<8;i++)
256   {
257     Serial1.write(rq[i]);
258   }
259   sz = 5+rq[5]*2;
260   if(sz>BUFS)
261   {
262     Serial.println("Buffer overflow prevented in 0x04.  Recompile with BUFS to a higher value");
263     return 0;
264   }
265   for(i=0;i<sz;)
266   {
267     
268     if (Serial1.available())            //Data from the Slave is available
269     {
270       rs[i]=Serial1.read();
271       i++;
272     }
273   }
274   c=CRC16(rs,sz-2);
275   if(c!=short((rs[sz-2]<<8 | rs[sz-1])))
276   {
277     Serial.println("CRC error in 0x04");
278     return 0;
279   }
280 
281   return sz;
282 }
283 
284 short CRC16(byte array[],byte s)
285 {
286   static const byte auchCRCHi[] = {
287         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
288         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
289         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
290         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
291         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
292         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
293         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
294         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
295         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
296         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
297         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
298         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
299         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
300         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
301         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
302         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
303         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
304         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
305         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
306         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
307         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
308         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
309         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
310         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
311         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
312         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
313         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
314         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
315         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
316         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
317         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
318         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ; 
319 
320   static const byte auchCRCLo[] = {
321         0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2,
322         0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04,
323         0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,
324         0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8,
325         0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
326         0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,
327         0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6,
328         0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10,
329         0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
330         0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
331         0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE,
332         0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,
333         0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA,
334         0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C,
335         0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
336         0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0,
337         0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62,
338         0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,
339         0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE,
340         0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
341         0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,
342         0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C,
343         0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76,
344         0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
345         0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
346         0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54,
347         0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,
348         0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98,
349         0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A,
350         0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
351         0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86,
352         0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40} ;
353 
354   byte uchCRCHi = 0xFF;
355   byte uchCRCLo = 0xFF;
356   byte uIndex;
357 
358   while(s--)
359   {
360     uIndex = uchCRCHi ^ *array++ ;
361     uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
362     uchCRCLo = auchCRCLo[uIndex] ;
363   }
364   return short(uchCRCHi << 8 | uchCRCLo);
365 }