You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 lines
4.5 KiB

12 months ago
12 months ago
12 months ago
12 months ago
  1. #include "modbus_block_host.hpp"
  2. #include "modbus_basic.hpp"
  3. using namespace iflytop;
  4. #define PRV_DEBUG 0
  5. ModbusBlockHost::ModbusBlockHost() {}
  6. ModbusBlockHost::~ModbusBlockHost() {}
  7. void ModbusBlockHost::initialize(UART_HandleTypeDef *huart) {
  8. this->huart = huart;
  9. m_modbus_lock.init();
  10. }
  11. void ModbusBlockHost::enableDump(bool enable) { m_dump = enable; }
  12. void ModbusBlockHost::cleanRxBuff() { //
  13. HAL_StatusTypeDef status;
  14. do {
  15. status = HAL_UART_Receive(huart, rxbuff, 1, 1);
  16. } while (status == HAL_OK);
  17. }
  18. void ModbusBlockHost::uarttx(uint8_t *buff, size_t len) {
  19. ZASSERT(len < sizeof(txbuff));
  20. if (m_dump) {
  21. printf("uart_tx:\n");
  22. for (size_t i = 0; i < len; i++) {
  23. printf("%02x ", buff[i]);
  24. }
  25. printf("\n");
  26. }
  27. // HAL_UART_Transmit(huart, buff, len, 1000);
  28. HAL_UART_DMAStop(huart);
  29. HAL_StatusTypeDef ret = HAL_UART_Transmit_DMA(huart, buff, len);
  30. ZASSERT(ret == HAL_OK);
  31. // 等待DMA传输完成
  32. while (true) {
  33. if (HAL_UART_GetState(huart) == HAL_UART_STATE_READY) break;
  34. }
  35. return;
  36. }
  37. bool ModbusBlockHost::uartrx(uint8_t *buff, size_t len, int overtimems) {
  38. HAL_StatusTypeDef status;
  39. ZASSERT(len < sizeof(rxbuff));
  40. status = HAL_UART_Receive_DMA(huart, buff, len);
  41. if (status != HAL_OK) {
  42. return false;
  43. }
  44. for (size_t i = 0; i < overtimems; i++) {
  45. osDelay(3);
  46. if (HAL_UART_GetState(huart) == HAL_UART_STATE_READY) {
  47. if (m_dump) {
  48. if (status == HAL_OK) {
  49. printf("uart_rx:");
  50. for (size_t i = 0; i < len; i++) {
  51. printf("%02x ", buff[i]);
  52. }
  53. printf("\n");
  54. }
  55. }
  56. return true;
  57. }
  58. }
  59. #if PRV_DEBUG
  60. printf("uart_rx timeout\n");
  61. #endif
  62. HAL_UART_Abort(huart);
  63. HAL_UART_DMAStop(huart);
  64. return false;
  65. }
  66. bool ModbusBlockHost::readReg03(uint8_t slaveAddr, uint16_t regAddr, uint16_t *regVal, int overtimems) {
  67. zlock_guard lck(m_modbus_lock);
  68. txbuff[0] = slaveAddr;
  69. txbuff[1] = 0x03;
  70. txbuff[2] = regAddr >> 8;
  71. txbuff[3] = regAddr & 0xff;
  72. txbuff[4] = 0x00;
  73. txbuff[5] = 0x01;
  74. modbus_pack_crc_to_packet(txbuff, 6 + 2);
  75. cleanRxBuff();
  76. uarttx(txbuff, 6 + 2);
  77. bool status;
  78. status = uartrx(rxbuff, 5 + 2, overtimems);
  79. if (!status) {
  80. return false;
  81. }
  82. if (!modbus_checkcrc16(rxbuff, 7)) {
  83. ZLOGE("ModbusBlockHost", "crc error");
  84. return false;
  85. }
  86. *regVal = (((uint16_t)(rxbuff[3])) << 8) | rxbuff[4];
  87. return true;
  88. }
  89. // static const char *hex2str(uint8_t *buff, size_t len) {
  90. // static char str[100];
  91. // for (size_t i = 0; i < len; i++) {
  92. // sprintf(str + i * 2, "%02x", buff[i]);
  93. // }
  94. // return str;
  95. // }
  96. bool ModbusBlockHost::readReg03Muti(uint8_t slaveAddr, uint16_t regAddr, uint16_t *regVal, int regNum, int overtimems) {
  97. zlock_guard lck(m_modbus_lock);
  98. txbuff[0] = slaveAddr;
  99. txbuff[1] = 0x03;
  100. txbuff[2] = regAddr >> 8;
  101. txbuff[3] = regAddr & 0xff;
  102. txbuff[4] = 0x00;
  103. txbuff[5] = regNum;
  104. modbus_pack_crc_to_packet(txbuff, 6 + 2);
  105. cleanRxBuff();
  106. uarttx(txbuff, 6 + 2);
  107. bool status;
  108. // 14*2 = 28
  109. status = uartrx(rxbuff, 5 + regNum * 2, overtimems);
  110. if (!status) {
  111. return false;
  112. }
  113. if (!modbus_checkcrc16(rxbuff, 5 + regNum * 2)) {
  114. ZLOGE("ModbusBlockHost", "crc error");
  115. return false;
  116. }
  117. for (int i = 0; i < regNum; i++) {
  118. regVal[i] = ((uint16_t)(rxbuff[3 + i * 2]) << 8) | rxbuff[4 + i * 2];
  119. // int16_t val = regVal[i] ;
  120. // ZLOGI("RX", "%d", val);
  121. }
  122. return true;
  123. }
  124. bool ModbusBlockHost::writeReg06(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal, int overtimems) {
  125. zlock_guard lck(m_modbus_lock);
  126. txbuff[0] = slaveAddr;
  127. txbuff[1] = 0x06;
  128. txbuff[2] = regAddr >> 8;
  129. txbuff[3] = regAddr & 0xff;
  130. txbuff[4] = regVal >> 8;
  131. txbuff[5] = regVal & 0xff;
  132. modbus_pack_crc_to_packet(txbuff, 6 + 2);
  133. cleanRxBuff();
  134. uarttx(txbuff, 6 + 2);
  135. bool status;
  136. status = uartrx(rxbuff, 8, overtimems);
  137. if (status && modbus_checkcrc16(rxbuff, 8)) {
  138. return true;
  139. }
  140. return false;
  141. }
  142. bool ModbusBlockHost::writeReg10(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal, int overtimems) {
  143. zlock_guard lck(m_modbus_lock);
  144. txbuff[0] = slaveAddr;
  145. txbuff[1] = 0x10;
  146. txbuff[2] = regAddr >> 8;
  147. txbuff[3] = regAddr & 0xff;
  148. txbuff[4] = 0x00;
  149. txbuff[5] = 0x01;
  150. txbuff[6] = 0x02; // 字节数
  151. txbuff[7] = regVal >> 8;
  152. txbuff[8] = regVal & 0xff;
  153. modbus_pack_crc_to_packet(txbuff, 9 + 2);
  154. cleanRxBuff();
  155. uarttx(txbuff, 9 + 2);
  156. bool status;
  157. status = uartrx(rxbuff, 8, overtimems);
  158. if (status && modbus_checkcrc16(rxbuff, 8)) {
  159. return true;
  160. }
  161. return false;
  162. }