diff --git a/include/PowerMeterSerialSdm.h b/include/PowerMeterSerialSdm.h index b6ff987f..941d2132 100644 --- a/include/PowerMeterSerialSdm.h +++ b/include/PowerMeterSerialSdm.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "Configuration.h" #include "PowerMeterProvider.h" #include "SDM.h" @@ -49,8 +50,7 @@ private: mutable std::mutex _valueMutex; - static char constexpr _sdmSerialPortOwner[] = "SDM power meter"; - std::unique_ptr _upSdmSerial = nullptr; + std::unique_ptr _upSdmSerial = nullptr; std::unique_ptr _upSdm = nullptr; TaskHandle_t _taskHandle = nullptr; diff --git a/lib/SdmEnergyMeter/SDM.cpp b/lib/SdmEnergyMeter/SDM.cpp index 6488e247..4e12d3c6 100644 --- a/lib/SdmEnergyMeter/SDM.cpp +++ b/lib/SdmEnergyMeter/SDM.cpp @@ -393,8 +393,18 @@ void SDM::modbusWrite(uint8_t* data, size_t messageLength) { resptime = millis() + waitForBytesSent_ms; } +#if !defined ( USE_HARDWARESERIAL ) + // prevent scheduler from messing up the serial message. this task shall only + // be scheduled after the whole serial message was transmitted. + vTaskSuspendAll(); +#endif + sdmSer.write(data, messageLength); //send 8 bytes - + +#if !defined ( USE_HARDWARESERIAL ) + xTaskResumeAll(); +#endif + if (_dere_pin != NOT_A_PIN) { const int32_t timeleft = (int32_t) (resptime - millis()); if (timeleft > 0) { diff --git a/lib/SdmEnergyMeter/SDM_Config_User.h b/lib/SdmEnergyMeter/SDM_Config_User.h index 7d8e75b8..bd8d4358 100644 --- a/lib/SdmEnergyMeter/SDM_Config_User.h +++ b/lib/SdmEnergyMeter/SDM_Config_User.h @@ -14,7 +14,7 @@ * define or undefine USE_HARDWARESERIAL (uncomment only one or none) */ //#undef USE_HARDWARESERIAL -#define USE_HARDWARESERIAL +//#define USE_HARDWARESERIAL //------------------------------------------------------------------------------ diff --git a/src/PowerMeterSerialSdm.cpp b/src/PowerMeterSerialSdm.cpp index 75487cd6..fea191b5 100644 --- a/src/PowerMeterSerialSdm.cpp +++ b/src/PowerMeterSerialSdm.cpp @@ -23,8 +23,6 @@ PowerMeterSerialSdm::~PowerMeterSerialSdm() _upSdmSerial->end(); _upSdmSerial = nullptr; } - - SerialPortManager.freePort(_sdmSerialPortOwner); } bool PowerMeterSerialSdm::init() @@ -40,13 +38,9 @@ bool PowerMeterSerialSdm::init() return false; } - auto oHwSerialPort = SerialPortManager.allocatePort(_sdmSerialPortOwner); - if (!oHwSerialPort) { return false; } - - _upSdmSerial = std::make_unique(*oHwSerialPort); - _upSdmSerial->end(); // make sure the UART will be re-initialized + _upSdmSerial = std::make_unique(); _upSdm = std::make_unique(*_upSdmSerial, 9600, pin.powermeter_dere, - SERIAL_8N1, pin.powermeter_rx, pin.powermeter_tx); + SWSERIAL_8N1, pin.powermeter_rx, pin.powermeter_tx); _upSdm->begin(); std::unique_lock lock(_pollingMutex);