отсюда https://groups.google.com/forum/#!msg/VladRusanov/yZXoytGlqgc/PlqpCmqDFAAJ Приложение 4. #include //-------- порты для rs 485 #define SSerialRx 11 // Serial Receive pin RO #define SSerialTx 8 // Serial Transmit pin DI //-------- инициализация SoftwareSerial RS485Serial(SSerialRx, SSerialTx); // Rx, Tx //// линия управления передачи приема #define SerialControl 5 // RS485 Direction control /////// флаг приема передачи #define RS485Transmit HIGH #define RS485Receive LOW /////// команды byte testConnect[] = { 0x00, 0x00 }; byte Access[] = { 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}; byte Sn[] = { 0x00, 0x08, 0x00 }; // серийный номер byte Freq[] = { 0x00, 0x08, 0x16, 0x40 }; // частота byte Current[] = { 0x00, 0x08, 0x16, 0x21 };// ток byte Suply[] = { 0x00, 0x08, 0x16, 0x11 }; // напряжение byte Power[] = { 0x00, 0x08, 0x16, 0x00 };// мощность byte Angle[] = { 0x00, 0x08, 0x16, 0x51 }; // углы byte activPower[] = { 0x00, 0x05, 0x00, 0x00 };/// суммарная энергия прямая + обратная + активная + реактивная byte sumPower[] = { 0x00, 0x08, 0x11, 0x00 }; byte response[19]; int byteReceived; int byteSend; int netAdr; int SCAN_YES_NO=0; int TST_YES_NO=0; int ACCESS_YES_NO=0; int ALLOW=0; void setup() { RS485Serial.begin(9600); Serial.begin(9600); // 5 пин в режим выхода pinMode(SerialControl, OUTPUT); // ставим на прием digitalWrite(SerialControl, RS485Receive); delay(300); Serial.println("Start_v02.01\r\n"); } void loop() { TST_YES_NO=0; ACCESS_YES_NO=0; ALLOW=0; while (Serial.available()) { char incomingBytes[15]; if(Serial.available()>0) { Serial.readBytes(incomingBytes,10); } String getS = String(incomingBytes); if(getS.substring(0,5) == "init_") { ALLOW=1; Serial.print(getS.substring(0,5)+getS.substring(5,8)+"\r\n"); netAdr=getS.substring(5,8).toInt(); } if(getS.substring(0,5) == "loop_") { ALLOW=1; SCAN_YES_NO=1; Serial.print(getS.substring(0,5)+getS.substring(5,8)+"\r\n"); netAdr=getS.substring(5,8).toInt(); } if(getS.substring(0,5) == "stop_") { ALLOW=0; SCAN_YES_NO=0; Serial.print(getS.substring(0,5)+"000\r\n"); //netAdr=getS.substring(5,8).toInt(); } if(getS.substring(0,5) == "ping_") { Serial.print(getS.substring(0,5)+"\r\n"); } } if(ALLOW==1 or SCAN_YES_NO==1) { //======================================================================== testConnect[0] = netAdr; response[0] = 0; send(testConnect, sizeof(testConnect), response); if(response[0] == netAdr) { TST_YES_NO=1; Serial.print("Connect_OK\r\n"); } else { TST_YES_NO=0; Serial.print("Connect_FAIL\r\n"); } //======================================================================== if(TST_YES_NO==1) { delay(100); Access[0] = netAdr; response[0] = 0; send(Access, sizeof(Access), response); if(response[0] == netAdr) { ACCESS_YES_NO=1; Serial.print("Access_OK\r\n"); } else { ACCESS_YES_NO=0; Serial.print("Access_FAIL\r\n"); } } if(ACCESS_YES_NO==1) { String serNum = getSerialNumber(netAdr); Serial.print("s:"+ serNum +"\r\n"); String ARPower = getARPower(netAdr); Serial.print("p:"+ ARPower+"\r\n"); String valFreq = getFreq(netAdr); Serial.print("f:"+ valFreq+"\r\n"); String U = getSuply(netAdr); Serial.print("u:"+ U+"\r\n"); String A = getCurrent(netAdr); Serial.print("a:"+ A+"\r\n"); String Angle = getAngle(netAdr); Serial.print("g:"+ Angle+"\r\n"); String PowerNow = getPowerNow(netAdr); Serial.print("e:"+ PowerNow+"\r\n"); } delay(1000); } } String getSerialNumber(int netAdr) { String s1,s2,s3,s4; response[0]=0; Sn[0] = netAdr; send(Sn, sizeof(Sn),response); if((int)response[1] < 10) { s1="0" + String((int)response[1]); } else {s1=String((int)response[1]);} if((int)response[2] < 10) { s2="0" + String((int)response[2]); } else {s2=String((int)response[2]);} if((int)response[3] < 10) { s3="0" + String((int)response[3]); } else {s3=String((int)response[3]);} if((int)response[4] < 10) { s4="0" + String((int)response[4]); } else {s4=String((int)response[4]);} //String n = String((int)response[1]) + String((int)response[2]) +String((int)response[3])+ String((int)response[4]); String n = s1+s2+s3+s4; return String(response[0])+";"+n; } String getPowerNow(int netAdr) { response[0]=0; Power[0] = netAdr; send(Power, sizeof(Power),response); long r = 0; r |= (long)response[1]<<16; r |= (long)response[3]<<8; r |= (long)response[2]; String U0= String(r); r = 0; r |= (long)response[4]<<16; r |= (long)response[6]<<8; r |= (long)response[5]; String U1= String(r); r=0; r |= (long)response[7]<<16; r |= (long)response[9]<<8; r |= (long)response[8]; String U2= String(r); r = 0; r |= (long)response[10]<<16; r |= (long)response[12]<<8; r |= (long)response[11]; String U3= String(r); if(response[0] == netAdr) return String(String(response[0])+";"+U0+";"+U1+";"+U2+";"+U3); else return String("Error"); } String getAngle(int netAdr) { response[0]=0; Angle[0] = netAdr; send(Angle, sizeof(Angle),response); long r = 0; r |= (long)response[1]<<16; r |= (long)response[3]<<8; r |= (long)response[2]; String U1= String(r); r = 0; r |= (long)response[4]<<16; r |= (long)response[6]<<8; r |= (long)response[5]; String U2= String(r); r=0; r |= (long)response[7]<<16; r |= (long)response[9]<<8; r |= (long)response[8]; String U3= String(r); if(response[0] == netAdr) return String(String(response[0])+";"+U1+";"+U2+";"+U3); else return String("Error"); } String getCurrent(int netAdr) { response[0]=0; Current[0] = netAdr; send(Current, sizeof(Current),response); long r = 0; r |= (long)response[1]<<16; r |= (long)response[3]<<8; r |= (long)response[2]; String U1= String(r); r = 0; r |= (long)response[4]<<16; r |= (long)response[6]<<8; r |= (long)response[5]; String U2= String(r); r=0; r |= (long)response[7]<<16; r |= (long)response[9]<<8; r |= (long)response[8]; String U3= String(r); if(response[0] == netAdr) return String(String(response[0])+";"+U1+";"+U2+";"+U3); else return String("Error"); } String getSuply(int netAdr) { response[0]=0; Suply[0] = netAdr; send(Suply, sizeof(Suply),response); long r = 0; r |= (long)response[1]<<16; r |= (long)response[3]<<8; r |= (long)response[2]; String U1= String(r); r = 0; r |= (long)response[4]<<16; r |= (long)response[6]<<8; r |= (long)response[5]; String U2= String(r); r=0; r |= (long)response[7]<<16; r |= (long)response[9]<<8; r |= (long)response[8]; String U3= String(r); if(response[0] == netAdr) return String(String(response[0])+";"+U1+";"+U2+";"+U3); else return String("Error"); } String getFreq(int netAdr) { response[0]=0; Freq[0] = netAdr; send(Freq, sizeof(Freq),response); //String n = String((int)response[1]) + String((int)response[2]) +String((int)response[3])+ String((int)response[4]); long r = 0; r |= (long)response[1]<<16; r |= (long)response[3]<<8; r |= (long)response[2]; String fr= String(r); //return fr; if(response[0] == netAdr) return String(response[0])+";"+fr; else return String("Error"); } String getARPower(int netAdr) { response[0]=0; activPower[0] = netAdr; send(activPower, sizeof(activPower),response); if(response[0] == netAdr) { long r = 0; r |= (long)response[2]<<24; r |= (long)response[1]<<16; r |= (long)response[4]<<8; r |= (long)response[3]; String A_plus= String(r); r=0; r |= (long)response[6]<<24; r |= (long)response[5]<<16; r |= (long)response[8]<<8; r |= (long)response[7]; String A_minus= String(r); r = 0; r |= (long)response[10]<<24; r |= (long)response[9]<<16; r |= (long)response[12]<<8; r |= (long)response[11]; String R_plus= String(r); r = 0; r |= (long)response[14]<<24; r |= (long)response[13]<<16; r |= (long)response[16]<<8; r |= (long)response[15]; String R_minus= String(r); return String(String(response[0])+";"+A_plus+";"+A_minus+";"+R_plus+";"+R_minus); } //if(response[0] == netAdr) String(A_plus+";"+A_minus+";"+R_plus+";"+R_minus); else return String("Error"); } ////////////////////////////////////////////////////////////////////////////////// void send(byte *cmd, int s, byte *response) { // Serial.print("sending..."); unsigned int crc = crc16MODBUS(cmd, s); unsigned int crc1 = crc & 0xFF; unsigned int crc2 = (crc>>8) & 0xFF; delay(10); digitalWrite(SerialControl, RS485Transmit); // Init Transceiver for(int i=0; i> 8) ^ crcTable[(crc ^ s[i]) & 0xFF]); } return crc; }