diff options
| author | Aditya Naik | 2020-02-12 14:42:00 -0500 |
|---|---|---|
| committer | Aditya Naik | 2020-02-12 14:42:00 -0500 |
| commit | 63e20630c9845e82ef34bd8476c3b2facfda972d (patch) | |
| tree | 897cd72b32ebf327574686fa0c995749dd63b784 /src | |
| parent | daed2486999c88bf048e3f6fa2ce255d4a27c29a (diff) | |
Removed ST HAL dependencies for portability
Diffstat (limited to 'src')
| -rw-r--r-- | src/modbus.c | 28 | ||||
| -rw-r--r-- | src/modbus.h | 23 |
2 files changed, 23 insertions, 28 deletions
diff --git a/src/modbus.c b/src/modbus.c index 98f40bd..4bacdaf 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -50,9 +50,8 @@ MB_StatusTypeDef WriteSingleRegister(modbus_slave_device *device, uint16_t reg_a MB_StatusTypeDef modbus_transaction(uint8_t func, modbus_slave_device *device, uint16_t rw_addr, int read_num, uint16_t write_value) { - uint8_t adu[256], adu_currsize=0; + uint16_t adu[256], adu_currsize=0; MB_StatusTypeDef MB_status = MB_OK; - HAL_StatusTypeDef UART_status = HAL_OK; /* Add the values that are relevant to all (supported) functions to the buffer */ adu[adu_currsize++] = device->slave_id; @@ -84,8 +83,8 @@ MB_StatusTypeDef modbus_transaction(uint8_t func, modbus_slave_device *device, adu[adu_currsize] = 0; /* Send data using HAL UART */ - for (int i=0; i < adu_currsize; i++) { - UART_status = HAL_UART_Transmit(&device->modbus_uart, &adu[i], 1, MODBUS_TIMEOUT); + for (uint8_t i=0; i < adu_currsize; i++) { + MB_status = MB_UART_Tx(&device->modbus_uart, &adu[i], (uint8_t*)1, &device->modbus_timeout); } @@ -93,10 +92,10 @@ MB_StatusTypeDef modbus_transaction(uint8_t func, modbus_slave_device *device, adu_currsize = 0; int rx_curr_bytesize = 8; - while (rx_curr_bytesize > 0 && MB_status == MB_OK && UART_status == HAL_OK) { - UART_status = HAL_UART_Receive(&device->modbus_uart, &adu[adu_currsize++], - 1, MODBUS_TIMEOUT); - if (UART_status == HAL_OK) { + while (rx_curr_bytesize > 0 && MB_status == MB_OK) { + MB_status = MB_UART_Rx(&device->modbus_uart, &adu[adu_currsize++], + (uint8_t*)1, &device->modbus_timeout); + if (MB_status == MB_OK) { rx_curr_bytesize--; if (adu_currsize == 5) { if (adu[0] != device->slave_id) { @@ -122,12 +121,9 @@ MB_StatusTypeDef modbus_transaction(uint8_t func, modbus_slave_device *device, } } } - else { - MB_status = UART_status + 3; - } } - if (adu_currsize > 5 && MB_status == MB_OK && UART_status == HAL_OK) { + if (adu_currsize > 5 && MB_status == MB_OK) { crc = 0xffff; for (int i=0; i < adu_currsize - 2; i++) { crc = crc16_update(crc, adu[i]); @@ -140,7 +136,7 @@ MB_StatusTypeDef modbus_transaction(uint8_t func, modbus_slave_device *device, } /* For read operations: disassemble ADU into words */ - if (MB_status == MB_OK && UART_status == HAL_OK) { + if (MB_status == MB_OK) { switch (adu[1]) { case read_input_regs: case read_holding_regs: @@ -152,11 +148,7 @@ MB_StatusTypeDef modbus_transaction(uint8_t func, modbus_slave_device *device, } break; } - } - - if (!MB_status && UART_status) { - MB_status = UART_status + 3; - } + } return MB_status; } diff --git a/src/modbus.h b/src/modbus.h index 32ca596..f7553dd 100644 --- a/src/modbus.h +++ b/src/modbus.h @@ -1,8 +1,8 @@ #ifndef _MODBUS_H #define _MODBUS_H -#include "stm32f1xx_hal.h" -#include "string.h" +#include <string.h> +#include <inttypes.h> #define read_holding_regs 0x03 #define read_input_regs 0x04 @@ -12,26 +12,29 @@ #define highByte(w) ((uint8_t) ((w) >> 8)) #define word(h, l) ((h << 8) | l) -#define MODBUS_TIMEOUT 50 +/* #define MODBUS_TIMEOUT 50 */ #define MAX_BUFSIZE 64 typedef struct { uint8_t slave_id; uint16_t response_buffer[MAX_BUFSIZE]; uint8_t rbuf_len; - UART_HandleTypeDef modbus_uart; + uint8_t modbus_timeout; + void* modbus_uart; } modbus_slave_device; typedef enum { MB_OK = 0x0, - MB_SLAVE_ID_ERR = 0x1, - MB_FUNC_ERR = 0x2, - MB_CRC_ERR = 0x3, - MB_UART_ERR = 0x4, - MB_BUSY_ERR = 0x5, - MB_TIMEOUT_ERR = 0x6 + MB_UART_ERR_1 = 0x1, + MB_UART_ERR_2 = 0x2, + MB_UART_ERR_3 = 0x3, + MB_SLAVE_ID_ERR = 0x4, + MB_FUNC_ERR = 0x5, + MB_CRC_ERR = 0x6 } MB_StatusTypeDef; +extern MB_StatusTypeDef (*MB_UART_Tx)(void*, uint16_t*, uint8_t*, uint8_t*); +extern MB_StatusTypeDef (*MB_UART_Rx)(void*, uint16_t*, uint8_t*, uint8_t*); uint16_t crc16_update(uint16_t crc, uint8_t a); MB_StatusTypeDef modbus_transaction (uint8_t func, modbus_slave_device *device, |
