EPEVER 485
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 }