Differences
This shows you the differences between two versions of the page.
hu:project:modbus_rtu_uno_master_sw_serial [2021/09/20 17:39] |
hu:project:modbus_rtu_uno_master_sw_serial [2022/04/21 15:04] () |
||
---|---|---|---|
1: | 1: | ||
+ | ====== Modbus RTU Master SW-Serial-lal ====== | ||
+ | A program Arduino UNO-n fut. Az UNO-nak csak egy soros portja van, ezért a sw-serial egy nagyon hasznos funkció, mert több kvázi-UART-tot is nyithatunk vele. Problémája, | ||
+ | |||
+ | ===== Vezetékezés ===== | ||
+ | {{: | ||
+ | ===== Könyvtár ===== | ||
+ | * modbusrtu.h: | ||
+ | * SoftwareSerial.h: | ||
+ | ==== Program ==== | ||
+ | <code c> | ||
+ | // Arduino UNO | ||
+ | // Modbus RTU - Master | ||
+ | // comm over sw serial | ||
+ | |||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | // data array for modbus network sharing | ||
+ | uint16_t au16data[16]; | ||
+ | uint8_t u8state; | ||
+ | #define SSerialTxControl 10 | ||
+ | /** | ||
+ | | ||
+ | | ||
+ | | ||
+ | */ | ||
+ | |||
+ | // this is master USB-FTDI via software serial | ||
+ | Modbus master(0); | ||
+ | /** | ||
+ | * This is an structe which contains a query to an slave device | ||
+ | */ | ||
+ | modbus_t telegram; | ||
+ | |||
+ | unsigned long u32wait; | ||
+ | |||
+ | SoftwareSerial mySerial(2, 3);//Create a SoftwareSerial object so that we can use software serial. Search " | ||
+ | |||
+ | void setup() { | ||
+ | //use the hardware serial if you want to connect to your computer via usb cable | ||
+ | Serial.begin(9600); | ||
+ | // begin the ModBus object. The first parameter is the address of your SoftwareSerial address. | ||
+ | // Do not forget the "&" | ||
+ | master.begin( & | ||
+ | // if there is no answer in 2000 ms, roll over | ||
+ | master.setTimeOut( 2000 ); | ||
+ | u32wait = millis() + 1000; | ||
+ | u8state = 0; | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | switch( u8state ) { | ||
+ | case 0: | ||
+ | if (millis() > u32wait) u8state++; // wait state | ||
+ | break; | ||
+ | case 1: | ||
+ | telegram.u8id = 0x01; // slave address | ||
+ | // master functionen: | ||
+ | // 03: read holding reg., 06: write holdong reg., 10: write more holding reg. | ||
+ | telegram.u8fct = 0x03; // function code | ||
+ | telegram.u16RegAdd = 0x00; // start address in slave | ||
+ | telegram.u16CoilsNo = 0x10; // number of elements (coils or registers) to read | ||
+ | telegram.au16reg = au16data; | ||
+ | |||
+ | master.query( telegram ); // send query (only once) | ||
+ | u8state++; | ||
+ | break; | ||
+ | case 2: | ||
+ | master.poll(); | ||
+ | if (master.getState() == COM_IDLE) { | ||
+ | u8state = 0; | ||
+ | u32wait = millis() + 2000; // wait for answer | ||
+ | // print it to serial monitor | ||
+ | Serial.print(" | ||
+ | Serial.println(au16data[0]); | ||
+ | Serial.print(" | ||
+ | Serial.println(au16data[1]); | ||
+ | Serial.print(" | ||
+ | Serial.println(au16data[2]); | ||
+ | Serial.print(" | ||
+ | Serial.println(au16data[3]); | ||
+ | Serial.print(" | ||
+ | Serial.println(au16data[4]); | ||
+ | Serial.print(" | ||
+ | Serial.println(au16data[5]); | ||
+ | Serial.print(" | ||
+ | Serial.println(au16data[6]); | ||
+ | Serial.print(" | ||
+ | Serial.println(au16data[7]); | ||
+ | Serial.print(" | ||
+ | Serial.println(au16data[8]); | ||
+ | Serial.print(" | ||
+ | Serial.println(au16data[9]); | ||
+ | | ||
+ | } | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | {{: |