diff --git a/src/knx/tpuart_data_link_layer.cpp b/src/knx/tpuart_data_link_layer.cpp index 1fafce5..bf28649 100644 --- a/src/knx/tpuart_data_link_layer.cpp +++ b/src/knx/tpuart_data_link_layer.cpp @@ -123,11 +123,16 @@ void TpUartDataLinkLayer::loop() { if (!_enabled) { - if (millis() - _lastResetChipTime > 1000) - { - //reset chip every 1 seconds - _lastResetChipTime = millis(); - _enabled = resetChip(); + if(_waitConfirmStartTime == 0) + { + if (millis() - _lastResetChipTime > 1000) + { + //reset chip every 1 seconds + _lastResetChipTime = millis(); + _enabled = resetChip(); + } + } else { + _enabled = resetChipTick(); } } @@ -485,17 +490,30 @@ bool TpUartDataLinkLayer::sendFrame(CemiFrame& frame) bool TpUartDataLinkLayer::resetChip() { + if(_waitConfirmStartTime > 0) return false; uint8_t cmd = U_RESET_REQ; _platform.writeUart(cmd); + + int resp = _platform.readUart(); + if (resp == U_RESET_IND) + return true; + _waitConfirmStartTime = millis(); - while (true) + return false; +} + +bool TpUartDataLinkLayer::resetChipTick() +{ + int resp = _platform.readUart(); + if (resp == U_RESET_IND) { - int resp = _platform.readUart(); - if (resp == U_RESET_IND) - return true; - else if (millis() - _waitConfirmStartTime > RESET_TIMEOUT) - return false; + _waitConfirmStartTime = 0; + return true; } + else if (millis() - _waitConfirmStartTime > RESET_TIMEOUT) + _waitConfirmStartTime = 0; + + return false; } void TpUartDataLinkLayer::stopChip() diff --git a/src/knx/tpuart_data_link_layer.h b/src/knx/tpuart_data_link_layer.h index 92332ad..9cc658b 100644 --- a/src/knx/tpuart_data_link_layer.h +++ b/src/knx/tpuart_data_link_layer.h @@ -45,7 +45,7 @@ class TpUartDataLinkLayer : public DataLinkLayer uint32_t _lastByteRxTime; uint32_t _lastByteTxTime; uint32_t _lastLoopTime; - uint32_t _waitConfirmStartTime; + uint32_t _waitConfirmStartTime = 0; uint32_t _lastResetChipTime = 0; struct _tx_queue_frame_t @@ -70,6 +70,7 @@ class TpUartDataLinkLayer : public DataLinkLayer void dataConBytesReceived(uint8_t* buffer, uint16_t length, bool success); void enterRxWaitEOP(); bool resetChip(); + bool resetChipTick(); void stopChip(); ITpUartCallBacks& _cb;