modbus.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "modbus.h"
  2. // ModbusRtu 01帧、02帧、03帧、04帧、05帧、06帧发送函数
  3. void (*func_modbus_send_frame[7])(u16 register_addr, u16 count, void (*Func_Send)(const u8 *data, u16 count)) = {0, mosbus_send_frame01, mosbus_send_frame02, mosbus_send_frame03, mosbus_send_frame03, mosbus_send_frame05, mosbus_send_frame06}; // modbus 6种类型帧
  4. /****************************************************
  5. * 函 数 名:Count_CRC
  6. * 函数功能:计算CRC数据
  7. * 入口参数:addr: 数据指针 num: 数量
  8. * 说 明:无
  9. *****************************************************/
  10. unsigned short count_crc(const u8 *addr, int num)
  11. {
  12. unsigned short crc = 0xFFFF;
  13. int i;
  14. while (num--)
  15. {
  16. crc ^= *addr++;
  17. for (i = 0; i < 8; i++)
  18. {
  19. crc = (crc & 0x0001) ? ((crc >> 1) ^ 0xA001) : (crc >> 1);
  20. }
  21. }
  22. return crc;
  23. }
  24. /****************************************************
  25. * 函 数 名:ModbusRtu_SendFrame01
  26. * 函数功能:发送空调01帧
  27. * 入口参数:register_addr 寄存器地址 count 数量
  28. * 说 明:无
  29. ****************************************************/
  30. void mosbus_send_frame01(u16 register_addr, u16 count, FuncSend_TypeDef Func_Send)
  31. {
  32. // 01 03 地址H 地址L 数量H 数量L CRC-L CRC-H
  33. union ModbusRtu_03Frame_Tx_Union_TypeDef ModbusRtu_03Frame_Tx_Union = {1, 3, 0, 1}; // 空调03帧
  34. ModbusRtu_03Frame_Tx_Union.Frame03.register_addr = __REV16(register_addr);
  35. ModbusRtu_03Frame_Tx_Union.Frame03.register_count = __REV16(count);
  36. ModbusRtu_03Frame_Tx_Union.Frame03.crc = count_crc(ModbusRtu_03Frame_Tx_Union.send_buff, 6);
  37. Func_Send((const u8 *)ModbusRtu_03Frame_Tx_Union.send_buff, 8); // DMA发送报文
  38. }
  39. /****************************************************
  40. * 函 数 名:ModbusRtu_SendFrame02
  41. * 函数功能:发送空调02帧
  42. * 入口参数:register_addr 寄存器地址 count 数量
  43. * 说 明:无
  44. ****************************************************/
  45. void mosbus_send_frame02(u16 register_addr, u16 count, FuncSend_TypeDef Func_Send)
  46. {
  47. // 01 03 地址H 地址L 数量H 数量L CRC-L CRC-H
  48. union ModbusRtu_03Frame_Tx_Union_TypeDef ModbusRtu_03Frame_Tx_Union = {1, 3, 0, 1}; // 空调03帧
  49. ModbusRtu_03Frame_Tx_Union.Frame03.register_addr = __REV16(register_addr);
  50. ModbusRtu_03Frame_Tx_Union.Frame03.register_count = __REV16(count);
  51. ModbusRtu_03Frame_Tx_Union.Frame03.crc = count_crc(ModbusRtu_03Frame_Tx_Union.send_buff, 6);
  52. Func_Send((const u8 *)ModbusRtu_03Frame_Tx_Union.send_buff, 8); // DMA发送报文
  53. }
  54. /****************************************************
  55. * 函 数 名:ModbusRtu_SendFrame03
  56. * 函数功能:发送空调03帧
  57. * 入口参数:register_addr 寄存器地址 count 数量
  58. * 说 明:无
  59. ****************************************************/
  60. void mosbus_send_frame03(u16 register_addr, u16 count, FuncSend_TypeDef Func_Send)
  61. {
  62. // 01 03 地址H 地址L 数量H 数量L CRC-L CRC-H
  63. union ModbusRtu_03Frame_Tx_Union_TypeDef ModbusRtu_03Frame_Tx_Union = {1, 3, 0, 1}; // 空调03帧
  64. ModbusRtu_03Frame_Tx_Union.Frame03.register_addr = __REV16(register_addr);
  65. ModbusRtu_03Frame_Tx_Union.Frame03.register_count = __REV16(count);
  66. ModbusRtu_03Frame_Tx_Union.Frame03.crc = count_crc(ModbusRtu_03Frame_Tx_Union.send_buff, 6);
  67. Func_Send((const u8 *)ModbusRtu_03Frame_Tx_Union.send_buff, 8); // DMA发送报文
  68. }
  69. /****************************************************
  70. * 函 数 名:ModbusRtu_SendFrame04
  71. * 函数功能:发送空调04帧
  72. * 入口参数:register_addr 寄存器地址 count 数量
  73. * 说 明:无
  74. ****************************************************/
  75. void mosbus_send_frame04(u16 register_addr, u16 count, FuncSend_TypeDef Func_Send)
  76. {
  77. // 01 03 地址H 地址L 数量H 数量L CRC-L CRC-H
  78. union ModbusRtu_03Frame_Tx_Union_TypeDef ModbusRtu_03Frame_Tx_Union = {1, 3, 0, 1}; // 空调03帧
  79. ModbusRtu_03Frame_Tx_Union.Frame03.register_addr = __REV16(register_addr);
  80. ModbusRtu_03Frame_Tx_Union.Frame03.register_count = __REV16(count);
  81. ModbusRtu_03Frame_Tx_Union.Frame03.crc = count_crc(ModbusRtu_03Frame_Tx_Union.send_buff, 6);
  82. Func_Send((const u8 *)ModbusRtu_03Frame_Tx_Union.send_buff, 8); // DMA发送报文
  83. }
  84. /****************************************************
  85. * 函 数 名:ModbusRtu_SendFrame05
  86. * 函数功能:发送空调05帧
  87. * 入口参数:register_addr 寄存器地址 count 数量
  88. * 说 明:无
  89. ****************************************************/
  90. void mosbus_send_frame05(u16 register_addr, u16 count, FuncSend_TypeDef Func_Send)
  91. {
  92. // 01 03 地址H 地址L 数量H 数量L CRC-L CRC-H
  93. union ModbusRtu_03Frame_Tx_Union_TypeDef ModbusRtu_03Frame_Tx_Union = {1, 3, 0, 1}; // 空调03帧
  94. ModbusRtu_03Frame_Tx_Union.Frame03.register_addr = __REV16(register_addr);
  95. ModbusRtu_03Frame_Tx_Union.Frame03.register_count = __REV16(count);
  96. ModbusRtu_03Frame_Tx_Union.Frame03.crc = count_crc(ModbusRtu_03Frame_Tx_Union.send_buff, 6);
  97. Func_Send((const u8 *)ModbusRtu_03Frame_Tx_Union.send_buff, 8); // DMA发送报文
  98. }
  99. /****************************************************
  100. * 函 数 名:ModbusRtu_SendFrame06
  101. * 函数功能:发送空调06帧
  102. * 入口参数:register_addr 寄存器地址 count 数量
  103. * 说 明:无
  104. ****************************************************/
  105. void mosbus_send_frame06(u16 register_addr, u16 data, FuncSend_TypeDef Func_Send)
  106. {
  107. // 01 06 地址H 地址L 数量H 数量L CRC-L CRC-H
  108. union ModbusRtu_03Frame_Tx_Union_TypeDef ModbusRtu_03Frame_Tx_Union = {1, 6, 0, 0}; // 06帧
  109. ModbusRtu_03Frame_Tx_Union.Frame03.register_addr = __REV16(register_addr);
  110. ModbusRtu_03Frame_Tx_Union.Frame03.register_count = __REV16(data);
  111. ModbusRtu_03Frame_Tx_Union.Frame03.crc = count_crc(ModbusRtu_03Frame_Tx_Union.send_buff, 6);
  112. Func_Send((const u8 *)ModbusRtu_03Frame_Tx_Union.send_buff, 8); // DMA发送报文
  113. }