Здравствуйте В вики по амперковскому шилду RS-485 рассматривается передача информации сразу символами. Подскажите, как работать через этот шилд напрямую с Modbus? Может быть есть где-то удобные рабочие примеры, которые стоит рассмотреть? Заранее спасибо!
Не работает Нет отклика от прибора. Код (C++): #include <ModbusRtu.h> #include <SoftwareSerial.h> #define TXEN 7 long ts = 0; Modbus master(0); modbus_t telegram; SoftwareSerial mySerial(6, 9); // RX, TX uint8_t u8state; uint16_t au16data[16]; unsigned long u32wait; void setup() { Serial.begin(9600); Serial.println("Started"); mySerial.begin(9600); pinMode(TXEN, OUTPUT); digitalWrite(TXEN, HIGH); u32wait = millis(); for (int i = 0; i < 16; i++) { au16data[i] = 0; }; } void loop() { switch( u8state ) { case 0: if (millis() > u32wait) u8state++; // wait state break; case 1: telegram.u8id = 1; // slave address telegram.u8fct = 3; // function code (this one is registers read) telegram.u16RegAdd = 1; // start address in slave telegram.u16CoilsNo = 12; // number of elements (coils or registers) to read telegram.au16reg = au16data; // pointer to a memory array in the Arduino digitalWrite(TXEN, HIGH); master.query(telegram); // send query (only once) digitalWrite(TXEN, LOW); u8state++; break; case 2: master.poll(); // check incoming messages if (master.getState() == COM_IDLE) { u8state = 0; u32wait = millis() + 500; Serial.println("received:"); Serial.print("0 = "); Serial.println(au16data[0]); Serial.print("1 = "); Serial.println(au16data[1]); Serial.print("2 = "); Serial.println(au16data[2]); Serial.print("3 = "); Serial.println(au16data[3]); Serial.print("4 = "); Serial.println(au16data[4]); Serial.print("5 = "); Serial.println(au16data[5]); Serial.print("6 = "); Serial.println(au16data[6]); } break; } }
что-то я не вижу, в каком месте вы говорите мастеру работать через mySerial() ? В библиотеке разве нет примеров?
Большое спасибо! Поправил. Но пока без результата. Код (C++): #include <ModbusRtu.h> #include <SoftwareSerial.h> #define TXEN 7 long ts = 0; Modbus master(0); modbus_t telegram; SoftwareSerial mySerial(6, 9); // RX, TX uint8_t u8state; uint16_t au16data[16]; unsigned long u32wait; void setup() { Serial.begin(9600); Serial.println("Started"); master.begin(&mySerial, 9600); pinMode(TXEN, OUTPUT); digitalWrite(TXEN, HIGH); u32wait = millis(); for (int i = 0; i < 16; i++) { au16data[i] = 0; }; } void loop() { switch( u8state ) { case 0: if (millis() > u32wait) u8state++; // wait state break; case 1: telegram.u8id = 1; // slave address telegram.u8fct = 3; // function code (this one is registers read) telegram.u16RegAdd = 1; // start address in slave telegram.u16CoilsNo = 12; // number of elements (coils or registers) to read telegram.au16reg = au16data; // pointer to a memory array in the Arduino digitalWrite(TXEN, HIGH); master.query(telegram); // send query (only once) digitalWrite(TXEN, LOW); u8state++; break; case 2: master.poll(); // check incoming messages if (master.getState() == COM_IDLE) { u8state = 0; u32wait = millis() + 500; Serial.println("received:"); Serial.print("0 = "); Serial.println(au16data[0]); Serial.print("1 = "); Serial.println(au16data[1]); Serial.print("2 = "); Serial.println(au16data[2]); Serial.print("3 = "); Serial.println(au16data[3]); Serial.print("4 = "); Serial.println(au16data[4]); Serial.print("5 = "); Serial.println(au16data[5]); Serial.print("6 = "); Serial.println(au16data[6]); } break; } }
вопрос все тот же - разве в библиотеке нет примеров? Зачем вы что-то выдумываете, сначала возьмите готовый пример, проверьте что он работает, а потом уже меняйте. Модбас вы опять инициализируете неправильно.