I need to create a two way String exchanger via SPI with two Arduino UNOs. Strings and their lengths are independent variables of the main loop and they can change with every iteration. I need both of the Arduinos to communicate with each other regardless of what the strings contain. I want to see basically the same screen with the serial monitor.
It is kind of working. I am not sure how to explain it, I'll just show it below.
Basically the main idea for both of the Arduino's is like this:
Master: hey
Slave: hi
Instead I get this on the master:
Slave:
Slave:
Master: hey
Slave: y
Slave:
Slave:
.
.
.
Slave: i
Slave:
Slave:
.
.
And the slave displays only itself:
Slave: hi
I have created for loops to transfer every char of the string seperately and respectively but this is still the case. I couldn't find any sample code online for independent strings transfering via SPI. I know I probably have many mistakes but how can I fix them to work just as I intend to?
Connections:
Arduino1.pin13 --- Arduino2.pin13
Arduino1.pin12 --- Arduino2.pin12
Arduino1.pin11 --- Arduino2.pin11
Arduino1.pin10 --- Arduino2.pin10
Master Code
//MASTER
#include<SPI.h>
String textSend="", textReceive="";
void setup(){
Serial.begin(115200);
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV8); //Sets clock for SPI communication at 8 (16/8=2Mhz)
digitalWrite(SS,LOW);
}
void loop(){
textSend=""; textReceive="";
textSend = Serial.readString();
if(textSend != ""){
for(int i = 0; i < textSend.length(); i++){
delayMicroseconds (20);
SPI.transfer(textSend[i]);
}
Serial.print ("Master: ");
Serial.println (textSend);
}else{
int i = 0;
char c;
do{
delayMicroseconds (20);
c = SPI.transfer(1);
textReceive += c;
i++;
}while(textReceive[i] != 0);
if(textReceive[i] == 0){
Serial.print ("Slave: ");
Serial.println (textReceive);
textReceive = "";
}
}
}
Slave Code
//SLAVE
#include<SPI.h>
String textSend="";
String textReceive="";
void setup (void){
Serial.begin(115200);
pinMode(MISO, OUTPUT);
SPCR |= _BV(SPE);
SPCR |= _BV(SPIE);
SPI.attachInterrupt();
}
ISR (SPI_STC_vect){ //Interrupt Service Routine
byte c = SPDR;
if(c != 1){ //Slave receives
for(int i = 0; i < textReceive.length(); i++){
textReceive += SPDR;
}
if(textReceive.length() > 0){
Serial.print("Master: ");
Serial.println(textReceive);
textReceive = "";
}
}else{
for(int i = 0; i < textSend.length(); i++){
delayMicroseconds(20);
SPDR = textSend[i];
}
if(textSend != ""){
Serial.print("Slave: ");
Serial.println(textSend);
textSend = "";
}
}
}
void loop() {
if(textSend == "")
textSend = Serial.readString();
}
PS: I am using different computers for each arduino
Master.ino (1.11 KB)
Slave.ino (836 Bytes)