#1 2020-04-01 03:40:30

Alex.I
Участник
Зарегистрирован: 2019-11-29
Сообщений: 8

SoftwareSerial (Nano + Mega2560)

Всім вітання. Якщо хтось мав справу з комінкацією 2-х Arduino з використанням SoftwareSerial ліби, то прошу підказки. Перечитав багато прикладів та багато чого спробував, але є "проблема". Задумка така:

- Master по "крону" відправляє на Slave Char, потім виконується Flush
- Slave постійно перевіряє чи передається щось по SoftwareSerial
- Якщо Slave прийняв потрібний Char, то зі сторони Slave виконується Flush + відправляється інший Char на Master
- Master постійно перевіряє чи передається щось по SoftwareSerial
і т.д.

Про проблему SoftwareSerial (неможливість одночасно зчитувати та відправляти) знаю. Також пробував AltSoftserial, але трошки "не зайшло", тому вирішив "добити" спочатку з SoftwareSerial, а вже потім пробувати щось краще

Код Master (Nano v3):

#include <Wire.h>
#include <SoftwareSerial.h>
#include "RTClib.h"
#include <string.h>
#include "Time.h"
#include "TimeAlarms.h"

SoftwareSerial ArduinoSlave(8, 9);
char chrValue = ' ';
RTC_DS1307 RTC;
unsigned long time = 0;

uint32_t syncProvider() {
  return RTC.now().unixtime();
}

void setup() {
  Serial.begin(9600);
  SPI.begin();
  Wire.begin();
  ArduinoSlave.begin(9600);
  RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println(F("RTC is NOT running!"));
    return;
  }
  if (!ArduinoSlave.available()) {
    Serial.println("Master to Slave not initiated!");
    return;
  }
  RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
  setSyncProvider(syncProvider);
  //  Alarm.alarmRepeat(0, 0, 10, checker);
  Alarm.timerRepeat(10, checker);	//повтор пересилки кожні 10 сек
}

void loop() {
  DateTime now = RTC.now();
  Alarm.delay(1000);
  reads();
}

void checker() {
  if (ArduinoSlave.available()) {
    Serial.println("Master to Slave initiated!");
    while (ArduinoSlave.available() > 0) {
      Serial.println("Starting transmit:");
      char chrValue = 65;
      ArduinoSlave.print(chrValue);
      Serial.println("Data was sent:" + chrValue);
      delay(100);
      ArduinoSlave.flush();
    }
  }
  delay(100);
}
void reads() {
    if (!ArduinoSlave.available()) {
      Serial.println("Receive interface not initiated!");
    }
  if (ArduinoSlave.available()) {
    while (ArduinoSlave.available() > 0) {
      chrValue = ArduinoSlave.read();
      Serial.println(chrValue);
      if (chrValue == 66) {
        Serial.println("Slave to Master OK!");
      }
      else if (!chrValue == 66) {
        Serial.println("Slave to Master ERROR!");
        delay(100);
        ArduinoSlave.flush();
      }
    }
  }
}

Код Slave (Mega2560)

#include <SPI.h>
#include <Wire.h>
#include <SoftwareSerial.h>

SoftwareSerial ArduinoMaster(46, 48);
int i;
char chrValue = ' ';
int led1 = 5;
int led2 = 4;
String answer = "";

void setup() {
  Serial.begin(9600);
  SPI.begin();
  Wire.begin();
  ArduinoMaster.begin(115200);
  if (!ArduinoMaster.available()) {
    Serial.println("Slave to Master not initiated!");
  }
}

void loop() {
  master();
}

void master() {
  while (ArduinoMaster.available() == 0) {
  }
  if (ArduinoMaster.available() > 0) {
    while (ArduinoMaster.available() > 0) {
      chrValue = ArduinoMaster.read();
      if (chrValue == 65) {
        Serial.println("Data received:" + chrValue);
        delay(100);
      }
      else if (!chrValue == 65) {
        Serial.println("Wrong data!");
        delay(100);
      }
      delay(100);
      char chrValue = 66;
      ArduinoMaster.print(chrValue);
      Serial.println("Data was sent:" + chrValue);
      delay(100);
      ArduinoMaster.flush();
    }
  }
}

Якщо Master/Slave запустити окремо, то очікувано "....not initiated!" на обох "моніторах", а якщо разом - то просто нічого не виводиться на Master, але "....not initiated!" на Slave. Піни пробував міняти, GND підключав спільно для обох плат. Також пробував використовувати різний baud rate - не допомогло

#2 2020-04-01 04:26:14

Alex.I
Участник
Зарегистрирован: 2019-11-29
Сообщений: 8

Re: SoftwareSerial (Nano + Mega2560)

Спробував "викинути" відправку по "крону" і просто запхати все в loop, і як результат - нічого не видно на "моніторах" для обох плат...

#3 2020-04-01 07:46:04

