/// Process data received by UART /// void simpleBinary::processSerial() { while (serial->available() > 0) { int data = serial->read(); serbuf[serbuflen++] = data; } if(serbuflen > 3) { receiveTime = millis(); if(serbuf[0] == _uartAddress) { int address; char crc; switch(serbuf[1]) { //new data case (char)0xD0: if(serbuf[2] == 0x01) { //force all output data as new through user function forceAllNewData(); } if(serbuf[2] == 0x00 || serbuf[2] == 0x01) { crc = CRC8::evalCRC(serbuf,3); if(crc != serbuf[3]) sendWrongData(crc); else checkNewData(); } else sendUnknownData(); serbuflen = 0; break; //read data case (char)0xD1: if(serbuflen < 5) break; address = serbuf[2] | (serbuf[3] << 8); crc = CRC8::evalCRC(serbuf,4); if(crc != serbuf[4]) sendWrongData(crc); else readData(address); serbuflen = 0; break; //write byte case (char)0xDA: if(serbuflen < 6) break; //address address = serbuf[2] | (serbuf[3] << 8); //crc check crc = CRC8::evalCRC(serbuf,5); if(serbuf[5] != crc) sendWrongData(crc); else { //check address if(!checkAddress(address)) sendInvalidAddress(); //write data into memory if(saveByte(address,serbuf+4)) sendOK(); else sendSavingError(); } //clear buffer serbuflen = 0; break; //write word case (char)0xDB: if(serbuflen < 7) break; //address address = serbuf[2] | (serbuf[3] << 8); //crc check crc = CRC8::evalCRC(serbuf,6); if(serbuf[6] != crc) sendWrongData(crc); else { //check address if(!checkAddress(address)) sendInvalidAddress(); //write data into memory if(saveWord(address,serbuf+4)) sendOK(); else sendSavingError(); } //clear buffer serbuflen = 0; break; //write dword case (char)0xDC: case (char)0xDD: if(serbuflen < 9) break; //address address = serbuf[2] | (serbuf[3] << 8); //crc check crc = CRC8::evalCRC(serbuf,8); if(serbuf[8] != crc) sendWrongData(crc); else { //check address if(!checkAddress(address)) sendInvalidAddress(); //write data into memory if(saveDword(address,serbuf+4)) sendOK(); else sendSavingError(); } //clear buffer serbuflen = 0; break; //write array case (char)0xDE: if(serbuflen < 6) break; int datalen; datalen = (serbuf[4] | (serbuf[5] << 8)); //correct packet length check if(serbuflen < 7 + datalen) break; //address address = serbuf[2] | (serbuf[3] << 8); //crc check crc = CRC8::evalCRC(serbuf,6+datalen); if(serbuf[7+datalen] != crc) sendWrongData(crc); else { //check address if(!checkAddress(address)) sendInvalidAddress(); char *pData = serbuf + 6; //write data into memory if(saveArray(address,pData, datalen)) sendOK(); else sendSavingError(); } //clear buffer serbuflen = 0; break; default: serbuflen = 0; sendUnknownData(); break; } } else { serbuflen = 0; return; } } }
virtual void addWord(WordT tempWord, CountT=0) { std::string saveWord(tempWord); insert(saveWord); }