Последовательная связь между двумя Arduino не работает при отправке строки в программе с большим количеством функций.

Примечание:

Этот вопрос полностью отличается от вопросов, которые я задавал ранее, хотя фрагменты кода могут быть такими же. Поэтому, пожалуйста, не отбрасывайте его как дубликат, когда видите.

В моей настройке я последовательно соединил два arduino. Arduino Mega — это тот, который отправляет строку, а Arduino Uno — тот, который ее получает.

  • Arduino Mega: TX1(19),RX1(18) - Serial1
  • Arduino Uno: RX(10),TX(11) - с использованием SoftwareSerial
  • Gnd подключен на обеих платах

Arduino UNO — код одинаков для обоих случаев

#include <SoftwareSerial.h>
SoftwareSerial s(10, 11);
void setup() 
{
  delay(200);
  Serial.begin(9600);
  Serial1.begin(9600);  
  s.begin(9600);
  while (!Serial) ;  // ждем Arduino Serial Monitor
}
void loop() 
{  
  if(s.available()>0)
  {
     Serial.print("\nrec\n");
     delay(100);
     String b = s.readStringUntil('\n');
     delay(100);
     Serial.print(b);
     delay(40);
  }

}

Когда код в моем Arduino Mega содержит только оператор печати для отправки строки бесконечное количество раз в Uno, Uno получает строку правильно.

Arduino Mega

void setup()
{
  Serial1.begin(9600);
}
void loop() 
{
  Serial1.println("e2e4");   
  delay(100);
}

Теперь, когда я отправляю строку бесконечное количество раз с Arduino mega, но на этот раз mega имеет гораздо больше функций, включенных в программу. В этом случае Uno не получает отправленную строку.

Arduino Mega - код, содержащий множество функций и передающий строку в Уно

int SensorValStore_Prev[8][8] = { {0,0,0,0,0,0,0,0}, \
                                  {0,0,0,0,0,0,0,0}, \
                                  {1,1,1,1,1,1,1,1}, \
                                  {1,1,1,1,1,1,1,1}, \
                                  {1,1,1,1,1,1,1,1}, \
                                  {1,1,1,1,1,1,1,1}, \
                                  {0,0,0,0,0,0,0,0}, \
                                  {0,0,0,0,0,0,0,0} };

int SensorValStore_Curr[8][8]={ {0,0,0,0,0,0,0,0}, \
                                {0,0,0,0,0,0,0,0}, \
                                {1,1,1,1,1,1,1,1}, \
                                {1,1,1,1,1,1,1,1}, \
                                {1,1,1,1,1,1,1,1}, \
                                {1,1,0,1,1,1,1,1}, \
                                {0,0,0,0,0,0,0,0}, \
                                {0,1,0,0,0,0,0,0} };
//int SensorValStore_Curr[8][8];
int sum1[8],sum2[8],temp[8][8],k,l,i,j,rank,nextRow;
String file,moveSan,Temp,bestMove;
char Buffer[20];
void doAction();
void ReadSensor();
void Difference();
void binToIntCalc();
void check();
void getMovePlayed();
void SendMove();
void getMove();

void setup()
{
  Serial.begin(9600);
  lcd.begin(16,2);
  pinMode(22,INPUT_PULLUP); // Геркон - Row1
  pinMode(24,INPUT_PULLUP); // Геркон - Row2
  pinMode(26,INPUT_PULLUP); // Геркон - Row3
  pinMode(28,INPUT_PULLUP); // Геркон - Row4
  pinMode(30,INPUT_PULLUP); // Геркон - Row5
  pinMode(32,INPUT_PULLUP); // Геркон - Row6
  pinMode(34,INPUT_PULLUP); // Геркон - Row7
  pinMode(36,INPUT_PULLUP); // Геркон - Row8
  pinMode(2,INPUT_PULLUP);// Кнопка нажатия
  pinMode(38,OUTPUT);
  pinMode(40,OUTPUT);
  pinMode(42,OUTPUT);
  pinMode(44,OUTPUT);
  pinMode(46,OUTPUT);
  pinMode(48,OUTPUT);
  pinMode(50,OUTPUT);
  pinMode(52,OUTPUT);
  pinMode(3,OUTPUT);
  digitalWrite(38,HIGH);
  digitalWrite(40,HIGH);
  digitalWrite(42,HIGH);
  digitalWrite(44,HIGH);
  digitalWrite(46,HIGH);
  digitalWrite(48,HIGH);
  digitalWrite(50,HIGH);
  digitalWrite(52,HIGH);
  digitalWrite(3,LOW);
}

void loop()
{

  // doAction();
  delay(40);
  Difference();
  delay(40);
  binToIntCalc();
  delay(40);
  check();
  delay(40);
  getMovePlayed();
  delay(40);
  getMove();
  delay(40);
  //}
}

void Print(int matrix[8][8])
{
  for(i=0;i<8;i++)
  {
    for(j=0;j<8;j++)
    {
      Serial.print(matrix[i][j]);
      Serial.print(" ");
    }
    Serial.println();
  }
}

