"# \u57fa\u4e8eSTM32\u5fae\u63a7\u5236\u5668\u5b9e\u73b0Modbus RTU\u901a\u4fe1\u7684\u793a\u4f8b\u4ee3\u7801\uff0c\u4f7f\u7528STM32\u7684HAL\u5e93\u548cmodbus-stm32\u5e93\n\n> 2023-02-11 | 2023-10-26\n> https:\/\/www.modbus.cn\/en\/11666.html\n\n**Modbus\u7f16\u7a0b\u5f00\u53d1**\n\n---\n\n\u8981\u57fa\u4e8eSTM32\u5fae\u63a7\u5236\u5668\u4f7f\u7528HAL\u5e93\u548cmodbus-stm32\u5e93\u5b9e\u73b0Modbus RTU\u901a\u4fe1\uff0c\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u8fdb\u884c\u64cd\u4f5c\uff1a\n\n\u51c6\u5907\u5de5\u4f5c\uff1a\n\n- \u786e\u4fdd\u60a8\u5df2\u7ecf\u5b89\u88c5\u4e86STM32 CubeMX\u548cHAL\u5e93\u3002\n\n- \u4e0b\u8f7d\u5e76\u96c6\u6210modbus-stm32\u5e93\u5230\u60a8\u7684\u9879\u76ee\u4e2d\u3002\u60a8\u53ef\u4ee5\u5728GitHub\u4e0a\u627e\u5230\u8fd9\u4e2a\u5e93\u5e76\u6309\u7167\u5176\u6587\u6863\u8fdb\u884c\u96c6\u6210\u3002\n\n- \u521b\u5efa\u4e00\u4e2a\u65b0\u7684CubeMX\u9879\u76ee\uff0c\u9009\u62e9\u5408\u9002\u7684STM32\u5fae\u63a7\u5236\u5668\u578b\u53f7\uff0c\u7136\u540e\u914d\u7f6e\u65f6\u949f\u3001\u4e32\u53e3\u7b49\u5916\u8bbe\u3002\n\n\u914d\u7f6e\u4e32\u53e3\u901a\u4fe1\uff1a\n\n- \u4f7f\u7528CubeMX\u914d\u7f6e\u4e32\u53e3\u7528\u4e8eModbus RTU\u901a\u4fe1\u3002\u786e\u4fdd\u4e32\u53e3\u914d\u7f6e\u7b26\u5408Modbus RTU\u6807\u51c6\uff0c\u4f8b\u5982\uff1a8\u4f4d\u6570\u636e\u4f4d\uff0c1\u4f4d\u505c\u6b62\u4f4d\uff0c\u65e0\u5947\u5076\u6821\u9a8c\u3002\n\n- \u5728HAL\u5e93\u4e2d\u542f\u7528\u4e32\u53e3\u4e2d\u65ad\uff0c\u4ee5\u4fbf\u5904\u7406\u63a5\u6536\u548c\u53d1\u9001\u6570\u636e\u3002\n\n\u914d\u7f6emodbus-stm32\u5e93\uff1a\n\n- \u6839\u636emodbus-stm32\u5e93\u7684\u6587\u6863\uff0c\u914d\u7f6e\u5e93\u4ee5\u4f7f\u7528\u60a8\u9009\u62e9\u7684\u4e32\u53e3\u548c\u5bc4\u5b58\u5668\u3002\n\n- \u521d\u59cb\u5316modbus\u901a\u4fe1\u5806\u6808\uff0c\u5305\u62ec\u914d\u7f6eModbus\u4ece\u673a\u5730\u5740\u3001\u6ce2\u7279\u7387\u7b49\u53c2\u6570\u3002\n\n\u7f16\u5199Modbus RTU\u4e3b\u7a0b\u5e8f\uff1a\n\n- \u5728\u4e3b\u7a0b\u5e8f\u4e2d\uff0c\u60a8\u9700\u8981\u521b\u5efa\u4e00\u4e2aModbus RTU\u8bf7\u6c42\u5e76\u5c06\u5176\u53d1\u9001\u5230Modbus\u4ece\u673a\u8bbe\u5907\uff0c\u7136\u540e\u7b49\u5f85\u54cd\u5e94\u3002\n\n- \u5904\u7406\u54cd\u5e94\u4ee5\u4ece\u4e2d\u63d0\u53d6\u6570\u636e\u3002\n\n\u4e0b\u9762\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u793a\u4f8b\u4ee3\u7801\uff0c\u7528\u4e8e\u521d\u59cb\u5316\u4e32\u53e3\u548cmodbus-stm32\u5e93\uff0c\u5e76\u53d1\u9001\u4e00\u4e2aModbus RTU\u8bfb\u4fdd\u6301\u5bc4\u5b58\u5668\u8bf7\u6c42\u5e76\u89e3\u6790\u54cd\u5e94\u7684\u57fa\u672c\u793a\u4f8b\uff1a\n\n```\n#include \"main.h\"\n#include \"modbus.h\"\n\nUART_HandleTypeDef huart1;\n\nvoid SystemClock_Config(void);\nstatic void MX_GPIO_Init(void);\nstatic void MX_USART1_UART_Init(void);\n\nint main(void)\n{\n  HAL_Init();\n  SystemClock_Config();\n  MX_GPIO_Init();\n  MX_USART1_UART_Init();\n\n  modbus_init();\n\n  while (1)\n  {\n    modbus_update();\n  }\n}\n\nvoid HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)\n{\n  modbus_rx_char(huart-&gt;Instance-&gt;DR);\n  HAL_UART_Receive_IT(&amp;huart1, (uint8_t*)modbus_tx_buf, 1);\n}\n\nvoid HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)\n{\n  modbus_tx_end();\n}\n\nvoid SystemClock_Config(void)\n{\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;\n  if (HAL_RCC_OscConfig(&amp;RCC_OscInitStruct) != HAL_OK)\n  {\n    Error_Handler();\n  }\n\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK\n                              | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  if (HAL_RCC_ClockConfig(&amp;RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)\n  {\n    Error_Handler();\n  }\n}\n\nstatic void MX_USART1_UART_Init(void)\n{\n  huart1.Instance = USART1;\n  huart1.Init.BaudRate = 9600;\n  huart1.Init.WordLength = UART_WORDLENGTH_8B;\n  huart1.Init.StopBits = UART_STOPBITS_1;\n  huart1.Init.Parity = UART_PARITY_NONE;\n  huart1.Init.Mode = UART_MODE_TX_RX;\n  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;\n  huart1.Init.OverSampling = UART_OVERSAMPLING_16;\n  if (HAL_UART_Init(&amp;huart1) != HAL_OK)\n  {\n    Error_Handler();\n  }\n  HAL_UART_Receive_IT(&amp;huart1, (uint8_t*)modbus_tx_buf, 1);\n}\n\nstatic void MX_GPIO_Init(void)\n{\n  GPIO_InitTypeDef GPIO_InitStruct = {0};\n\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n\n  GPIO_InitStruct.Pin = GPIO_PIN_13;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;\n  HAL_GPIO_Init(GPIOC, &amp;GPIO_InitStruct);\n}\n\n```\n\n\u4e0a\u8fb9\u63d0\u4f9b\u7684\u4ee3\u7801\u793a\u4f8b\u4e2d\uff0c\u5305\u62ec\u4e86STM32\u7684HAL\u5e93\u548cmodbus-stm32\u5e93\uff0c\u7528\u4e8e\u5b9e\u73b0Modbus RTU\u901a\u4fe1\u3002\u4ee5\u4e0b\u662f\u4e00\u4e9b\u5173\u4e8e\u8fd9\u6bb5\u4ee3\u7801\u7684\u8bf4\u660e\uff1a\n\n- \u4ee3\u7801\u7684`main`\u51fd\u6570\u521d\u59cb\u5316\u4e86HAL\u5e93\u3001\u7cfb\u7edf\u65f6\u949f\u3001GPIO\uff08GPIOC Pin 13\uff0c\u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u5f15\u811a\uff09\uff0c\u4ee5\u53caUART1\u4e32\u53e3\u3002\u7136\u540e\uff0c\u5b83\u521d\u59cb\u5316\u4e86modbus-stm32\u5e93\uff0c\u5f00\u59cb\u4e86\u4e00\u4e2a\u65e0\u9650\u5faa\u73af\uff0c\u5728\u5faa\u73af\u4e2d\u8c03\u7528`modbus_update`\u6765\u5904\u7406Modbus\u901a\u4fe1\u3002\n\n- `HAL_UART_RxCpltCallback` \u51fd\u6570\u662f\u4e00\u4e2aUART\u63a5\u6536\u4e2d\u65ad\u56de\u8c03\u51fd\u6570\uff0c\u5b83\u88ab\u7528\u6765\u5904\u7406\u63a5\u6536\u5230\u7684\u6570\u636e\u3002\u5728\u8fd9\u4e2a\u51fd\u6570\u4e2d\uff0c`modbus_rx_char` \u7528\u6765\u5904\u7406\u63a5\u6536\u5230\u7684\u5b57\u7b26\uff0c\u5e76\u4e14\u901a\u8fc7\u8c03\u7528 `HAL_UART_Receive_IT` \u6765\u7b49\u5f85\u4e0b\u4e00\u4e2a\u5b57\u7b26\u7684\u63a5\u6536\u3002\u8fd9\u662f\u4e00\u4e2a\u57fa\u672c\u7684\u4e32\u53e3\u63a5\u6536\u65b9\u5f0f\uff0c\u7528\u4e8eModbus\u901a\u4fe1\u3002\n\n- `HAL_UART_TxCpltCallback` \u51fd\u6570\u662fUART\u53d1\u9001\u4e2d\u65ad\u56de\u8c03\u51fd\u6570\uff0c\u7528\u6765\u5904\u7406\u53d1\u9001\u5b8c\u6210\u4e8b\u4ef6\u3002\u5728\u8fd9\u91cc\uff0c`modbus_tx_end` \u7528\u4e8e\u901a\u77e5Modbus\u5e93\u53d1\u9001\u5df2\u5b8c\u6210\u3002\n\n- `SystemClock_Config` \u51fd\u6570\u914d\u7f6e\u4e86\u7cfb\u7edf\u65f6\u949f\u3002\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u65f6\u949f\u914d\u7f6e\u4e3a\u4f7f\u7528HSI\u632f\u8361\u5668\uff0c16\u5206\u9891\uff0c9600\u6ce2\u7279\u7387\u3002\u8bf7\u6839\u636e\u60a8\u7684\u786c\u4ef6\u548c\u6027\u80fd\u8981\u6c42\u8fdb\u884c\u76f8\u5e94\u7684\u65f6\u949f\u914d\u7f6e\u3002\n\n- `MX_USART1_UART_Init` \u51fd\u6570\u521d\u59cb\u5316\u4e86UART1\u4e32\u53e3\uff0c\u914d\u7f6e\u4e86\u6ce2\u7279\u7387\u3001\u6570\u636e\u4f4d\u3001\u505c\u6b62\u4f4d\u3001\u6821\u9a8c\u4f4d\u7b49\u3002\u60a8\u9700\u8981\u6839\u636e\u60a8\u7684\u4e32\u53e3\u914d\u7f6e\u8fdb\u884c\u76f8\u5e94\u7684\u66f4\u6539\u3002\n\n- `MX_GPIO_Init` \u51fd\u6570\u914d\u7f6e\u4e86GPIOC Pin 13 \u4f5c\u4e3a\u4e00\u4e2a\u8f93\u51fa\u5f15\u811a\u3002\u8fd9\u4e2a\u5f15\u811a\u53ef\u4ee5\u5728\u9700\u8981\u65f6\u7528\u4e8e\u63a7\u5236\u5176\u4ed6\u8bbe\u5907\uff0c\u5982\u6307\u793a\u706f\u3002\n\n\u8fd9\u6bb5\u4ee3\u7801\u63d0\u4f9b\u4e86\u4e00\u4e2a\u57fa\u672c\u7684Modbus RTU\u901a\u4fe1\u6846\u67b6\uff0c\u4f46\u60a8\u9700\u8981\u8fdb\u4e00\u6b65\u914d\u7f6emodbus-stm32\u5e93\u6765\u6ee1\u8db3\u60a8\u7684\u7279\u5b9a\u9700\u6c42\uff0c\u5305\u62ec\u4ece\u673a\u5730\u5740\u3001\u529f\u80fd\u7801\u548c\u5bc4\u5b58\u5668\u5730\u5740\u7b49\u3002\u786e\u4fdd\u6839\u636emodbus-stm32\u5e93\u7684\u6587\u6863\u8fdb\u884c\u8bbe\u7f6e\uff0c\u5e76\u6839\u636e\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u9700\u6c42\u8fdb\u884c\u9002\u5f53\u7684\u4fee\u6539\u3002\n\n---\n*modbus.cn*\n"