129 lines
3.5 KiB
C
Raw Normal View History

2025-10-24 23:19:44 +08:00
#ifndef MODBUSRTUMASTER_H
#define MODBUSRTUMASTER_H
#include <QObject>
#include <QTimer>
#include <atomic>
#include <thread>
#include <mutex>
#include <functional>
// 包含Modbus库头文件
extern "C" {
#include "modbus.h"
#include "modbus-rtu.h"
}
/**
* @brief Modbus-RTU主端类
*
*/
class ModbusRTUMaster : public QObject
{
Q_OBJECT
public:
/**
* @brief
* @param parent
*/
explicit ModbusRTUMaster(QObject *parent = nullptr);
/**
* @brief
*/
~ModbusRTUMaster();
/**
* @brief Modbus-RTU主端
* @param device "/dev/ttyS4"
* @param baud
* @param parity ('N':, 'E':, 'O':)
* @param dataBit (8)
* @param stopBit (1)
* @return 0--
*/
int Initialize(const QString& device, int baud = 115200, char parity = 'N', int dataBit = 8, int stopBit = 1);
/**
* @brief
*/
void Deinitialize();
/**
* @brief
* @param callback
*/
void SetTemperatureCallback(const std::function<void(float)>& callback);
/**
* @brief
* @return 0--
*/
int StartReading();
/**
* @brief
*/
void StopReading();
/**
* @brief
* @return true-false-
*/
bool IsRunning() const;
private slots:
/**
* @brief
*/
void OnReadTimer();
private:
/**
* @brief
* @param temperature[out]
* @return 0--
*/
int ReadTemperature(float& temperature);
/**
* @brief Modbus寄存器格式
* @param temperature
* @param[out] registers 2
*/
void ConvertTemperatureToRegisters(float temperature, uint16_t registers[2]);
private:
// Modbus相关
modbus_t* m_pModbusCtx; // Modbus上下文
QString m_device; // 串口设备路径
int m_baud; // 波特率
char m_parity; // 校验位
int m_dataBit; // 数据位
int m_stopBit; // 停止位
uint8_t m_slaveAddr; // 从机地址
std::chrono::milliseconds m_responseTimeout; // 响应超时时间
// 运行状态
std::atomic<bool> m_bInitialized; // 是否已初始化
std::atomic<bool> m_bRunning; // 是否正在运行
// 定时器
QTimer* m_pReadTimer; // 读取定时器
std::chrono::milliseconds m_readInterval; // 读取间隔
// 温度数据回调函数
std::function<void(float)> m_temperatureCallback; // 温度数据回调
// 互斥锁
mutable std::mutex m_mutex; // 线程安全互斥锁
// Modbus地址映射
static const uint16_t TEMPERATURE_ADDR = 0x00; // 温度寄存器地址
static const uint16_t TEMPERATURE_QUANTITY = 2; // 温度寄存器数量float需要2个寄存器
};
#endif // MODBUSRTUMASTER_H