Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of TAIST_modbus by
modbus.cpp@1:c5e6595a03db, 2018-03-14 (annotated)
- Committer:
- KRiTiRK
- Date:
- Wed Mar 14 14:34:01 2018 +0000
- Revision:
- 1:c5e6595a03db
- Parent:
- 0:f306cb0263a6
- Child:
- 2:6d1f053a6033
We work together, but we wrote code only from one laptop.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| vsupacha | 0:f306cb0263a6 | 1 | #include "mbed.h" |
| vsupacha | 0:f306cb0263a6 | 2 | #include "modbus.h" |
| vsupacha | 0:f306cb0263a6 | 3 | |
| KRiTiRK | 1:c5e6595a03db | 4 | uint8_t nodeId = 170; |
| vsupacha | 0:f306cb0263a6 | 5 | uint16_t regValue[ADDR_RANGE]; |
| vsupacha | 0:f306cb0263a6 | 6 | |
| vsupacha | 0:f306cb0263a6 | 7 | enum state {IDLE, RECEPTION, END} protState = IDLE; |
| vsupacha | 0:f306cb0263a6 | 8 | |
| vsupacha | 0:f306cb0263a6 | 9 | int process_buffer(char *buf, uint8_t *frame) |
| vsupacha | 0:f306cb0263a6 | 10 | { |
| vsupacha | 0:f306cb0263a6 | 11 | int status = 0; |
| vsupacha | 0:f306cb0263a6 | 12 | uint8_t sum = 0; |
| vsupacha | 0:f306cb0263a6 | 13 | uint8_t lrc, i; |
| vsupacha | 0:f306cb0263a6 | 14 | char tmpbuf[] = {0, 0, 0}; |
| vsupacha | 0:f306cb0263a6 | 15 | if (strlen(buf) == 14) { |
| vsupacha | 0:f306cb0263a6 | 16 | for (i = 0; i < 6; i++) { |
| vsupacha | 0:f306cb0263a6 | 17 | tmpbuf[0] = buf[i*2]; |
| vsupacha | 0:f306cb0263a6 | 18 | tmpbuf[1] = buf[i*2 + 1]; |
| vsupacha | 0:f306cb0263a6 | 19 | frame[i] = strtoul(tmpbuf, NULL, 16); |
| KRiTiRK | 1:c5e6595a03db | 20 | //printf("FRAME %d \n", frame[i]); |
| vsupacha | 0:f306cb0263a6 | 21 | } |
| vsupacha | 0:f306cb0263a6 | 22 | tmpbuf[0] = buf[12]; tmpbuf[1] = buf[13]; |
| vsupacha | 0:f306cb0263a6 | 23 | lrc = strtoul(tmpbuf, NULL, 16); |
| vsupacha | 0:f306cb0263a6 | 24 | for (i = 0; i < 6; i++) { |
| vsupacha | 0:f306cb0263a6 | 25 | sum += frame[i]; |
| vsupacha | 0:f306cb0263a6 | 26 | } |
| KRiTiRK | 1:c5e6595a03db | 27 | //printf(" sum %d, lrc %d \n", sum, lrc); |
| KRiTiRK | 1:c5e6595a03db | 28 | if ((sum + lrc) == 256) { |
| vsupacha | 0:f306cb0263a6 | 29 | status = 1; |
| vsupacha | 0:f306cb0263a6 | 30 | } |
| vsupacha | 0:f306cb0263a6 | 31 | } |
| vsupacha | 0:f306cb0263a6 | 32 | return status; |
| vsupacha | 0:f306cb0263a6 | 33 | } |
| vsupacha | 0:f306cb0263a6 | 34 | |
| vsupacha | 0:f306cb0263a6 | 35 | void modbus_init(uint8_t id) |
| vsupacha | 0:f306cb0263a6 | 36 | { |
| vsupacha | 0:f306cb0263a6 | 37 | nodeId = id; |
| vsupacha | 0:f306cb0263a6 | 38 | } |
| vsupacha | 0:f306cb0263a6 | 39 | |
| vsupacha | 0:f306cb0263a6 | 40 | uint16_t modbus_read(uint16_t offset) |
| vsupacha | 0:f306cb0263a6 | 41 | { |
| vsupacha | 0:f306cb0263a6 | 42 | if (offset < ADDR_RANGE) { |
| vsupacha | 0:f306cb0263a6 | 43 | return regValue[offset]; |
| vsupacha | 0:f306cb0263a6 | 44 | } |
| vsupacha | 0:f306cb0263a6 | 45 | return 0xFFFF; |
| vsupacha | 0:f306cb0263a6 | 46 | } |
| vsupacha | 0:f306cb0263a6 | 47 | |
| vsupacha | 0:f306cb0263a6 | 48 | uint16_t modbus_update(uint8_t offset, uint16_t val) |
| vsupacha | 0:f306cb0263a6 | 49 | { |
| vsupacha | 0:f306cb0263a6 | 50 | uint16_t tmp; |
| vsupacha | 0:f306cb0263a6 | 51 | |
| vsupacha | 0:f306cb0263a6 | 52 | if (offset < ADDR_RANGE) { |
| vsupacha | 0:f306cb0263a6 | 53 | tmp = regValue[offset]; |
| vsupacha | 0:f306cb0263a6 | 54 | regValue[offset] = val; |
| vsupacha | 0:f306cb0263a6 | 55 | return tmp; |
| vsupacha | 0:f306cb0263a6 | 56 | } |
| vsupacha | 0:f306cb0263a6 | 57 | return 0xFFFF; |
| vsupacha | 0:f306cb0263a6 | 58 | } |
| vsupacha | 0:f306cb0263a6 | 59 | |
| vsupacha | 0:f306cb0263a6 | 60 | int modbus_parser(char ch, uint8_t *frame) |
| vsupacha | 0:f306cb0263a6 | 61 | { |
| KRiTiRK | 1:c5e6595a03db | 62 | //printf("char %c \n", ch); |
| vsupacha | 0:f306cb0263a6 | 63 | static char buf[514]; |
| vsupacha | 0:f306cb0263a6 | 64 | static int idx = 0; |
| vsupacha | 0:f306cb0263a6 | 65 | static int status = 0; |
| vsupacha | 0:f306cb0263a6 | 66 | |
| vsupacha | 0:f306cb0263a6 | 67 | switch(protState) { |
| vsupacha | 0:f306cb0263a6 | 68 | case IDLE: |
| vsupacha | 0:f306cb0263a6 | 69 | if (ch == ':') { |
| vsupacha | 0:f306cb0263a6 | 70 | protState = RECEPTION; |
| vsupacha | 0:f306cb0263a6 | 71 | idx = 0; |
| vsupacha | 0:f306cb0263a6 | 72 | status = 0; |
| vsupacha | 0:f306cb0263a6 | 73 | } |
| KRiTiRK | 1:c5e6595a03db | 74 | //printf("IDLE \n"); |
| vsupacha | 0:f306cb0263a6 | 75 | break; |
| KRiTiRK | 1:c5e6595a03db | 76 | |
| vsupacha | 0:f306cb0263a6 | 77 | case RECEPTION: |
| KRiTiRK | 1:c5e6595a03db | 78 | //printf("RECEPTION \n"); |
| vsupacha | 0:f306cb0263a6 | 79 | if ((ch >= '0') && (ch <= '9')) { |
| vsupacha | 0:f306cb0263a6 | 80 | buf[idx++] = ch; |
| vsupacha | 0:f306cb0263a6 | 81 | } else if ((ch >= 'a') && (ch <= 'f')) { |
| vsupacha | 0:f306cb0263a6 | 82 | buf[idx++] = ch; |
| vsupacha | 0:f306cb0263a6 | 83 | } else if ((ch >= 'A') && (ch <= 'F')) { |
| vsupacha | 0:f306cb0263a6 | 84 | buf[idx++] = ch; |
| vsupacha | 0:f306cb0263a6 | 85 | } else if (ch == '\r') { |
| vsupacha | 0:f306cb0263a6 | 86 | buf[idx] = 0; |
| vsupacha | 0:f306cb0263a6 | 87 | protState = END; |
| vsupacha | 0:f306cb0263a6 | 88 | } else { |
| vsupacha | 0:f306cb0263a6 | 89 | protState = IDLE; |
| vsupacha | 0:f306cb0263a6 | 90 | } |
| vsupacha | 0:f306cb0263a6 | 91 | break; |
| KRiTiRK | 1:c5e6595a03db | 92 | |
| vsupacha | 0:f306cb0263a6 | 93 | case END: |
| vsupacha | 0:f306cb0263a6 | 94 | if (ch == '\n') { |
| KRiTiRK | 1:c5e6595a03db | 95 | //printf(" IN THE END\n"); |
| vsupacha | 0:f306cb0263a6 | 96 | if (process_buffer(buf, frame)) { |
| vsupacha | 0:f306cb0263a6 | 97 | if ((frame[0] == nodeId) && (frame[1] == FUNC_CODE)) { |
| vsupacha | 0:f306cb0263a6 | 98 | status = 1; |
| KRiTiRK | 1:c5e6595a03db | 99 | //printf("WOW \n"); |
| vsupacha | 0:f306cb0263a6 | 100 | } |
| vsupacha | 0:f306cb0263a6 | 101 | } |
| KRiTiRK | 1:c5e6595a03db | 102 | //status = 6; |
| vsupacha | 0:f306cb0263a6 | 103 | } |
| KRiTiRK | 1:c5e6595a03db | 104 | //printf("ENDDDDDDDDDDDDDDDDDD\n"); |
| vsupacha | 0:f306cb0263a6 | 105 | protState = IDLE; |
| KRiTiRK | 1:c5e6595a03db | 106 | break; |
| vsupacha | 0:f306cb0263a6 | 107 | default: |
| KRiTiRK | 1:c5e6595a03db | 108 | //printf("DEFAULT \n"); |
| vsupacha | 0:f306cb0263a6 | 109 | protState = IDLE; |
| vsupacha | 0:f306cb0263a6 | 110 | } |
| vsupacha | 0:f306cb0263a6 | 111 | |
| vsupacha | 0:f306cb0263a6 | 112 | return status; |
| vsupacha | 0:f306cb0263a6 | 113 | } |
