Commit 45b813f64493832ec01f29727c33f8a33d0c0b81
1 parent
932769d8
New functions to manipulate data and use them in unit-tests
- MODBUS_GET_INT32_FROM_INT16 - MODBUS_GET_INT16_FROM_INT8 - MODBUS_SET_INT16_TO_INT8 - check the trame length before indexing in unit-test-server
Showing
2 changed files
with
21 additions
and
16 deletions
src/modbus.h
| @@ -178,6 +178,13 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -178,6 +178,13 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 178 | 178 | ||
| 179 | #define MODBUS_GET_HIGH_BYTE(data) ((data >> 8) & 0xFF) | 179 | #define MODBUS_GET_HIGH_BYTE(data) ((data >> 8) & 0xFF) |
| 180 | #define MODBUS_GET_LOW_BYTE(data) (data & 0xFF) | 180 | #define MODBUS_GET_LOW_BYTE(data) (data & 0xFF) |
| 181 | +#define MODBUS_GET_INT32_FROM_INT16(tab_int16, index) ((tab_int16[index] << 16) + tab_int16[index + 1]) | ||
| 182 | +#define MODBUS_GET_INT16_FROM_INT8(tab_int8, index) ((tab_int8[index] << 8) + tab_int8[index + 1]) | ||
| 183 | +#define MODBUS_SET_INT16_TO_INT8(tab_int8, index, value) \ | ||
| 184 | + do { \ | ||
| 185 | + tab_int8[index] = value >> 8; \ | ||
| 186 | + tab_int8[index + 1] = value & 0xFF; \ | ||
| 187 | + } while (0) | ||
| 181 | 188 | ||
| 182 | void modbus_set_bits_from_byte(uint8_t *dest, int address, const uint8_t value); | 189 | void modbus_set_bits_from_byte(uint8_t *dest, int address, const uint8_t value); |
| 183 | void modbus_set_bits_from_bytes(uint8_t *dest, int address, unsigned int nb_bits, | 190 | void modbus_set_bits_from_bytes(uint8_t *dest, int address, unsigned int nb_bits, |
tests/unit-test-server.c
| @@ -24,9 +24,6 @@ | @@ -24,9 +24,6 @@ | ||
| 24 | 24 | ||
| 25 | #include "unit-test.h" | 25 | #include "unit-test.h" |
| 26 | 26 | ||
| 27 | -/* Copied from modbus-private.h */ | ||
| 28 | -#define HEADER_LENGTH_TCP 7 | ||
| 29 | - | ||
| 30 | enum { | 27 | enum { |
| 31 | TCP, | 28 | TCP, |
| 32 | RTU | 29 | RTU |
| @@ -110,22 +107,23 @@ int main(int argc, char*argv[]) | @@ -110,22 +107,23 @@ int main(int argc, char*argv[]) | ||
| 110 | 107 | ||
| 111 | for (;;) { | 108 | for (;;) { |
| 112 | rc = modbus_receive(ctx, -1, query); | 109 | rc = modbus_receive(ctx, -1, query); |
| 113 | - if (rc > 0) { | ||
| 114 | - if (((query[header_length + 3] << 8) + | ||
| 115 | - query[header_length + 4]) | 110 | + if (rc == -1) { |
| 111 | + /* Connection closed by the client or error */ | ||
| 112 | + break; | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + /* Read holding registers */ | ||
| 116 | + if (query[header_length] == 0x03) { | ||
| 117 | + if (MODBUS_GET_INT16_FROM_INT8(query, header_length + 3) | ||
| 116 | == UT_REGISTERS_NB_POINTS_SPECIAL) { | 118 | == UT_REGISTERS_NB_POINTS_SPECIAL) { |
| 117 | - /* Change the number of values (offset | ||
| 118 | - TCP = 6) */ | ||
| 119 | - query[header_length + 3] = 0; | ||
| 120 | - query[header_length + 4] = UT_REGISTERS_NB_POINTS; | 119 | + printf("Set an incorrect number of values\n"); |
| 120 | + MODBUS_SET_INT16_TO_INT8(query, header_length + 3, | ||
| 121 | + UT_REGISTERS_NB_POINTS); | ||
| 121 | } | 122 | } |
| 123 | + } | ||
| 122 | 124 | ||
| 123 | - rc = modbus_reply(ctx, query, rc, mb_mapping); | ||
| 124 | - if (rc == -1) { | ||
| 125 | - return -1; | ||
| 126 | - } | ||
| 127 | - } else { | ||
| 128 | - /* Connection closed by the client or error */ | 125 | + rc = modbus_reply(ctx, query, rc, mb_mapping); |
| 126 | + if (rc == -1) { | ||
| 129 | break; | 127 | break; |
| 130 | } | 128 | } |
| 131 | } | 129 | } |