1
0
mirror of https://github.com/esphome/esphome.git synced 2024-10-07 11:20:58 +01:00

ignore exception when not waiting for a response (#2552)

This commit is contained in:
Martin 2021-10-19 23:10:24 +02:00 committed by Jesse Hills
parent 3a760fbb44
commit 1b0e60374b
No known key found for this signature in database
GPG Key ID: BEAAE804EFD8E83A

View File

@ -96,23 +96,27 @@ bool Modbus::parse_modbus_byte_(uint8_t byte) {
ESP_LOGW(TAG, "Modbus CRC Check failed! %02X!=%02X", computed_crc, remote_crc); ESP_LOGW(TAG, "Modbus CRC Check failed! %02X!=%02X", computed_crc, remote_crc);
return false; return false;
} }
waiting_for_response = 0;
std::vector<uint8_t> data(this->rx_buffer_.begin() + data_offset, this->rx_buffer_.begin() + data_offset + data_len); std::vector<uint8_t> data(this->rx_buffer_.begin() + data_offset, this->rx_buffer_.begin() + data_offset + data_len);
bool found = false; bool found = false;
for (auto *device : this->devices_) { for (auto *device : this->devices_) {
if (device->address_ == address) { if (device->address_ == address) {
// Is it an error response? // Is it an error response?
if ((function_code & 0x80) == 0x80) { if ((function_code & 0x80) == 0x80) {
ESP_LOGW(TAG, "Modbus error function code: 0x%X exception: %d", function_code, raw[2]); ESP_LOGD(TAG, "Modbus error function code: 0x%X exception: %d", function_code, raw[2]);
if (waiting_for_response != 0) {
device->on_modbus_error(function_code & 0x7F, raw[2]); device->on_modbus_error(function_code & 0x7F, raw[2]);
} else {
// Ignore modbus exception not related to a pending command
ESP_LOGD(TAG, "Ignoring Modbus error - not expecting a response");
}
} else { } else {
device->on_modbus_data(data); device->on_modbus_data(data);
} }
found = true; found = true;
} }
} }
waiting_for_response = 0;
if (!found) { if (!found) {
ESP_LOGW(TAG, "Got Modbus frame from unknown address 0x%02X! ", address); ESP_LOGW(TAG, "Got Modbus frame from unknown address 0x%02X! ", address);
} }
@ -196,6 +200,7 @@ void Modbus::send_raw(const std::vector<uint8_t> &payload) {
if (this->flow_control_pin_ != nullptr) if (this->flow_control_pin_ != nullptr)
this->flow_control_pin_->digital_write(false); this->flow_control_pin_->digital_write(false);
waiting_for_response = payload[0]; waiting_for_response = payload[0];
ESP_LOGV(TAG, "Modbus write raw: %s", hexencode(payload).c_str());
last_send_ = millis(); last_send_ = millis();
} }