Sukkpranhachai Gatesichapakorn / Mbed 2 deprecated TAIST_modbus

Dependencies:   mbed

Fork of TAIST_modbus by Supachai Vorapojpisut

Committer:
nengzix
Date:
Wed Mar 14 13:23:27 2018 +0000
Revision:
11:316c0fb5423b
Parent:
10:eabe9928e13e
Child:
12:228a52b841be
fix bug in modbus lrc checker

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 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);
vsupacha 0:f306cb0263a6 20 }
vsupacha 0:f306cb0263a6 21 tmpbuf[0] = buf[12]; tmpbuf[1] = buf[13];
vsupacha 0:f306cb0263a6 22 lrc = strtoul(tmpbuf, NULL, 16);
vsupacha 0:f306cb0263a6 23 for (i = 0; i < 6; i++) {
vsupacha 0:f306cb0263a6 24 sum += frame[i];
vsupacha 0:f306cb0263a6 25 }
nengzix 11:316c0fb5423b 26 uint8_t checker = (sum + lrc);
nengzix 11:316c0fb5423b 27 if (checker == 0) {
vsupacha 0:f306cb0263a6 28 status = 1;
vsupacha 0:f306cb0263a6 29 }
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
fzaq 6:5bb5238f2f6e 48 uint16_t modbus_update(uint8_t offset, uint16_t val) //pressed = 1, gap = 0
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 {
vsupacha 0:f306cb0263a6 62 static char buf[514];
vsupacha 0:f306cb0263a6 63 static int idx = 0;
vsupacha 0:f306cb0263a6 64 static int status = 0;
vsupacha 0:f306cb0263a6 65 switch(protState) {
vsupacha 0:f306cb0263a6 66 case IDLE:
vsupacha 0:f306cb0263a6 67 if (ch == ':') {
vsupacha 0:f306cb0263a6 68 protState = RECEPTION;
vsupacha 0:f306cb0263a6 69 idx = 0;
vsupacha 0:f306cb0263a6 70 status = 0;
vsupacha 0:f306cb0263a6 71 }
vsupacha 0:f306cb0263a6 72 break;
vsupacha 0:f306cb0263a6 73 case RECEPTION:
vsupacha 0:f306cb0263a6 74 if ((ch >= '0') && (ch <= '9')) {
vsupacha 0:f306cb0263a6 75 buf[idx++] = ch;
vsupacha 0:f306cb0263a6 76 } else if ((ch >= 'a') && (ch <= 'f')) {
vsupacha 0:f306cb0263a6 77 buf[idx++] = ch;
vsupacha 0:f306cb0263a6 78 } else if ((ch >= 'A') && (ch <= 'F')) {
vsupacha 0:f306cb0263a6 79 buf[idx++] = ch;
vsupacha 0:f306cb0263a6 80 } else if (ch == '\r') {
vsupacha 0:f306cb0263a6 81 buf[idx] = 0;
vsupacha 0:f306cb0263a6 82 protState = END;
vsupacha 0:f306cb0263a6 83 } else {
vsupacha 0:f306cb0263a6 84 protState = IDLE;
vsupacha 0:f306cb0263a6 85 }
vsupacha 0:f306cb0263a6 86 break;
vsupacha 0:f306cb0263a6 87 case END:
vsupacha 0:f306cb0263a6 88 if (ch == '\n') {
vsupacha 0:f306cb0263a6 89 if (process_buffer(buf, frame)) {
vsupacha 0:f306cb0263a6 90 if ((frame[0] == nodeId) && (frame[1] == FUNC_CODE)) {
vsupacha 0:f306cb0263a6 91 status = 1;
vsupacha 0:f306cb0263a6 92 }
vsupacha 0:f306cb0263a6 93 }
vsupacha 0:f306cb0263a6 94 }
vsupacha 0:f306cb0263a6 95 protState = IDLE;
vsupacha 0:f306cb0263a6 96 break;
vsupacha 0:f306cb0263a6 97 default:
vsupacha 0:f306cb0263a6 98 protState = IDLE;
vsupacha 0:f306cb0263a6 99 }
vsupacha 0:f306cb0263a6 100
vsupacha 0:f306cb0263a6 101 return status;
vsupacha 0:f306cb0263a6 102 }