程序员开发实例大全宝库

网站首页 > 编程文章 正文

【Modbus】串口对象Hardware(module bus串口协议)

zazugpt 2024-08-27 00:34:40 编程文章 16 ℃ 0 评论

#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();

}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表