#include
#include
#include
// 定义串口对象
HardwareSerial SerialModbus(2); // 使用ESP32的串口2
// 定义Modbus从机对象
ModbusRTU modbus;
// 定义从机地址和波特率
uint8_t slaveAddress = 1; // 默认从机地址为1
long baudRate = 9600; // 默认波特率为9600
// 点灯控制引脚
const int ledPin = 2;
// EEPROM地址
int eepromAddress = 0;
void setup() {
// 初始化串口和Modbus从机
Serial.begin(115200);
SerialModbus.begin(baudRate, SERIAL_8N1, 16, 17); // 配置串口2
modbus.begin(&SerialModbus, slaveAddress); // 设置从机地址
// 配置点灯引脚
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// 读取EEPROM中的参数
EEPROM.begin(512);
EEPROM.get(eepromAddress, slaveAddress);
EEPROM.get(eepromAddress + 1, baudRate);
EEPROM.end();
// 注册Modbus回调函数
modbus.configureCoils(0, 1, onCoilWrite);
}
void loop() {
// 处理Modbus请求
modbus.task();
// 执行其他任务
// ...
// 检查是否需要恢复初始设置
if (digitalRead(5) == HIGH) {
delay(5000); // 延时5秒
restoreDefaultSettings();
}
}
// Modbus回调函数,当写入线圈时被调用
void onCoilWrite(uint16_t address, uint16_t value) {
if (address == 0) {
// 控制点灯状态
digitalWrite(ledPin, value ? HIGH : LOW);
}
}
// 通过串口接收命令,修改从机地址和波特率
void serialEvent() {
while (Serial.available()) {
String command = Serial.readStringUntil('\n');
command.trim();
if (command.startsWith("address")) {
// 修改从机地址
slaveAddress = command.substring(7).toInt();
modbus.setSlaveAddress(slaveAddress);
Serial.println("从机地址已修改为: " + String(slaveAddress));
} else if (command.startsWith("baudrate")) {
// 修改波特率
baudRate = command.substring(9).toInt();
SerialModbus.begin(baudRate, SERIAL_8N1, 16, 17);
Serial.println("波特率已修改为: " + String(baudRate));
}
}
}
// 恢复初始设置
void restoreDefaultSettings() {
// 恢复从机地址和波特率为默认值
slaveAddress = 1;
baudRate = 9600;
// 将参数写入EEPROM
EEPROM.begin(512);
EEPROM.put(eepromAddress, slaveAddress);
EEPROM.put(eepromAddress + 1, baudRate);
EEPROM.end();
// 重启ESP32
ESP.restart();
}
本文暂时没有评论,来添加一个吧(●'◡'●)