renoshnik
Участник
Зарегистрирован: 2017-04-03
Сообщений: 771

Re: SoftwareSerial (Nano + Mega2560)

А ничего, что скорости разные ?
Вы уверены, что "софтсериал" потянет такую скорость ?

Редактировался renoshnik (2020-04-01 07:49:01)

#4 2020-04-01 08:15:46

Alex.I
Участник
Зарегистрирован: 2019-11-29
Сообщений: 8

Re: SoftwareSerial (Nano + Mega2560)

то я помилився при вставці коду. на 9600 результат аналогічний

#5 2020-04-01 08:36:20

Watchdog
Гость

Re: SoftwareSerial (Nano + Mega2560)

Alex.I пишет:

... Про проблему SoftwareSerial (неможливість одночасно зчитувати та відправляти) знаю. Також пробував AltSoftserial, але трошки "не зайшло", тому вирішив "добити" спочатку з SoftwareSerial, а вже потім пробувати щось краще ...

Як би це була єдина проблема SoftwareSerial-iв. Почнiть зразу з чогось кращого i не витрачайте задарма час.

#6 2020-04-01 09:34:04

Alex.I
Участник
Зарегистрирован: 2019-11-29
Сообщений: 8

Re: SoftwareSerial (Nano + Mega2560)

Ось перероблений варіант під AltSoftSerial
Master

#include <SPI.h>
#include <Wire.h>
#include <AltSoftSerial.h>
#include "RTClib.h"
#include <string.h>
#include "Time.h"
#include "TimeAlarms.h"

AltSoftSerial altSerial;

char chrValue = ' ';
RTC_DS1307 RTC;
unsigned long time = 0;

uint32_t syncProvider() {
  return RTC.now().unixtime();
}

void setup() {
  Serial.begin(9600);
  SPI.begin();
  Wire.begin();
  altSerial.begin(9600);
  RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println(F("RTC is NOT running!"));
    return;
  }
  if (!altSerial.available()) {
    Serial.print("Alt connection error!");
  }
    RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
    setSyncProvider(syncProvider);
  }

  void loop() {
    DateTime now = RTC.now();
    checker();
    reads();
  }

  void checker() {
    if (altSerial.available()) {
      Serial.println("Master to Slave initiated!");
      while (altSerial.available()) {
        Serial.println("Starting transmit:");
        char chrValue = 65;
        altSerial.print(chrValue);
        Serial.println("Data was sent:" + chrValue);
        delay(100);
        altSerial.flush();
      }
    }
    delay(100);
  }
  void reads() {
    if (altSerial.available()) {
      while (altSerial.available() > 0) {
        chrValue = altSerial.read();
        Serial.println(chrValue);
        if (chrValue == 66) {
          Serial.println("Slave to Master OK!");
        }
        else if (!chrValue == 66) {
          Serial.println("Slave to Master ERROR!");
          delay(100);
          altSerial.flush();
        }
      }
    }
  }

Slave

#include <SPI.h>
#include <Wire.h>
#include <AltSoftSerial.h>

AltSoftSerial altSerial;

char chrValue = ' ';

void setup() {
  Serial.begin(9600);
  SPI.begin();
  Wire.begin();
  altSerial.begin(9600);
  if (!altSerial.available()) {
    Serial.println("Slave to Master not initiated!");
  }
}

void loop() {
  master();
}

void master() {
  while (altSerial.available() == 0) {
  }
  if (altSerial.available() > 0) {
    while (altSerial.available() > 0) {
      chrValue = altSerial.read();
      if (chrValue == 65) {
        Serial.println("Data received:" + chrValue);
        delay(100);
      }
      else if (!chrValue == 65) {
        Serial.println("Wrong data!");
        delay(100);
      }
      delay(100);
      char chrValue = 66;
      altSerial.print(chrValue);
      Serial.println("Data was sent:" + chrValue);
      delay(100);
      altSerial.flush();
    }
  }
}

Тепер стабільно, з обох сторін "...not initiated!". Розпіновка вірна, GND спільний

#7 2020-04-01 10:29:03

Watchdog
Гость

Re: SoftwareSerial (Nano + Mega2560)

Alex.I пишет:

Ось перероблений варіант під AltSoftSerial
Master ... Тепер стабільно, з обох сторін "...not initiated!". Розпіновка вірна, GND спільний

От i добре, хай так i працюе. Я почуваюсь так як би сказав дурницю. Але ж нi. Успiхiв!

#8 2020-04-01 13:25:10

Alex.I
Участник
Зарегистрирован: 2019-11-29
Сообщений: 8

Re: SoftwareSerial (Nano + Mega2560)

Я теж був би радий, але в моніторах плат нічого не видно, окрім "...not initiated!", тобто пересилка не відбувається sad Спробував іншу Мега2560, бо допускав момент. що піни "підпалені" - теж нічого не змінилося.

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела