16static constexpr uint16_t MODBUS_TX_BUFFER_SIZE = 15;
27 std::unique_ptr<uint8_t[]>
data;
31 std::memcpy(this->data.get(), src,
len);
42 void setup()
override;
54 void send(uint8_t
address, uint8_t function_code, uint16_t start_address, uint16_t number_of_entities,
55 uint8_t payload_len = 0,
const uint8_t *payload =
nullptr);
56 void send_raw(
const std::vector<uint8_t> &payload);
100 void send(uint8_t function, uint16_t start_address, uint16_t number_of_entities, uint8_t payload_len = 0,
101 const uint8_t *payload =
nullptr) {
102 this->
parent_->
send(this->
address_, function, start_address, number_of_entities, payload_len, payload);
106 std::vector<uint8_t> error_response;
107 error_response.reserve(3);
108 error_response.push_back(this->
address_);
110 error_response.push_back(
static_cast<uint8_t
>(exception_code));
114 ESPDEPRECATED(
"Use ready_for_immediate_send() instead. Removed in 2026.9.0",
"2026.3.0")
void send_raw(const std::vector< uint8_t > &payload)
void set_parent(Modbus *parent)
virtual void on_modbus_read_registers(uint8_t function_code, uint16_t start_address, uint16_t number_of_registers)
void send(uint8_t function, uint16_t start_address, uint16_t number_of_entities, uint8_t payload_len=0, const uint8_t *payload=nullptr)
virtual void on_modbus_data(const std::vector< uint8_t > &data)=0
bool ready_for_immediate_send()
ESPDEPRECATED("Use ready_for_immediate_send() instead. Removed in 2026.9.0", "2026.3.0") bool waiting_for_response()
void send_error(uint8_t function_code, ModbusExceptionCode exception_code)
virtual void on_modbus_error(uint8_t function_code, uint8_t exception_code)
void set_address(uint8_t address)
virtual void on_modbus_write_registers(uint8_t function_code, const std::vector< uint8_t > &data)
void set_flow_control_pin(GPIOPin *flow_control_pin)
std::deque< ModbusDeviceCommand > tx_buffer_
bool parse_modbus_byte_(uint8_t byte)
void send_raw(const std::vector< uint8_t > &payload)
void set_turnaround_time(uint16_t time_in_ms)
void set_role(ModbusRole role)
uint8_t waiting_for_response_
uint32_t last_modbus_byte_
GPIOPin * flow_control_pin_
void set_send_wait_time(uint16_t time_in_ms)
std::vector< ModbusDevice * > devices_
uint32_t last_send_tx_offset_
void queue_raw_(const uint8_t *data, uint16_t len)
void set_disable_crc(bool disable_crc)
float get_setup_priority() const override
uint16_t long_rx_buffer_delay_ms_
void dump_config() override
void receive_and_parse_modbus_bytes_()
void register_device(ModbusDevice *device)
std::vector< uint8_t > rx_buffer_
void clear_rx_buffer_(const LogString *reason, bool warn=false)
void send(uint8_t address, uint8_t function_code, uint16_t start_address, uint16_t number_of_entities, uint8_t payload_len=0, const uint8_t *payload=nullptr)
uint16_t turnaround_delay_ms_
const uint8_t FUNCTION_CODE_EXCEPTION_MASK
Providing packet encoding functions for exchanging data with a remote host.
uint16_t crc16(const uint8_t *data, uint16_t len, uint16_t crc, uint16_t reverse_poly, bool refin, bool refout)
Calculate a CRC-16 checksum of data with size len.
std::unique_ptr< uint8_t[]> data
ModbusDeviceCommand(const uint8_t *src, uint16_t len)