
New group
Fork of TAIST_modbus by
Revision 29:c19cea6e2ec3, committed 2018-03-20
- Comitter:
- nengzix
- Date:
- Tue Mar 20 12:08:50 2018 +0000
- Parent:
- 28:a42061363658
- Commit message:
- add rs4b5 en
Changed in this revision
diff -r a42061363658 -r c19cea6e2ec3 main.cpp --- a/main.cpp Sat Mar 17 08:22:39 2018 +0000 +++ b/main.cpp Tue Mar 20 12:08:50 2018 +0000 @@ -3,9 +3,12 @@ #include "RawSerial.h" DigitalOut myled(LED1); +DigitalOut rs485_en(D2); AnalogIn analog_value(A0); -RawSerial pc(USBTX, USBRX); +//RawSerial pc(USBTX, USBRX, 57600); +RawSerial comm(PC_6, PC_7, 57600); + InterruptIn button(USER_BUTTON); Ticker timebase; @@ -14,20 +17,26 @@ uint32_t Tick = 0; uint32_t pressedTick = 0; -uint32_t releasedTick = 0; +uint32_t releasedTick = 0; void serial_callback() { uint8_t frame[6]; uint16_t offset, count; uint8_t reg_map; + char tmp[20]; - char ch = pc.getc(); + char ch = comm.getc(); if (modbus_parser(ch, frame)) { offset = (frame[2] << 8) | (frame[3]); count = (frame[4] << 8) | (frame[5]); reg_map = modbus_check(offset, count); - modbus_response(reg_map); + modbus_response(reg_map, tmp); + rs485_en = 1; + wait(0.01); + comm.printf(tmp); + wait(0.01); + rs485_en = 0; } } @@ -82,9 +91,10 @@ } int main() { + rs485_en = 0; // setup code - pc.attach(&serial_callback); - modbus_init(0x0059); // init ID + comm.attach(&serial_callback); + modbus_init(0x0002); // init ID=02 :020300000002F9 // 1. button code button.rise(&pressed_callback);
diff -r a42061363658 -r c19cea6e2ec3 modbus.cpp --- a/modbus.cpp Sat Mar 17 08:22:39 2018 +0000 +++ b/modbus.cpp Tue Mar 20 12:08:50 2018 +0000 @@ -104,7 +104,7 @@ buf[idx++] = ch; } else if ((ch >= 'A') && (ch <= 'F')) { buf[idx++] = ch; - } else if (ch == '\r') { + } else if (ch == '\r' and idx > 4) { buf[idx] = 0; protState = END; } else { @@ -139,14 +139,13 @@ return -lrc; } -void modbus_response(uint8_t reg_map) +void modbus_response(uint8_t reg_map, char *rttmp) { char fmt00[] = ":%02X%02X%02X\r\n"; char fmt01[] = ":%02X%02X%02X%02X%02X\r\n"; char fmt02[] = ":%02X%02X%02X%02X%02X\r\n"; char fmt03[] = ":%02X%02X%02X%02X%02X%02X%02X\r\n"; char *fmtstr; - char str[20]; uint8_t frame[ADDR_RANGE*2 + 3]; uint16_t tmp; @@ -159,9 +158,9 @@ frame[3] = tmp & 0xFF; frame[4] = calc_lrc(frame, 4); fmtstr = fmt01; - sprintf(str, fmtstr, frame[0], frame[1], frame[2], frame[3], frame[4]); + sprintf(rttmp, fmtstr, frame[0], frame[1], frame[2], frame[3], frame[4]); //printf("Response: %s", str); - printf(str); + //printf(str); break; case 2: tmp = modbus_read(1); @@ -169,9 +168,9 @@ frame[3] = tmp & 0xFF; frame[4] = calc_lrc(frame, 4); fmtstr = fmt02; - sprintf(str, fmtstr, frame[0], frame[1], frame[2], frame[3], frame[4]); + sprintf(rttmp, fmtstr, frame[0], frame[1], frame[2], frame[3], frame[4]); //printf("Response: %s", str); - printf(str); + //printf(str); break; case 3: tmp = modbus_read(0); @@ -182,14 +181,14 @@ frame[5] = tmp & 0xFF; frame[6] = calc_lrc(frame, 6); fmtstr = fmt03; - sprintf(str, fmtstr, frame[0], frame[1], frame[2], frame[3], frame[4], frame[5], frame[6]); + sprintf(rttmp, fmtstr, frame[0], frame[1], frame[2], frame[3], frame[4], frame[5], frame[6]); //printf("Response: %s", str); - printf(str); + //printf(str); break; default: fmtstr = fmt00; frame[2] = calc_lrc(frame, 2); - sprintf(str, fmtstr, frame[0], frame[1], frame[2]); + sprintf(rttmp, fmtstr, frame[0], frame[1], frame[2]); //printf("Response: %s", str); } }
diff -r a42061363658 -r c19cea6e2ec3 modbus.h --- a/modbus.h Sat Mar 17 08:22:39 2018 +0000 +++ b/modbus.h Tue Mar 20 12:08:50 2018 +0000 @@ -11,6 +11,6 @@ uint16_t modbus_update(uint8_t offset, uint16_t val); int modbus_parser(char ch, uint8_t *frame); uint8_t modbus_check(uint16_t offset, uint16_t count); -void modbus_response(uint8_t reg_map); +void modbus_response(uint8_t reg_map, char *rttmp); #endif // MODBUS_H