Arduino-to-Arduino SPI caracteres inesperados

0

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; } }
    

1 respuesta

1

A pesar del hecho de que ambas unidades estaban siendo alimentadas desde el mismo USB Hub, hubo una diferencia de voltaje en las GND de cada Arduino. Saltando los pines de GND entre los dos se libró de los personajes extraviados y el comportamiento extraño. D'oh.

    
respondido por el TheEmpireNeverEnded

Lea otras preguntas en las etiquetas