He estado intentando seguir las publicaciones en la página de Nick Gammon que son un poco viejas, pero parecen Sea la recomendación de todos para probar Arduino con Arduino SPI. Puedo hacer que las comunicaciones funcionen, pero hay un pequeño problema que parece que no puedo identificar. De vez en cuando hay tres caracteres que aparecen en mi salida que son completamente inesperados. ¿De dónde vienen estos personajes?
Esto es lo que son:
Hello, world!
Hello, wo&⸮BHello, world!
Hello, world!
Hello, world!
Hello, world!
En la segunda fila, verá &⸮B
en lugar de lo que debería ser rld!\n
.
Tengo dos Arduino UNO de marca conocida, ambas conectadas a través de USB a mi computadora, y cada una tiene pines 13,12,11 y 10 conectados directamente entre sí. Aquí está el código que estoy usando:
EDITAR: los caracteres inesperados son los mismos cada vez, y aparentemente aparecen como UTF-8 ... los valores decimales para esos caracteres ascienden a 38, 226, 66, 10. I ' No estoy seguro si eso tiene algún significado.
Master:
#include <SPI.h>
void setup (void)
{
Serial.begin(115200);
digitalWrite(SS, HIGH);
SPI.begin ();
SPI.setClockDivider(SPI_CLOCK_DIV8);
}
void loop (void)
{
char c;
// enable Slave Select
digitalWrite(SS, LOW); // SS is pin 10
// send test string
const char p [14] = "Hello, world!\n";
for (int i = 0; i < 14; i++) {
SPI.transfer(p[i]);
Serial.print(p[i]);
}
// disable Slave Select
digitalWrite(SS, HIGH);
delay (2000);
}
Slave:
#include <SPI.h>
volatile char buf [100];
volatile byte pos;
volatile boolean process_it;
void setup (void)
{
Serial.begin (115200);
// have to send on master in, *slave out*
pinMode(MISO, OUTPUT);
// turn on SPI in slave mode
SPCR |= _BV(SPE);
// turn on interrupts
SPCR |= _BV(SPIE);
// get ready for an interrupt
pos = 0; // buffer empty
process_it = false;
// now turn on interrupts
//SPI.attachInterrupt();
}
// SPI interrupt routine
ISR (SPI_STC_vect)
{
byte c = SPDR; // grab byte from SPI Data Register
if (pos < sizeof buf)
{
if (c == '\n') {
buf [pos++] = 'Hello, world!
Hello, wo&⸮BHello, world!
Hello, world!
Hello, world!
Hello, world!
';
process_it = true;
}
else{
buf [pos++] = c;
}
}
}
void loop (void)
{
if (process_it){
char * bufp = buf;
Serial.println (bufp);
pos = 0;
process_it = false;
}
}