void doAction()
{
  nextRow = 0;
  for(i=0;i<8;i++)
  {
    digitalWrite(38 + nextRow,LOW);
    delay(40);
    ReadSensor(i);
    digitalWrite(38 + nextRow,HIGH);
    delay(40);
    nextRow +=2;
  }
}

void ReadSensor(int iter)  
{
  delay(10);
  for(j=0;j<8;j++)
    SensorValStore_Curr[iter][j] = digitalRead(j+2);
}

void Difference()
{
  for(i=0;i<8;i++)
    for(j=0;j<8;j++)
      temp[i][j] = abs(SensorValStore_Curr[i][j] - SensorValStore_Prev[i[j]);

}

void binToIntCalc()
{
  for(i=0;i<8;i++)
    for(j=0;j<8;j++)
    {
      sum1[i] += pow(2,j)*SensorValStore_Prev[i][j];
      sum2[i] += pow(2,j)*SensorValStore_Curr[i][j];
    }
 }

void check()
{
  k=0;
  l=0;
  for(i=0;i<8;i++)
  {   
    if(sum2[i]>sum1[i])
      k = i;
    if(sum2[i]<sum1[i])
      l = i;
    delay(40);
  }
}

void getMovePlayed()
{
  for(j=0;j<8;j++)
  {
    if(temp[k][j] == 1)
    {
      rank =k+1;
      file = String(char(97+j));
      delay(40);
      moveSan = file + rank;
      Temp = moveSan;
    }
  }
  for(j=0;j<8;j++)
  { 
    if( temp[l][j] == 1)
    {
      rank =l+1;
      file = String(char(97+j));
      delay(40);
      moveSan = file + rank;
      Temp.concat(moveSan);
    }
  }
}

void SendMove(String movePlayed)
{
  Serial.println("start");
  Serial.print(movePlayed);
  Serial.println();
}

void getMove() // ОТПРАВКА СТРОКИ В ARDUINO UNO
{
 while(1){
  Serial1.println("e2e4");   
  delay(100);
  }
}

Примечание: getMove() — это функция, которая отправляет строку в Arduino через Serial1

, 👍0


1 ответ


1

Мой ответ может оказаться не таким, как вы ожидаете, но я все равно попробую.

Вы устранили неполадки в последовательной связи? Попробуйте создать простую программу для обеих карт и попробуйте отправить данные с одной на другую.

Код Уно

#include <SoftwareSerial.h>

#define rxPin 10
#define txPin 11

SoftwareSerial s(rxPin, txPin);

String buff = "";

void setup()
{
    s.begin(9600);
    Serial.begin(9600);
}

void loop()
{
    if(Serial.available)
    {
        while(Serial.available())
        {
            buff += char(Serial.read());
        }
        s.print(buff);
        buff="";
    }

    if(s.available)
    {
        while(s.available())
        {
            buff += char(s.read());
        }
        Serial.print(buff);
        buff = "";
    }
}

Мегакод

String buff = "";

void setup()
{
    Serial1.begin(9600);
    Serial.begin(9600);
}

void loop()
{
    if(Serial.available)
    {
        while(Serial.available())
        {
            buff += char(Serial.read());
        }
        Serial1.print(buff);
        buff="";
    }

    if(Serial1.available)
    {
        while(Serial1.available())
        {
            buff += char(Serial1.read());
        }
        Serial.print(buff);
        buff = "";
    }
}

Вы дважды проверили свои соединения? Tx (mega) к rx (uno) и rx (mega) к tx(uno)

В вашей настройке() на Arduino Mega

void setup()
{
  Serial.begin(9600);
  lcd.begin(16,2);
  pinMode(22,INPUT_PULLUP); // Геркон - Row1
  pinMode(24,INPUT_PULLUP); // Геркон - Row2
  pinMode(26,INPUT_PULLUP); // Геркон - Row3
  pinMode(28,INPUT_PULLUP); // Геркон - Row4
  pinMode(30,INPUT_PULLUP); // Геркон - Row5
  pinMode(32,INPUT_PULLUP); // Геркон - Row6
  pinMode(34,INPUT_PULLUP); // Геркон - Row7
  pinMode(36,INPUT_PULLUP); // Геркон - Row8
  pinMode(2,INPUT_PULLUP);// Кнопка нажатия
  pinMode(38,OUTPUT);
  pinMode(40,OUTPUT);
  pinMode(42,OUTPUT);
  pinMode(44,OUTPUT);
  pinMode(46,OUTPUT);
  pinMode(48,OUTPUT);
  pinMode(50,OUTPUT);
  pinMode(52,OUTPUT);
  pinMode(3,OUTPUT);
  digitalWrite(38,HIGH);
  digitalWrite(40,HIGH);
  digitalWrite(42,HIGH);
  digitalWrite(44,HIGH);
  digitalWrite(46,HIGH);
  digitalWrite(48,HIGH);
  digitalWrite(50,HIGH);
  digitalWrite(52,HIGH);
  digitalWrite(3,LOW);
}

Я не вижу Serial1.begin(9600), как сказал @chrisl, но вы упомянули его выше.

Надеюсь, это поможет. Извините, если я не решил вашу проблему.

,