diff --git a/cube/User/Src/mbusComm.c b/cube/User/Src/mbusComm.c index 18d0dd0..7f2379e 100644 --- a/cube/User/Src/mbusComm.c +++ b/cube/User/Src/mbusComm.c @@ -266,22 +266,29 @@ void mbusCommISR() { // RXNEIE doesn't need to be considered since it is always on and more over the // RXNE flag is cleared by reading the DR, which is done in any case if (((isrflags & USART_SR_RXNE) != RESET) || ((isrflags & (USART_SR_ORE | USART_SR_FE | USART_SR_PE)) != RESET)) { + // Error flags are only valid together with the RX flag. + // They will be cleared by reading SR (already done above) followed by reading DR (below). + bool errorFound = false; if ((isrflags & USART_SR_ORE) != RESET) { - show(DEBUG_2, TOGGLE); + show(DEBUG_2, TOGGLE); mbusCommStats.uartOverrunCnt += 1; + errorFound = true; } if ((isrflags & USART_SR_FE) != RESET) { mbusCommStats.uartFramingErrCnt += 1; + errorFound = true; } if ((isrflags & USART_SR_PE) != RESET) { mbusCommStats.uartParityErrCnt += 1; + errorFound = true; } mbusCommStats.uartOctetCnt += 1; // it is required to read the DR in any case here, not only when the buffer has space // otherwise the interrupt flag won't be disabled, particularly important in case of // ORE uint8_t data = (uint8_t)(mbusUart.Instance->DR & (uint8_t)0x00FF); - if (mbusCommHandle.receiveBuffer.writeIdx < mbusCommHandle.receiveBuffer.size) { + if ((! errorFound) && + (mbusCommHandle.receiveBuffer.writeIdx < mbusCommHandle.receiveBuffer.size)) { mbusCommHandle.receiveBuffer.buffer[mbusCommHandle.receiveBuffer.writeIdx] = data; mbusCommHandle.receiveBuffer.writeIdx += 1; }