Последовательная связь между двумя 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
@Roshan, 👍0
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, но вы упомянули его выше.
Надеюсь, это поможет. Извините, если я не решил вашу проблему.
- Повреждение данных SoftwareSerial - поиск предложений
- Какой лучший способ объявить Serial при создании библиотеки Arduino?
- Термопринтер Adafruit печатает слабо
- Последовательная связь между Arduino
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Последовательная связь между двумя Arduino (запрос и получение)