EPEVER 485

From Public Wiki
Revision as of 22:14, 16 November 2020 by Legg (talk | contribs) (Created page with "==Synopsis== Issues 485 request and display result ==Notes== ==Code== <syntaxhighlight lang="C++" line='line'> //#include <SoftwareSerial.h> //const int SSERIAL_RX_PIN = 10;...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Synopsis

Issues 485 request and display result

Notes

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 
 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   Response_size = zerofour(Response, 0x3302, 0x0012);
 25     if(Response_size==0) Serial.println("Received Error from 0x04");
 26 
 27   //Print result
 28   for(byte i=0;i<Response_size;i++)
 29   {
 30     Serial.print("0x");
 31     Serial.print(Response[i],HEX);
 32     Serial.print(" ");
 33   }
 34   Serial.println();
 35 }
 36 
 37 
 38 //===============================================================================
 39 //  Main
 40 //===============================================================================
 41 void loop() 
 42 {
 43 
 44 }
 45 
 46 //Assigns rs[] array, returns size or zero for CRC error
 47 //This does NOT detect broadcast CRC errors, or any exception
 48 //handling at all
 49 //
 50 //     rs : Response[] array
 51 //  start : Starting address
 52 //    num : Number of registers requested
 53 byte zerofour(byte rs[],int start, int num)
 54 {
 55   byte rq[8];  //Always 8 bytes
 56   //int addr;
 57   //int len;
 58   short c; //CRC value
 59   byte i, j,sz;  //Counters, size
 60   
 61   rq[0]=DEVICE; //Global device IO
 62   rq[1]=0x04;
 63   rq[3]=byte(start&0x00FF);
 64   rq[2]=byte((start&0xFF00)>>8);
 65   rq[5]=byte(num&0x00FF);
 66   rq[4]=byte((num&0xFF00)>>8);
 67 
 68   c = CRC16(rq,6);
 69   rq[7]=0x00FF & c;
 70   rq[6]=c>>8;
 71 
 72   for(i=0;i<8;i++)
 73   {
 74     Serial1.write(rq[i]);
 75   }
 76   sz = 5+rq[5]*2;
 77   if(sz>BUFS)
 78   {
 79     Serial.println("Buffer overflow prevented in 0x04.  Recompile with BUFS to a higher value");
 80     return 0;
 81   }
 82   for(i=0;i<sz;)
 83   {
 84     
 85     if (Serial1.available())            //Data from the Slave is available
 86     {
 87       rs[i]=Serial1.read();
 88       i++;
 89     }
 90   }
 91   c=CRC16(rs,sz-2);
 92   if(c!=short((rs[sz-2]<<8 | rs[sz-1])))
 93   {
 94     Serial.println("CRC error in 0x04");
 95     return 0;
 96   }
 97 
 98   return sz;
 99 }
100 
101 short CRC16(byte array[],byte s)
102 {
103   static const byte auchCRCHi[] = {
104         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
105         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
106         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
107         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
108         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
109         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
110         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
111         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
112         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
113         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
114         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
115         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
116         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
117         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
118         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
119         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
120         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
121         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
122         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
123         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
124         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
125         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
126         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
127         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
128         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
129         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
130         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
131         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
132         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
133         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
134         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
135         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ; 
136 
137   static const byte auchCRCLo[] = {
138         0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2,
139         0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04,
140         0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,
141         0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8,
142         0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
143         0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,
144         0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6,
145         0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10,
146         0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
147         0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
148         0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE,
149         0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,
150         0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA,
151         0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C,
152         0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
153         0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0,
154         0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62,
155         0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,
156         0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE,
157         0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
158         0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,
159         0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C,
160         0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76,
161         0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
162         0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
163         0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54,
164         0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,
165         0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98,
166         0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A,
167         0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
168         0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86,
169         0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40} ;
170 
171   byte uchCRCHi = 0xFF;
172   byte uchCRCLo = 0xFF;
173   byte uIndex;
174 
175   while(s--)
176   {
177     uIndex = uchCRCHi ^ *array++ ;
178     uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
179     uchCRCLo = auchCRCLo[uIndex] ;
180   }
181   return short(uchCRCHi << 8 | uchCRCLo);
182 }