Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

118 řádky
3.6 KiB

  1. /***********************************************************************
  2. * Copyright (C) 2025-, XINJE Co., Ltd.
  3. *
  4. * File Name: serial_communication.h
  5. * Description: Modbus主站的串口通信头文件
  6. * Others:
  7. * Version: v1.0
  8. * Author: weikai XINJE
  9. * Date: 2025-7-30
  10. ***********************************************************************/
  11. #ifndef SERIALCOMMUNICATOR_H
  12. #define SERIALCOMMUNICATOR_H
  13. #include <QObject>
  14. #include <QSerialPort>
  15. #include <QSerialPortInfo>
  16. #include <QByteArray>
  17. #include <QString>
  18. #include"timeout_handler.h"
  19. /**********************************************************************
  20. * Iterates over the contents of a SerialCommunicator.
  21. *SerialCommunicator
  22. *提供串口通信功能,连接,断开连接,发送数据,接收数据处理等
  23. *调用TimeoutHandler实例进行超时处理
  24. ***********************************************************************/
  25. class SerialCommunicator : public QObject
  26. {
  27. Q_OBJECT
  28. public:
  29. // 构造函数
  30. explicit SerialCommunicator(QObject *parent = nullptr);
  31. ~SerialCommunicator();
  32. // 参数设置接口
  33. void setPortName(const QString &portName);
  34. void setBaudRate(int baudRate);
  35. void setDataBits(QSerialPort::DataBits dataBits);
  36. void setStopBits(QSerialPort::StopBits stopBits);
  37. void setParity(QSerialPort::Parity parity);
  38. //设置是否可以开始心跳
  39. void setIsCanHeart(bool flag) {isCanHeartbeat_ = flag;}
  40. void setHeartbeatDFrame(const QByteArray& frame){ heartbeatFrame_ = frame; }
  41. // 初始化函数(设置默认参数)
  42. void init();
  43. // 连接/断开接口
  44. bool connectDevice();
  45. void disconnectDevice();
  46. // 设置超时参数
  47. bool setTimeoutSettings(int timeoutMs, int maxRetries);
  48. //获取
  49. void getTimeoutSettings(int& timeoutMs,int& maxRetries);
  50. // 发送数据接口
  51. bool sendData(const QByteArray &data);
  52. // 状态查询接口
  53. bool isConnected() const;
  54. //获取可用端口列表
  55. QStringList getAvailablePorts();
  56. signals:
  57. // 数据接收信号(发送处理后的十六进制字符串)
  58. void dataReceived(const QString &hexData);
  59. // 状态通知信号
  60. void statusChanged(const QString &status);
  61. // 错误通知信号
  62. void errorOccurred(const QString &errorMsg);
  63. // 连接断开信号
  64. void connectionDisconnected();
  65. private:
  66. // 内部数据接收处理
  67. void onReadyRead();
  68. // 处理超时信号
  69. void onTimeoutOccurred(int currentRetry);
  70. // 处理最大重试次数达到
  71. void onMaxRetriesReached();
  72. //处理串口错误
  73. void onSerialError(QSerialPort::SerialPortError error);
  74. //发送心跳槽函数
  75. void onSendHeartbeat();
  76. //心跳超时槽函数
  77. void onHeartbeatTimeout();
  78. //启动心跳机制
  79. void startHeartbeat();
  80. //停止心跳机制
  81. void stopHeartbeat();
  82. QSerialPort *serialPort_;// 串口对象
  83. // 串口参数
  84. QString portName_;//串口名
  85. int baudRate_;//波特率
  86. QSerialPort::DataBits dataBits_;//数据位
  87. QSerialPort::StopBits stopBits_;//停止位
  88. QSerialPort::Parity parity_;//奇偶校验
  89. bool connected_;// 连接状态
  90. TimeoutHandler timeoutHandler_; // 超时处理器
  91. QByteArray pendingData_; // 等待响应的数据(用于重发)
  92. //断线重连
  93. QTimer* heartbeatTimer_;//定期发送心跳帧
  94. QTimer* heartbeatTimeoutTimer_;//心跳响应计时器
  95. int heartbeatInterval_;//心跳间隔
  96. int heartbeatTimeout_;//心跳响应时间
  97. QByteArray heartbeatFrame_;//心跳帧
  98. bool isCanHeartbeat_;//是否可以开始心跳
  99. };
  100. #endif // SERIALCOMMUNICATOR_H