Commit 932769d8513a61943c411f47b80ec003b3f62f87
1 parent
87293e45
New function modbus_get_header_length(modbus_t *ctx)
- new public function - change unit-test-server.c to be transport layer independant (query and header_length)
Showing
3 changed files
with
17 additions
and
6 deletions
src/modbus.c
| ... | ... | @@ -1294,6 +1294,11 @@ void modbus_set_timeout_end(modbus_t *ctx, const struct timeval *timeout) |
| 1294 | 1294 | ctx->timeout_end = *timeout; |
| 1295 | 1295 | } |
| 1296 | 1296 | |
| 1297 | +int modbus_get_header_length(modbus_t *ctx) | |
| 1298 | +{ | |
| 1299 | + return ctx->backend->header_length; | |
| 1300 | +} | |
| 1301 | + | |
| 1297 | 1302 | int modbus_connect(modbus_t *ctx) |
| 1298 | 1303 | { |
| 1299 | 1304 | return ctx->backend->connect(ctx); | ... | ... |
src/modbus.h
| ... | ... | @@ -139,6 +139,8 @@ void modbus_set_timeout_begin(modbus_t *ctx, const struct timeval *timeout); |
| 139 | 139 | void modbus_get_timeout_end(modbus_t *ctx, struct timeval *timeout); |
| 140 | 140 | void modbus_set_timeout_end(modbus_t *ctx, const struct timeval *timeout); |
| 141 | 141 | |
| 142 | +int modbus_get_header_length(modbus_t *ctx); | |
| 143 | + | |
| 142 | 144 | int modbus_connect(modbus_t *ctx); |
| 143 | 145 | void modbus_close(modbus_t *ctx); |
| 144 | 146 | ... | ... |
tests/unit-test-server.c
| ... | ... | @@ -40,6 +40,8 @@ int main(int argc, char*argv[]) |
| 40 | 40 | int rc; |
| 41 | 41 | int i; |
| 42 | 42 | int use_backend; |
| 43 | + uint8_t *query; | |
| 44 | + int header_length; | |
| 43 | 45 | |
| 44 | 46 | if (argc > 1) { |
| 45 | 47 | if (strcmp(argv[1], "tcp") == 0) { |
| ... | ... | @@ -57,10 +59,13 @@ int main(int argc, char*argv[]) |
| 57 | 59 | |
| 58 | 60 | if (use_backend == TCP) { |
| 59 | 61 | ctx = modbus_new_tcp("127.0.0.1", 1502); |
| 62 | + query = malloc(MODBUS_TCP_MAX_ADU_LENGTH); | |
| 60 | 63 | } else { |
| 61 | 64 | ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1); |
| 62 | 65 | modbus_set_slave(ctx, SERVER_ID); |
| 66 | + query = malloc(MODBUS_RTU_MAX_ADU_LENGTH); | |
| 63 | 67 | } |
| 68 | + header_length = modbus_get_header_length(ctx); | |
| 64 | 69 | |
| 65 | 70 | modbus_set_debug(ctx, TRUE); |
| 66 | 71 | modbus_set_error_recovery(ctx, TRUE); |
| ... | ... | @@ -104,17 +109,15 @@ int main(int argc, char*argv[]) |
| 104 | 109 | } |
| 105 | 110 | |
| 106 | 111 | for (;;) { |
| 107 | - uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH]; | |
| 108 | - | |
| 109 | 112 | rc = modbus_receive(ctx, -1, query); |
| 110 | 113 | if (rc > 0) { |
| 111 | - if (((query[HEADER_LENGTH_TCP + 3] << 8) + | |
| 112 | - query[HEADER_LENGTH_TCP + 4]) | |
| 114 | + if (((query[header_length + 3] << 8) + | |
| 115 | + query[header_length + 4]) | |
| 113 | 116 | == UT_REGISTERS_NB_POINTS_SPECIAL) { |
| 114 | 117 | /* Change the number of values (offset |
| 115 | 118 | TCP = 6) */ |
| 116 | - query[HEADER_LENGTH_TCP + 3] = 0; | |
| 117 | - query[HEADER_LENGTH_TCP + 4] = UT_REGISTERS_NB_POINTS; | |
| 119 | + query[header_length + 3] = 0; | |
| 120 | + query[header_length + 4] = UT_REGISTERS_NB_POINTS; | |
| 118 | 121 | } |
| 119 | 122 | |
| 120 | 123 | rc = modbus_reply(ctx, query, rc, mb_mapping); |
| ... | ... | @@ -133,6 +136,7 @@ int main(int argc, char*argv[]) |
| 133 | 136 | close(socket); |
| 134 | 137 | } |
| 135 | 138 | modbus_mapping_free(mb_mapping); |
| 139 | + free(query); | |
| 136 | 140 | modbus_free(ctx); |
| 137 | 141 | |
| 138 | 142 | return 0; | ... | ... |