mirror of https://github.com/LaskaKit/ESPlan.git
55 lines
1.3 KiB
C++
Executable File
55 lines
1.3 KiB
C++
Executable File
#ifndef WS_MB_CLIENT_H
|
||
#define WS_MB_CLIENT_H
|
||
/*
|
||
* mb_client.h – Modbus RTU klient pres RS485 / HardwareSerial
|
||
*
|
||
* FC03 – Read Holding Registers
|
||
* FC06 – Write Single Register
|
||
*
|
||
* DE pin (direction enable) rizen HW – nevyzaduje softwarove prepinani.
|
||
*/
|
||
|
||
#include <Arduino.h>
|
||
#include "cfg.h"
|
||
|
||
enum class ModbusStatus : uint8_t {
|
||
OK = 0,
|
||
TIMEOUT,
|
||
CRC_ERROR,
|
||
EXCEPTION,
|
||
FRAME_ERROR
|
||
};
|
||
|
||
class ModbusClient {
|
||
public:
|
||
ModbusClient() = default;
|
||
|
||
void begin(uint32_t baud = 4800, uint8_t addr = 1);
|
||
|
||
ModbusStatus readRegisters(uint8_t slaveAddr, uint16_t startReg,
|
||
uint8_t count, uint16_t* out);
|
||
|
||
ModbusStatus writeRegister(uint8_t slaveAddr, uint16_t reg, uint16_t value);
|
||
|
||
void setBaudRate(uint32_t baud);
|
||
|
||
const char* statusStr(ModbusStatus s);
|
||
|
||
// ── Posledni TX/RX frame ────────────────────────────────────────────
|
||
uint8_t lastTx[16];
|
||
uint8_t lastTxLen = 0;
|
||
uint8_t lastRx[80];
|
||
uint8_t lastRxLen = 0;
|
||
ModbusStatus lastResult = ModbusStatus::OK;
|
||
|
||
private:
|
||
HardwareSerial* _serial = nullptr;
|
||
uint32_t _baud = 4800;
|
||
static const uint16_t TIMEOUT_MS = 500;
|
||
|
||
uint16_t crc16(const uint8_t* data, uint8_t len);
|
||
void flushRx();
|
||
};
|
||
|
||
#endif // WS_MB_CLIENT_H
|