вот код- сильно не пинать, потом окультурю 
	PHP код: 
	
		 
		
		
			
#include <SPI.h> #include "mcp_can.h" MCP_CAN CAN(10); unsigned char len = 0; unsigned char buf[8]; INT32U canId = 0x000; unsigned long time0 = -120;
  //RDS int digit1, digit2;
  uint8_t DATA[162] = {}; uint8_t DATA2[162] = {}; boolean Flag = false; boolean Flag2 = false; int Count = 0; int Count2 = 0; int FMS = 0; int VolCount = 5; int arrcmp;
  //Multiframe int LengthP;  int DataBufSize; int Scroll = 0; uint8_t MULTIFRAMEFTMP[3] = {}; uint8_t MULTIFRAMETMP[54] = {}; uint8_t MULTIFRAME[55] = {}; //Multiframe RDTxT //Package length: 64 int LengthR;  int DataBufSizeR;
  void setup() {   DATA[14] = 0x20;     Serial.begin(115200);     pinMode(9, INPUT);     CAN.begin(CAN_125KBPS,MCP_8MHz); }
  unsigned long time2 = 0; unsigned char stmp[8] = {14, 0, 0, 15, 1, 0, 0, 160};
  void loop() { //  if ((millis() - time2) > 100){ //  CAN.sendMsgBuf(0x036, 0, 8, stmp); //Это пакет зажигания. //  time2 = millis();}           if(!digitalRead(9))        {        CAN.readMsgBuf(&len, buf);        canId = CAN.getCanId();
  if(canId == 0x125) {   if (buf[0] == 1) {      bitWrite(DATA[30],5,0);bitWrite(DATA[30],6,0);bitWrite(DATA[30],7,0);      memset(MULTIFRAMEFTMP, 0, sizeof(MULTIFRAMEFTMP));      memset(MULTIFRAMETMP, 0, sizeof(MULTIFRAMETMP));      memset(MULTIFRAME, 0, sizeof(MULTIFRAME));      for (int i=0; i<55; i++) DATA[i+41] = 0x00;   }   else {                             if (buf[0] == 4) DATA[39] = buf[4];                if (buf[1] == 112 &&  buf[0] == 6){                   bitWrite(DATA[30],7,1);                   bitWrite(DATA[30],5,0);                   bitWrite(DATA[30],6,0);                    if (buf[4]!=16 && buf[4]!=19 &&                         buf[4]!=64 && buf[4]!=65 &&                         buf[4]!=66 && buf[4]!=67) DATA[39] = buf[4];                    else {                     if (buf[4] == 16 || buf[4] == 64) DATA[39] = 0x00;                     if (buf[4] == 65) DATA[39] = 0x01;                     if (buf[4] == 66) DATA[39] = 0x02;                     if (buf[4] == 19 || buf[4] == 67) DATA[39] = 0x03;                     }                     if (buf[4] == 16) Scroll = 1;                     if (buf[4] == 19) Scroll = 2;                     if (buf[4] != 16 && buf[5] != 19) Scroll = 0;                   DATA[40] = buf[3] + 0x01;                }                              if ((buf[0] >> 4) == 0x01){                 LengthP = ((buf[0] & 0x0F) * 256 + buf[1]) - 6;                 DataBufSize = 0;                 MULTIFRAMEFTMP[0] = buf[6];                 MULTIFRAMEFTMP[1] = buf[7];                 if (buf[1] == 13 || buf[1] == 22 || buf[1] == 31 || buf[1] == 40){                     FMS = 1;                     if (buf[5] == 64 || buf[5] == 16) DATA[39] = 0x00;                     if (buf[5] == 65 || buf[5] == 33) DATA[39] = 0x01;                     if (buf[5] == 66 || buf[5] == 50) DATA[39] = 0x02;                     if (buf[5] == 67 || buf[5] == 19) DATA[39] = 0x03;                     if (buf[5] == 16) Scroll = 1;                     if (buf[5] == 19) Scroll = 2;                     if (buf[5] != 16 && buf[5] != 19) Scroll = 0;                     }                 if (buf[1] == 58){                     FMS = 2;                     if (buf[3] == 16) DATA[39] = 0x00;                     if (buf[3] == 32) DATA[39] = 0x01;                     if (buf[3] == 48) DATA[39] = 0x02;                     if (buf[3] == 64) DATA[39] = 0x03;                     if (buf[3] == 80) DATA[39] = 0x04;                     if (buf[3] == 96) DATA[39] = 0x05;                     Scroll = 0;                     }              } 
                if(((buf[0] >> 4) == 0x02) && LengthP != 0) multiframef();               if(((buf[0] >> 4) == 0x02) && LengthP == 0)               {               if (Scroll == 0){               MULTIFRAME[0] = MULTIFRAMEFTMP[0];               MULTIFRAME[1] = MULTIFRAMEFTMP[1];               for(int i=0;i<=51;i++) MULTIFRAME[i+2] = MULTIFRAMETMP[i];}
                if (Scroll == 1){                 for (int i = 26; i>=0; i--) MULTIFRAME[i+9] = MULTIFRAME[i];                 MULTIFRAME[0] = MULTIFRAMEFTMP[0];                 MULTIFRAME[1] = MULTIFRAMEFTMP[1];                 for (int i = 0; i<7;i++) MULTIFRAME[i+2] = MULTIFRAMETMP[i];                 }
                if (Scroll == 2){                 for (int i = 0; i<=26; i++) MULTIFRAME[i] = MULTIFRAME[i+9];                 MULTIFRAME[27] = MULTIFRAMEFTMP[0];                 MULTIFRAME[28] = MULTIFRAMEFTMP[1];                 for (int i = 0; i<7;i++) MULTIFRAME[i+29] = MULTIFRAMETMP[i];                 }               for (int i=0; i<54; i++) DATA[i+41] = MULTIFRAME[i];               if (FMS == 1) {bitWrite(DATA[30],5,1); bitWrite(DATA[30],6,0); bitWrite(DATA[30],7,0);}               if (FMS == 2) {bitWrite(DATA[30],6,1); bitWrite(DATA[30],5,0); bitWrite(DATA[30],7,0);}               }   } }           if(canId == 0xA4 && bitRead(DATA[21],5) == 1)             {               if ((buf[0] >> 4) == 0x01){                 LengthR = ((buf[0] & 0x0F) * 256 + buf[1]) - 6;                 DataBufSizeR = 98;                 DATA[96] = buf[6];                 DATA[97] = buf[7];               } 
                if(((buf[0] >> 4) == 0x02) && LengthR > 0) multiframeRF();               if(((buf[0] >> 4) == 0x02) && LengthR == 0){               }              }           if(canId == 0xB6){           DATA[0] = buf[0];DATA[1] = buf[1];           DATA[2] = buf[2];DATA[3] = buf[3];}           if(canId == 0x221){DATA[4] = buf[1];DATA[5] = buf[2];           bitWrite(DATA[36],3,bitRead(buf[0],3));}            if(canId == 0x2A1){DATA[6] = buf[3];DATA[7] = buf[4];<< 8 | buf [4];           DATA[8] = buf[0];           DATA[9] = buf[1];DATA[10] = buf[2];}           if(canId == 0xF6) DATA[11] = buf[6];           if(canId == 0x1A1){if (bitRead(buf[2],7) == 1) DATA[12] = 0x01; else DATA[12] = 0x00;           DATA[13] = buf[1];}           if(canId == 0x1A5) //421 1A5             if (buf[0] <= 30){              DATA[14] = buf[0];             VolCount = 0;             }             else {               if (VolCount < 5) VolCount = VolCount +1;               else DATA[14] = 0x1F;             }           if(canId == 0x1E5){             if (bitRead(buf[0],7) == 1 || bitRead(buf[1],7) == 1 || bitRead(buf[2],7) == 1 || bitRead(buf[4],7) == 1 ||                  bitRead(buf[5],7) == 1 || bitRead(buf[5],4) == 1 || bitRead(buf[6],6) == 1){                   if (bitRead(buf[0],7) == 1){DATA[15] = 0x01; DATA[16] = (buf[0] & 0x7F);}                   if (bitRead(buf[1],7) == 1){DATA[15] = 0x02; DATA[16] = (buf[1] & 0x7F);}                   if (bitRead(buf[2],7) == 1){DATA[15] = 0x03; DATA[16] = (buf[2] & 0x7F);}                   if (bitRead(buf[4],7) == 1){DATA[15] = 0x04; DATA[16] = (buf[4] & 0x7F);}                   if (bitRead(buf[5],7) == 1){DATA[15] = 0x05; DATA[16] = bitRead(buf[5],6);}                   if (bitRead(buf[5],4) == 1){DATA[15] = 0x06; DATA[16] = bitRead(buf[5],2);}                   if (bitRead(buf[6],6) == 1){DATA[15] = 0x07;                                        if ((buf[6] & 0x1F) == 3)DATA[16] = 1;                                        if ((buf[6] & 0x1F) == 7)DATA[16] = 2;                                         if ((buf[6] & 0x1F) == 11)DATA[16] = 3;                                        if ((buf[6] & 0x1F) == 15)DATA[16] = 4;                                        if ((buf[6] & 0x1F) == 19)DATA[16] = 5;                                        if ((buf[6] & 0x1F) == 23)DATA[16] = 6;                                        }                   }else DATA[15] = 0x00;            bitWrite(DATA[21],7,bitRead(buf[5],6));            }
            if(canId == 0x165)           {           if (buf[0] == 192)DATA[17] = 0x01; else DATA[17] = 0x00;           if (buf[2] == 16){DATA[17] = 0x02;}           if (buf[2] == 32){DATA[17] = 0x03;}           if (buf[2] == 48){DATA[17] = 0x04;}           if (buf[2] == 64){DATA[17] = 0x05;}           if (buf[2] == 80){DATA[17] = 0x06;}           }           if(canId == 0x225 && DATA[17] == 0x02)           {           DATA[19] = buf[3];           DATA[20] = buf[4];           DATA[31] = buf[1];           bitWrite(DATA[18],0,bitRead(buf[2],4));           bitWrite(DATA[18],1,bitRead(buf[2],5));           bitWrite(DATA[18],2,bitRead(buf[2],6));           if (bitRead(buf[2],4) == 1 && bitRead(buf[2],6) == 1)bitWrite(DATA[18],3,1); else bitWrite(DATA[18],3,0);           bitWrite(DATA[18],4,bitRead(buf[0],2));           //bitWrite(DATA[18],5,bitRead(buf[0],7));                        if (bitRead(buf[0],2) == 1) Flag = true;             if (bitRead(buf[0],2) == 0 && Flag == true){             Count = Count + 1;               if (Count > 2){               if (bitRead(buf[0],7) == 0) {bitWrite(DATA[18],5,1);bitWrite(DATA[18],6,0);}                if (bitRead(buf[0],7) == 1) {bitWrite(DATA[18],5,0);bitWrite(DATA[18],6,1);}                Flag = false;               Count = 0;               Flag2 = true;               Count2 = 0;              }                                            }             if (Flag2 == true){               Count2= Count2 + 1;               if (Count2 == 14){                   bitWrite(DATA[18],5,0);                   bitWrite(DATA[18],6,0);                   Count2 = 0;                   Flag2 = false;                 }             }                        }           if(canId == 0x1E0)           {             bitWrite(DATA[21],0,bitRead(buf[0],5));             bitWrite(DATA[21],1,bitRead(buf[0],2));             bitWrite(DATA[21],2,bitRead(buf[1],7));             bitWrite(DATA[21],3,bitRead(buf[2],5));             bitWrite(DATA[21],4,bitRead(buf[3],7));             bitWrite(DATA[21],5,bitRead(buf[4],5));           }           if(canId == 0x2A5 && DATA[17] == 0x02)           {             if (buf[0] != 0 && buf[1] != 0 && buf[2] != 0 && buf[3] != 0 && buf[4] != 0 && buf[5] != 0 && buf[6] != 0 && buf[7] != 0 && buf[8] != 0){             for(int i = 22; i<=29; i++) DATA[i] = buf[i-22];}             else             {DATA[22] = 0x20;DATA[23] = 0x4E;DATA[24] = 0x4F;DATA[25] = 0x20;             DATA[26] = 0x52;DATA[27] = 0x44;DATA[28] = 0x53;DATA[29] = 0x00;}           }           if(canId == 0x365 && DATA[17] == 0x03) DATA[20] = buf[0];                       if(canId == 0x3A5 && DATA[17] == 0x03)           {             if (buf[3] == 255 && buf[4] == 127){             DATA[22] = 0x20;DATA[23] = 0x20;DATA[24] = 0x20;DATA[25] = 0x2D;DATA[26] = 0x2D;DATA[27] = 0x3A;DATA[28] = 0x2D;DATA[29] = 0x2D;}             else {             converter(buf[0]);             DATA[22] = digit1;             DATA[23] = digit2;             DATA[24] = 0x2D;             converter(buf[3]);             DATA[25] = digit1;             DATA[26] = digit2;             DATA[27] = 0x3A;             converter(buf[4]);             DATA[28] = digit1;             DATA[29] = digit2;             }             } if (DATA[17] == 0x04) {           if(canId == 0x162) DATA[19] = buf[3];           if(canId == 0x1A2) DATA[20] = buf[0];           if(canId == 0x1E2)           {             if (buf[3] == 255 && buf[4] == 127){             DATA[22] = 0x20;DATA[23] = 0x20;DATA[24] = 0x20;DATA[25] = 0x2D;DATA[26] = 0x2D;DATA[27] = 0x3A;DATA[28] = 0x2D;DATA[29] = 0x2D;}             else {             converter(buf[0]);             DATA[22] = digit1;             DATA[23] = digit2;             DATA[24] = 0x2D;             converter(buf[3]);             DATA[25] = digit1;             DATA[26] = digit2;             DATA[27] = 0x3A;             converter(buf[4]);             DATA[28] = digit1;             DATA[29] = digit2;             }           } }
  if(canId == 0x265) { bitWrite(DATA[21],6,bitRead(buf[0],4)); bitWrite(DATA[30],0,bitRead(buf[1],7)); bitWrite(DATA[30],1,bitRead(buf[1],6)); bitWrite(DATA[30],2,bitRead(buf[1],5)); bitWrite(DATA[30],3,bitRead(buf[0],5)); bitWrite(DATA[30],4,bitRead(buf[0],2)); DATA[32] = buf[2]; DATA[33] = buf[3]; }
            if(canId == 0x21F)           {           bitWrite(DATA[34],0,bitRead(buf[0],7));           bitWrite(DATA[34],1,bitRead(buf[0],6));           if(bitRead(buf[0],3) == 1 && bitRead(buf[0],2) == 1) bitWrite(DATA[34],2,1); else bitWrite(DATA[34],2,0);           if(bitRead(buf[0],3) == 1 && bitRead(buf[0],2) == 0) bitWrite(DATA[34],3,1); else bitWrite(DATA[34],3,0);           if(bitRead(buf[0],2) == 1 && bitRead(buf[0],3) == 0) bitWrite(DATA[34],4,1); else bitWrite(DATA[34],4,0);           bitWrite(DATA[34],5,bitRead(buf[0],1));           DATA[37] = buf[1];           }
            if(canId == 0x3E5)           {           bitWrite(DATA[34],6,(bitRead(buf[0],6)));           bitWrite(DATA[34],7,(bitRead(buf[0],4)));           bitWrite(DATA[35],0,(bitRead(buf[0],0)));           bitWrite(DATA[35],1,(bitRead(buf[1],6)));           bitWrite(DATA[35],2,(bitRead(buf[1],4)));           bitWrite(DATA[35],3,(bitRead(buf[1],0)));           bitWrite(DATA[35],4,(bitRead(buf[2],6)));           bitWrite(DATA[35],5,(bitRead(buf[2],4)));           bitWrite(DATA[35],6,(bitRead(buf[2],2)));           bitWrite(DATA[35],7,(bitRead(buf[5],6)));           bitWrite(DATA[36],0,(bitRead(buf[5],4)));           bitWrite(DATA[36],1,(bitRead(buf[5],2)));           bitWrite(DATA[36],2,(bitRead(buf[5],0)));           }   }
 
  //delay(2); //Не знаю зачем, но без этого и со строкой выше высыпается каша! arrcmp = memcmp(DATA,DATA2,161); if ((millis() - time0) > 100 && arrcmp != 0){   Serial.write(DATA, 161);   memcpy(DATA2,DATA,161);   time0 = millis();}   }
  void converter(int inpint){               if (inpint < 10){                 digit1 = 48;                 digit2 = inpint + 48;               }               else{                 if (inpint > 89) {digit1 = 9 + 48; digit2 = inpint - 42;}                 else if (inpint > 79) {digit1 = 8 + 48; digit2 = inpint - 32;}                      else if (inpint > 69) {digit1 = 7 + 48; digit2 = inpint - 22;}                           else if (inpint > 59) {digit1 = 6 + 48; digit2 = inpint - 12;}                                else if (inpint > 49) {digit1 = 5 + 48; digit2 = inpint - 2;}                                     else if (inpint > 39) {digit1 = 4 + 48; digit2 = inpint + 8;}                                          else if (inpint > 29) {digit1 = 3 + 48; digit2 = inpint + 18;}                                               else if (inpint > 19) {digit1 = 2 + 48; digit2 = inpint + 28;}                                                    else if (inpint > 9) {digit1 = 1 + 48; digit2 = inpint + 38;}               } }
  void multiframef(){               if (LengthP > 7)               {                 for (int i=0; i < 7;i++) MULTIFRAMETMP[i + DataBufSize] = buf[i+1];                 DataBufSize = DataBufSize + 7;                 LengthP = LengthP - 7;               }               else{                 for (int i=0; i < LengthP;i++) MULTIFRAMETMP[i + DataBufSize] = buf[i+1];                 LengthP = 0;               } }
  void multiframeRF(){               if (LengthR > 7)               {                 for (int i=0; i < 7;i++) DATA[i + DataBufSizeR] = buf[i+1];                 DataBufSizeR = DataBufSizeR + 7;                 LengthR = LengthR - 7;               }               else{                 for (int i=0; i < LengthR;i++) DATA[i + DataBufSizeR] = buf[i+1];                 LengthR = 0;               } } 
 
		 
		
		 
	 
  
	 |