Beispielcode für die Implementierung der Modbus-RTU - Kommunikation auf Basis eines STM32 - Mikrocontrollers mit der HAL-Bibliothek und der modbus-stm32 - Bibliothek von STM32

kostenlosKostenloses technisches Material

Dieser Inhalt ist direkt lesbar und eignet sich für das Grundlagenlernen und die Suche.

Beispielcode für die Implementierung der Modbus-RTU - Kommunikation auf Basis eines STM32 - Mikrocontrollers mit der HAL-Bibliothek und der modbus-stm32 - Bibliothek von STM32

Um die Modbus-RTU - Kommunikation mithilfe der HAL-Bibliothek und der modbus-stm32 - Bibliothek basierend auf dem STM32 - Mikrocontroller zu implementieren, können Sie die folgenden Schritte ausführen:

  1. Vorbereitung:
    • Stellen Sie sicher, dass Sie die STM32 CubeMX - und HAL-Bibliotheken installiert haben.
    • Laden Sie die modbus-stm32 - Bibliothek herunter und integrieren Sie sie in Ihr Projekt. Sie können diese Bibliothek auf GitHub finden und die Dokumentation folgen, um sie zu integrieren.
    • Erstellen Sie ein neues CubeMX-Projekt, wählen Sie das passende STM32 - Mikrocontrollermodell aus und konfigurieren Sie Peripheriegeräte wie Uhren, serielle Anschlüsse und andere.
  2. Konfiguration der seriellen Anschlusskommunikation:
    • Konfigurieren Sie den seriellen Anschluss für die Modbus-RTU - Kommunikation mit CubeMX. Stellen Sie sicher, dass die serielle Anschlusskonfiguration den Modbus-RTU - Standards entspricht, z. B. 8 - Bit-Daten - Bit, 1 - Bit-Stopp - Bit, keine Parität.
    • Aktivieren Sie serielle Interrupts in der HAL-Bibliothek, um den Empfang und das Senden von Daten zu verarbeiten.
  3. Konfigurieren der modbus-stm32 - Bibliothek:
    • Konfigurieren Sie die Bibliothek so, dass sie den seriellen Anschluss und die Register Ihrer Wahl verwendet, entsprechend der Dokumentation für die modbus-stm32 - Bibliothek.
    • Initialisiert den modbus-Kommunikationsstapel, einschließlich der Konfiguration von Parametern wie Modbus-Slavenadresse, Baudrate und anderen.
  4. Schreiben eines Modbus-RTU - Masterprogramms:
    • Im Masterprogramm müssen Sie eine Modbus-RTU - Anforderung erstellen und an den Modbus-Slaven senden und darauf warten, dass eine Antwort auf sie erfolgt.
    • Verarbeitet Antworten, um Daten aus ihnen zu extrahieren.

Hier ist ein einfaches Beispielcode zum Initialisieren eines seriellen Anschlusses und der modbus-stm32 - Bibliothek sowie zum Senden einer Modbus-RTU - Read-Hold - Register-Anforderung und zur Analyse der Antwort:

#include "main.h"
#include "modbus.h"

UART_HandleTypeDef huart1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  modbus_init();

  while (1)
  {
    modbus_update();
  }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  modbus_rx_char(huart->Instance->DR);
  HAL_UART_Receive_IT(&huart1, (uint8_t*)modbus_tx_buf, 1);
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  modbus_tx_end();
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
                              | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_UART_Receive_IT(&huart1, (uint8_t*)modbus_tx_buf, 1);
}

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  __HAL_RCC_GPIOC_CLK_ENABLE();

  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

Das oben angegebene Beispielcode enthält die STM32 - HAL-Bibliothek und die modbus-stm32 - Bibliothek für die Modbus-RTU - Kommunikation. Hier ein paar Hinweise zu diesem Code:

  1. Der Codemain- Funktion des Codes initialisiert die HAL-Bibliothek, die Systemuhr, GPIO (GPIOC-Pin 13 als Ausgangspin) und den seriellen UART1 - Anschluss. Anschließend initialisiert es die modbus-stm32 - Bibliothek und startet eine endlose Schleife, in dermodbus_updateModbus-Kommunikation.
  2. HAL_UART_RxCpltCallbackDie Funktion ist eine UART-Empfanginterrupt - Rückruffunktion, die verwendet wird, um die empfangenen Daten zu verarbeiten. In diesem Funktionsumfang,modbus_rx_chardas empfangene Zeichen und wartet auf den Empfang des nächsten Zeichen durch Aufruf vonHAL_UART_Receive_ITWarten Sie auf den Empfang des nächsten Zeichen. Dies ist ein grundlegender serieller Anschlussempfang, der für die Modbus-Kommunikation verwendet wird.
  3. HAL_UART_TxCpltCallbackDie Funktion ist eine UART-Sendinterrupt - Callback-Funktion, die das Senden-Complete - Ereignis verarbeitet. hier, hier,modbus_tx_endverwendet, um die Modbus-Bibliothek abzusenden zu informieren.
  4. SystemClock_ConfigDie Funktion konfiguriert die Systemuhr. In diesem Beispiel ist die Uhr so konfiguriert, dass sie einen HSI-Oszillator mit 16 - Division-Frequenz und 9600 - Baud-Rate verwendet. Bitte konfigurieren Sie die Uhr entsprechend Ihren Hardware - und Leistungsanforderungen.
  5. MX_USART1_UART_InitDie Funktion initialisiert den seriellen UART1 - Anschluss und konfiguriert die Baudrate, die Datenbits, die Stop-Bits, die Check-Bits usw. Sie müssen entsprechend Ihrer seriellen Anschlusskonfiguration Änderungen vornehmen.
  6. MX_GPIO_InitDie Funktion konfiguriert GPIOC-Pin 13 als Ausgangspin. Dieser Pin kann bei Bedarf verwendet werden, um andere Geräte wie Anzeigeleuchte zu steuern.

Dieser Code bietet ein grundlegendes Modbus-RTU - Kommunikationsrahmen, aber Sie müssen die modbus-stm32 - Bibliothek weiter konfigurieren, um Ihre spezifischen Anforderungen zu erfüllen, einschließlich Slave-Adressen, Funktionscodes und Register-Adressen usw. Stellen Sie sicher, dass Sie die Einstellungen gemäß der Dokumentation für die modbus-stm32 - Bibliothek einrichten und entsprechend den Anforderungen Ihrer Anwendung entsprechende Änderungen vornehmen.

Relevante Etiketten
Sollte man diese Informationen für ein echtes Projekt verwenden?

Gehen Sie zum Tool Center, um Nachrichten zu analysieren, CRC-Prüfungen und Geräte-Debugging zu erledigen, oder senden Sie Anforderungen für Auswahl - und Zugangsvorschläge.

Ingenieur Mitglied

Verwandeln Sie diesen Artikel in ein umsetzbares Debuggermaterial

Erweiterte Nachrichtenanalyse, Paket-Downloads, Codebeispiele, Engineering-Szenarien und Priority-Technischer Support sind für die Real-Projekt - Bereitstellung möglich.

Unbegrenzte Werkzeuge
Datenpaket und Codepaket
Vollständige Engineering Case-Basis
Vorrangiger Zugang zum technischen Support

《“Beispielcode für die Implementierung der Modbus-RTU - Kommunikation auf Basis eines STM32 - Mikrocontrollers mit der HAL-Bibliothek und der modbus-stm32 - Bibliothek von STM32”》 有 1 条评论

Antwort veröffentlichen

Ihre E-Mail - Adresse wird nicht öffentlich gemacht. Erforderliche Elemente wurden verwendet * markiert.