4 template <
size_t rxBufSize>
32 std::chrono::milliseconds
rxTimeout = 50ms)
33 : SerialBase(txPin, rxPin, baud),
45 if(!readable())
return;
51 queue->call([
this]() {
81 write(txBuf, txLen, [
this](
int e){
84 }, SERIAL_EVENT_TX_COMPLETE);
88 template <
size_t txBufSize,
size_t rxBufSize>
89 struct ModbusMaster : NonCopyable<ModbusMaster<txBufSize, rxBufSize>> {
110 enum struct FC : uint8_t {
143 std::chrono::milliseconds rxTimeout = 50ms)
145 stx(queue, txPin, rxPin, baud, std::chrono::microseconds((35 * MODBUS_MAX_LIFESPAN00) / baud), rxTimeout) {
163 uint32_t
crc16(uint8_t* buf,
int len) {
164 uint32_t crc = 0xFFFF;
165 for (
int pos = 0; pos < len; pos++) {
166 crc ^= (uint32_t) buf[pos];
167 for (
int i = 8; i != 0; i--) {
168 if ((crc & 0x0001) != 0) {
187 adu[
txIdx++] =
static_cast<uint8_t
>(fc);
200 uint8_t payloadLen = 0;
206 payloadLen = (num / 8) + 1;
213 payloadLen = num * 2;
219 for(
int i = 0; i < payloadLen; i++)
adu[
txIdx++] = val[i];
243 if(recvCRC != compCRC) {
268 uint8_t regCount = (rxLen - 5) / 2;
269 for(
int i = 0; i < regCount; i++) {
270 reg[i] = __builtin_bswap16(reg[i]);
288 uint16_t payload = __builtin_bswap16(val ? 0xFF00 : 0x0000);
302 val = __builtin_bswap16(val);
303 uint8_t* payload =
reinterpret_cast<uint8_t*
>(&val);
307 for(
int i = 0; i < num; i++) val[i] = __builtin_bswap16(val[i]);
308 uint8_t* payload =
reinterpret_cast<uint8_t*
>(val);