From 5333c09dd52a380eb12a05c4feae6fd8eb2c7b45 Mon Sep 17 00:00:00 2001 From: Perotto Date: Thu, 28 Jun 2018 10:30:35 -0300 Subject: [PATCH] Utilizar memoria flash para tabela de CRC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As funções para leitura da flash estão implementadas aqui. Não foi realizada nenhuma alteração quanto a Modbus em si. Existe a possibilidade de utilizar a EEPROM, porém torna-se mais lento e complicado. --- libraries/ModbusSerial/ModbusSerial.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libraries/ModbusSerial/ModbusSerial.cpp b/libraries/ModbusSerial/ModbusSerial.cpp index 30b8f25..bf25ac7 100644 --- a/libraries/ModbusSerial/ModbusSerial.cpp +++ b/libraries/ModbusSerial/ModbusSerial.cpp @@ -187,6 +187,7 @@ void ModbusSerial::task() { _len = 0; } +#ifndef USE_FLASH_PROGMEM word ModbusSerial::calcCrc(byte address, byte* pduFrame, byte pduLen) { byte CRCHi = 0xFF, CRCLo = 0x0FF, Index; @@ -202,8 +203,24 @@ word ModbusSerial::calcCrc(byte address, byte* pduFrame, byte pduLen) { return (CRCHi << 8) | CRCLo; } +#endif + +#ifdef USE_FLASH_PROGMEM +word ModbusSerial::calcCrc(byte address, byte* pduFrame, byte pduLen) { + byte CRCHi = 0xFF, CRCLo = 0x0FF, Index; + Index = CRCHi ^ address; + CRCHi = CRCLo ^ pgm_read_byte(&_auchCRCHi[Index]); + CRCLo = pgm_read_byte(&_auchCRCLo[Index]); + while (pduLen--) { + Index = CRCHi ^ *pduFrame++; + CRCHi = CRCLo ^ pgm_read_byte(&_auchCRCHi[Index]); + CRCLo = pgm_read_byte(&_auchCRCLo[Index]); + } + return (CRCHi << 8) | CRCLo; +} +#endif