summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/modbus.c28
-rw-r--r--src/modbus.h23
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,