Merge pull request 'V2 Update' (#1) from v2 into master

Reviewed-on: #1
This commit was merged in pull request #1.
This commit is contained in:
2025-12-13 22:59:34 +03:00
3 changed files with 53 additions and 46 deletions

View File

@@ -1,8 +1,4 @@
#include "modbus.h"
#define TX_EN GPIO_WriteBit(RS485_GPIO, RS485_GPIO_Pin, Bit_SET);
#define TX_DIS GPIO_WriteBit(RS485_GPIO, RS485_GPIO_Pin, Bit_RESET);
#define MODBUS_LED_ON GPIO_WriteBit(Modbus_LED, Modbus_LED_Pin, Bit_SET);
#define MODBUS_LED_OFF GPIO_WriteBit(Modbus_LED, Modbus_LED_Pin, Bit_RESET);
static uint8_t buf_ptr = 0;
static unsigned char rx_buf_ptr = 0;
@@ -34,13 +30,17 @@ static void (*ModbusRIRPoll)(void);
static void (*ModbusRHRPoll)(void);
static void (*ModbusWSRPoll)(uint16_t, uint16_t);
#ifdef CURRENT_OPERATION_MODE_UART
void modbus_connect_callback_send_byte(void (*s)(USART_TypeDef*, unsigned char)) {
ModbusUartSendByte = s;
}
#endif
#ifdef CURRENT_OPERATION_MODE_TCP
void modbus_connect_callback_send_buf_tcp(int32_t (*s)(uint8_t, unsigned char*, uint16_t)) {
ModbusTcpSendByte = s;
}
#endif
void modbus_connect_callback_rir_poll(void (*s)(void)) {
ModbusRIRPoll = s;
@@ -90,9 +90,8 @@ void modbus_wsr_answer() {
CRC16 = modbus_CRC16(crc_buf, 6);
switch(CURRENT_OPERATION_MODE) {
case 0:
TX_EN;
#ifdef CURRENT_OPERATION_MODE_UART
MODBUS_TX_EN;
ModbusUartSendByte(Modbus_UART, (modbus_id == dev_id) ? dev_id : com_dev_id);
ModbusUartSendByte(Modbus_UART, (unsigned char)MODBUS_WSR_CMD);
ModbusUartSendByte(Modbus_UART, modbus_reg_addr >> 8);
@@ -102,9 +101,9 @@ void modbus_wsr_answer() {
ModbusUartSendByte(Modbus_UART, CRC16 >> 8);
ModbusUartSendByte(Modbus_UART, CRC16 & 0xff);
TX_DIS;
break;
case 1:
MODBUS_TX_DIS;
#endif
#ifdef CURRENT_OPERATION_MODE_TCP
tx_buf[0] = (modbus_id == dev_id) ? dev_id : com_dev_id;
tx_buf[1] = MODBUS_WSR_CMD;
tx_buf[2] = modbus_reg_addr >> 8;
@@ -115,8 +114,7 @@ void modbus_wsr_answer() {
tx_buf[7] = CRC16 & 0xff;
ModbusTcpSendByte(DEFAULT_TCP_MODBUS_SOCKET, tx_buf, 8);
break;
}
#endif
}
void modbus_rir_answer() {
@@ -138,9 +136,9 @@ void modbus_rir_answer() {
CRC16 = modbus_CRC16(crc_buf, regs_to_read * 2 + CRC_COUNT_OFFSET);
switch(CURRENT_OPERATION_MODE) {
case 0:
TX_EN;
#ifdef CURRENT_OPERATION_MODE_UART
MODBUS_TX_EN;
ModbusUartSendByte(Modbus_UART, (modbus_id == dev_id) ? dev_id : com_dev_id);
ModbusUartSendByte(Modbus_UART, (unsigned char) MODBUS_RIR_CMD);
ModbusUartSendByte(Modbus_UART, regs_to_read * 2);
@@ -152,9 +150,9 @@ void modbus_rir_answer() {
}
ModbusUartSendByte(Modbus_UART, (unsigned char)(CRC16 >> 8));
ModbusUartSendByte(Modbus_UART, (unsigned char)(CRC16 & 0xff));
TX_DIS;
break;
case 1:
MODBUS_TX_DIS;
#endif
#ifdef CURRENT_OPERATION_MODE_TCP
tx_buf[buf_ptr++] = (modbus_id == dev_id) ? dev_id : com_dev_id;
tx_buf[buf_ptr++] = (unsigned char) MODBUS_RIR_CMD;
tx_buf[buf_ptr++] = regs_to_read * 2;
@@ -167,8 +165,7 @@ void modbus_rir_answer() {
tx_buf[buf_ptr++] = CRC16 >> 8;
tx_buf[buf_ptr++] = CRC16 & 0xff;
ModbusTcpSendByte(DEFAULT_TCP_MODBUS_SOCKET, tx_buf, buf_ptr);
break;
}
#endif
}
@@ -191,9 +188,9 @@ void modbus_rhr_answer() {
CRC16 = modbus_CRC16(crc_buf, regs_to_read * 2 + CRC_COUNT_OFFSET);
switch(CURRENT_OPERATION_MODE) {
case 0:
TX_EN;
#ifdef CURRENT_OPERATION_MODE_UART
MODBUS_TX_EN;
ModbusUartSendByte(Modbus_UART, (modbus_id == dev_id) ? dev_id : com_dev_id);
ModbusUartSendByte(Modbus_UART, (unsigned char) MODBUS_RHR_CMD);
ModbusUartSendByte(Modbus_UART, regs_to_read * 2);
@@ -205,9 +202,9 @@ void modbus_rhr_answer() {
}
ModbusUartSendByte(Modbus_UART, (unsigned char)(CRC16 >> 8));
ModbusUartSendByte(Modbus_UART, (unsigned char)(CRC16 & 0xff));
TX_DIS;
break;
case 1:
MODBUS_TX_DIS;
#endif
#ifdef CURRENT_OPERATION_MODE_TCP
tx_buf[buf_ptr++] = (modbus_id == dev_id) ? dev_id : com_dev_id;
tx_buf[buf_ptr++] = (unsigned char) MODBUS_RHR_CMD;
tx_buf[buf_ptr++] = regs_to_read * 2;
@@ -220,9 +217,7 @@ void modbus_rhr_answer() {
tx_buf[buf_ptr++] = CRC16 >> 8;
tx_buf[buf_ptr++] = CRC16 & 0xff;
ModbusTcpSendByte(DEFAULT_TCP_MODBUS_SOCKET, tx_buf, buf_ptr);
break;
}
#endif
}
static unsigned char modbus_rx_CRC_check(unsigned char modbus_cmd) {
@@ -392,6 +387,7 @@ void modbus_poll(void) {
} // switch
}
//======================= UART HANDLERS =========================//
#ifdef CURRENT_OPERATION_MODE_UART
void Modbus_UART_IRQHandler(void) {
if (USART_GetITStatus(Modbus_UART, USART_IT_RXNE) != RESET) {
while(USART_GetFlagStatus(Modbus_UART,USART_FLAG_RXNE) == RESET) {}
@@ -418,13 +414,16 @@ void Modbus_TIM_IRQHandler(void) {
timer_state = 0;
rx_flag = 1;
}
#endif
//======================== TCP HANDLERS ========================//
#ifdef CURRENT_OPERATION_MODE_TCP
void Modbus_TCP_Handler(unsigned char* buf, uint8_t size) {
for (rx_buf_ptr = 0; rx_buf_ptr < size; rx_buf_ptr++) {
rx_buf[rx_buf_ptr] = buf[rx_buf_ptr];
rx_buf[rx_buf_ptr] = buf[rx_buf_ptr];
}
rx_flag = 1;
}
#endif

View File

@@ -6,23 +6,33 @@
// MCU Includes
#include "stm32f4xx.h"
#include "stm32f4xx_usart.h"
#include "stm32f4xx_ll_gpio.h"
// Needed Constants
#define DEFAULT_DEVICE_MODBUS_ID 1
#define DEFAULT_TCP_MODBUS_SOCKET 0
#define CURRENT_OPERATION_MODE 1 // UART - 0, TCP - 1
#define DEFAULT_DEVICE_MODBUS_ID 1
#define CURRENT_OPERATION_MODE_TCP
#define RS485_GPIO GPIOB
#define RS485_GPIO_Pin GPIO_Pin_6
#define Modbus_UART USART2
#define Modbus_TIM TIM2
#define Modbus_UART_IRQHandler USART2_IRQHandler
#define Modbus_TIM_IRQHandler TIM2_IRQHandler
#define Modbus_LED GPIOD
#define Modbus_LED_Pin GPIO_Pin_2
#define Modbus_LED GPIOB
#define Modbus_LED_Pin LL_GPIO_PIN_9
#define MODBUS_LED_ON LL_GPIO_SetOutputPin(Modbus_LED, Modbus_LED_Pin);
#define MODBUS_LED_OFF LL_GPIO_ResetOutputPin(Modbus_LED, Modbus_LED_Pin);
#ifdef CURRENT_OPERATION_MODE_UART
#define RS485_GPIO GPIOB
#define RS485_GPIO_Pin GPIO_Pin_6
#define MODBUS_TX_EN GPIO_WriteBit(RS485_GPIO, RS485_GPIO_Pin, Bit_SET);
#define MODBUS_TX_DIS GPIO_WriteBit(RS485_GPIO, RS485_GPIO_Pin, Bit_RESET);
#define Modbus_UART USART2
#define Modbus_TIM TIM2
#define Modbus_UART_IRQHandler USART2_IRQHandler
#define Modbus_TIM_IRQHandler TIM2_IRQHandler
#endif
#ifdef CURRENT_OPERATION_MODE_TCP
#define DEFAULT_TCP_MODBUS_SOCKET 1
#endif
#endif

View File

@@ -1,8 +1,6 @@
Modbus Library for slave devices based on STM32 MCU (v5)
Modbus Library for slave devices based on STM32 MCU.
Supports Modbus RTU and Modbus RTU over TCP modes.
Original library was written by @ponkin_dmitry
Single header library which allow you to connect your devices using Modbus protocol.
Main configuration takes place in `modbus_constants.h` file.