separate

Dependencies:   mbed

Fork of TAIST_modbus_copy by Ananya Kuasakunrungroj

Committer:
javakung
Date:
Wed Mar 14 19:06:35 2018 +0000
Revision:
33:79138448c17d
Parent:
31:184920407d1c
-minimize modbus_gen function; -remove printf for debugging

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsupacha 0:f306cb0263a6 1 #include "mbed.h"
vsupacha 0:f306cb0263a6 2 #include "modbus.h"
vsupacha 0:f306cb0263a6 3
vsupacha 0:f306cb0263a6 4 uint8_t nodeId = 0;
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
vsupacha 0:f306cb0263a6 16 if (strlen(buf) == 14) {
vsupacha 0:f306cb0263a6 17 for (i = 0; i < 6; i++) {
vsupacha 0:f306cb0263a6 18 tmpbuf[0] = buf[i*2];
vsupacha 0:f306cb0263a6 19 tmpbuf[1] = buf[i*2 + 1];
vsupacha 0:f306cb0263a6 20 frame[i] = strtoul(tmpbuf, NULL, 16);
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 }
javakung 33:79138448c17d 27 uint8_t mysum = (sum + lrc);
javakung 30:b4b820d33ce7 28
javakung 30:b4b820d33ce7 29 if (mysum == 0) {
vsupacha 0:f306cb0263a6 30 status = 1;
vsupacha 0:f306cb0263a6 31 }
vsupacha 0:f306cb0263a6 32 }
vsupacha 0:f306cb0263a6 33
vsupacha 0:f306cb0263a6 34 return status;
vsupacha 0:f306cb0263a6 35 }
vsupacha 0:f306cb0263a6 36
vsupacha 0:f306cb0263a6 37 void modbus_init(uint8_t id)
vsupacha 0:f306cb0263a6 38 {
vsupacha 0:f306cb0263a6 39 nodeId = id;
vsupacha 0:f306cb0263a6 40 }
vsupacha 0:f306cb0263a6 41
vsupacha 0:f306cb0263a6 42 uint16_t modbus_read(uint16_t offset)
vsupacha 0:f306cb0263a6 43 {
vsupacha 0:f306cb0263a6 44 if (offset < ADDR_RANGE) {
vsupacha 0:f306cb0263a6 45 return regValue[offset];
vsupacha 0:f306cb0263a6 46 }
vsupacha 0:f306cb0263a6 47 return 0xFFFF;
vsupacha 0:f306cb0263a6 48 }
vsupacha 0:f306cb0263a6 49
vsupacha 0:f306cb0263a6 50 uint16_t modbus_update(uint8_t offset, uint16_t val)
vsupacha 0:f306cb0263a6 51 {
vsupacha 0:f306cb0263a6 52 uint16_t tmp;
vsupacha 0:f306cb0263a6 53
vsupacha 0:f306cb0263a6 54 if (offset < ADDR_RANGE) {
vsupacha 0:f306cb0263a6 55 tmp = regValue[offset];
vsupacha 0:f306cb0263a6 56 regValue[offset] = val;
vsupacha 0:f306cb0263a6 57 return tmp;
vsupacha 0:f306cb0263a6 58 }
vsupacha 0:f306cb0263a6 59 return 0xFFFF;
vsupacha 0:f306cb0263a6 60 }
vsupacha 0:f306cb0263a6 61
vsupacha 0:f306cb0263a6 62 int modbus_parser(char ch, uint8_t *frame)
vsupacha 0:f306cb0263a6 63 {
vsupacha 0:f306cb0263a6 64 static char buf[514];
vsupacha 0:f306cb0263a6 65 static int idx = 0;
vsupacha 0:f306cb0263a6 66 static int status = 0;
javakung 31:184920407d1c 67
vsupacha 0:f306cb0263a6 68 switch(protState) {
vsupacha 0:f306cb0263a6 69 case IDLE:
vsupacha 0:f306cb0263a6 70 if (ch == ':') {
vsupacha 0:f306cb0263a6 71 protState = RECEPTION;
vsupacha 0:f306cb0263a6 72 idx = 0;
vsupacha 0:f306cb0263a6 73 status = 0;
vsupacha 0:f306cb0263a6 74 }
vsupacha 0:f306cb0263a6 75 break;
vsupacha 0:f306cb0263a6 76 case RECEPTION:
vsupacha 0:f306cb0263a6 77 if ((ch >= '0') && (ch <= '9')) {
vsupacha 0:f306cb0263a6 78 buf[idx++] = ch;
vsupacha 0:f306cb0263a6 79 } else if ((ch >= 'a') && (ch <= 'f')) {
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 == '\r') {
vsupacha 0:f306cb0263a6 84 buf[idx] = 0;
vsupacha 0:f306cb0263a6 85 protState = END;
vsupacha 0:f306cb0263a6 86 } else {
vsupacha 0:f306cb0263a6 87 protState = IDLE;
vsupacha 0:f306cb0263a6 88 }
vsupacha 0:f306cb0263a6 89 break;
vsupacha 0:f306cb0263a6 90 case END:
vsupacha 0:f306cb0263a6 91 if (ch == '\n') {
vsupacha 0:f306cb0263a6 92 if (process_buffer(buf, frame)) {
vsupacha 0:f306cb0263a6 93 if ((frame[0] == nodeId) && (frame[1] == FUNC_CODE)) {
vsupacha 0:f306cb0263a6 94 status = 1;
javakung 33:79138448c17d 95 protState = IDLE;
vsupacha 0:f306cb0263a6 96 }
vsupacha 0:f306cb0263a6 97 }
vsupacha 0:f306cb0263a6 98 }
vsupacha 0:f306cb0263a6 99 protState = IDLE;
vsupacha 0:f306cb0263a6 100 break;
vsupacha 0:f306cb0263a6 101 default:
vsupacha 0:f306cb0263a6 102 protState = IDLE;
vsupacha 0:f306cb0263a6 103 }
vsupacha 0:f306cb0263a6 104
vsupacha 0:f306cb0263a6 105 return status;
vsupacha 0:f306cb0263a6 106 }