Dual communication helper for STM32 (Arduino core):
- Serial1: generic TX/RX helpers
- Serial2: Modbus RTU (MAX485) with DE/RE control pin
No sensor-specific logic. Drop-in utility you can reuse across projects.
- Build Modbus RTU frames (read holding registers, write single register)
- Send/receive with automatic DE/RE toggling
- CRC-16 (Modbus) calculation
- Optional debug via
Serial(hex dump TX/RX)
Serial2 TX->DISerial2 RX->RODEandREtied together -> configured pin (e.g.,PA4)GNDcommon- Power your MAX485 module as supported by your board/module
Place the folder as an Arduino library or publish on GitHub and use as a library.
#include <STM32DualComm.h>
constexpr uint8_t DE_RE_PIN = PA4; // change to your pin
STM32DualComm comm(Serial1, Serial2, DE_RE_PIN);
void setup() {
Serial.begin(115200);
comm.setDebug(&Serial); // optional
comm.begin(115200, 4800); // Serial1, Serial2 baudrates
}
void loop() {
uint8_t data[2];
uint16_t bytes;
if (comm.readHoldingRegisters(1, 0x0000, 1, data, sizeof data, 1000, &bytes)) {
uint16_t value = (uint16_t)(data[0] << 8) | data[1];
Serial.println(value);
}
delay(1000);
}See examples/BasicModbus for a complete sketch.
STM32DualComm(HardwareSerial &serial1, HardwareSerial &serial2, uint8_t deRePin)void begin(uint32_t serial1Baud, uint32_t modbusBaud)void setDebug(Stream *debug)bool readHoldingRegisters(uint8_t slave, uint16_t startReg, uint16_t quantity, uint8_t *dataOut, size_t dataOutLen, uint32_t timeoutMs, uint16_t *outBytesRead)bool writeSingleRegister(uint8_t slave, uint16_t reg, uint16_t value, uint32_t timeoutMs)size_t buildReadHoldingRegisters(...),size_t buildWriteSingleRegister(...)bool sendRawModbus(const uint8_t *frame, size_t length)int receiveModbus(uint8_t *buffer, size_t maxLength, uint16_t minLength, uint32_t timeoutMs)static uint16_t calculateCRC(const uint8_t *data, size_t length)
MIT
STM32 (Arduino çekirdeği) için çift haberleşme yardımcısı:
- Serial1: genel amaçlı TX/RX yardımcıları
- Serial2: DE/RE kontrol pini ile Modbus RTU (MAX485)
Sensöre özgü hiçbir mantık içermez. Projelerinizde tekrar kullanılabilir yardımcı kütüphane.
- Modbus RTU çerçeveleri oluşturma (holding register oku, tek register yaz)
- DE/RE otomatik kontrol ile gönderme/alma
- CRC-16 (Modbus) hesaplama
- İsteğe bağlı
Serialüzerinden debug (TX/RX hex dökümü)
Serial2 TX->DISerial2 RX->RODEveREberaber -> seçilen pin (ör.PA4)- Ortak
GND - MAX485 modülünü kartınızın/modülünüzün desteklediği şekilde besleyin
Klasörü bir Arduino kütüphanesi olarak ekleyin veya GitHub’a yayınlayıp Library Manager ile kurun.
#include <STM32DualComm.h>
constexpr uint8_t DE_RE_PIN = PA4; // kendi pininize göre değiştirin
STM32DualComm comm(Serial1, Serial2, DE_RE_PIN);
void setup() {
Serial.begin(115200);
comm.setDebug(&Serial); // isteğe bağlı
comm.begin(115200, 4800); // Serial1 ve Serial2 baud hızları
}
void loop() {
uint8_t data[2];
uint16_t bytes;
if (comm.readHoldingRegisters(1, 0x0000, 1, data, sizeof data, 1000, &bytes)) {
uint16_t value = (uint16_t)(data[0] << 8) | data[1];
Serial.println(value);
}
delay(1000);
}Tam örnek için examples/BasicModbus klasörüne bakın.
STM32DualComm(HardwareSerial &serial1, HardwareSerial &serial2, uint8_t deRePin)void begin(uint32_t serial1Baud, uint32_t modbusBaud)void setDebug(Stream *debug)bool readHoldingRegisters(uint8_t slave, uint16_t startReg, uint16_t quantity, uint8_t *dataOut, size_t dataOutLen, uint32_t timeoutMs, uint16_t *outBytesRead)bool writeSingleRegister(uint8_t slave, uint16_t reg, uint16_t value, uint32_t timeoutMs)size_t buildReadHoldingRegisters(...),size_t buildWriteSingleRegister(...)bool sendRawModbus(const uint8_t *frame, size_t length)int receiveModbus(uint8_t *buffer, size_t maxLength, uint16_t minLength, uint32_t timeoutMs)static uint16_t calculateCRC(const uint8_t *data, size_t length)
MIT