Arduino Mega recibe los datos correctos a través de la Serie 0 pero no la Serie 1-3

Actualmente tengo un dispositivo Bluetooth HC-06 conectado a mi Arduino Mega 2560 para recibir cadenas enviadas desde un dispositivo Android. Con el HC-06 en la serie 0, estoy recibiendo los datos sin error con el código siguiente:

String inString = ""; int index = 0; boolean stringComplete = false; void setup(){ Serial.begin(9600); pinMode(pwmPin, OUTPUT); } void loop(){ if(stringComplete){ ParseSerialData(); //Parse the received data inString = ""; //Reset inString to empty stringComplete = false; //Reset the system for further input of data } } void serialEvent(){ while(Serial.available() && stringComplete == false){ char inChar = Serial.read(); inData[index] = inChar; //Store it in char array index++; if (inChar == '\n'){ //Check for termination character index = 0; //Reset the index stringComplete = true; //Set completion of read to true }else{ inString += inChar; //Also store as string } } } 

Cuando intento sustituir "Serial" por "Serial1" y "serialEvent ()" por "serialEvent1 ()" y mover el dispositivo Bluetooth al TX1 y RX1, este programa ya no funciona.

He leído que algunas personas tuvieron problemas similares al usar AVR-GCC 4.4.x y resolvió el problema por degradar a 4.3.x, pero tengo 4.3.2 (en Windows 8.1, el mismo problema ha surgido con Arduino IDE 1.0.3, 1,0,5 – r _ {2} y 1,5,6 – r _ {2}).

He añadido las siguientes instrucciones de impresión (con Serial 0 para imprimir en el monitor en mi PC) al código con el dispositivo BT todavía en la Serie 1:

 String inString = ""; int index = 0; boolean stringComplete = false; void setup(){ Serial1.begin(9600); Serial.begin(9600); pinMode(pwmPin, OUTPUT); Serial.println("Setting up..."); } void loop(){ if(stringComplete){ ParseSerialData(); inString = ""; stringComplete = false; } } void serialEvent1(){ Serial.println("In serialEvent1..."); while(Serial1.available() && stringComplete == false){ Serial.println("Char in..."); char inChar = Serial1.read(); Serial.println("WTF"); Serial.println(inChar); Serial.println("WTF2"); inData[index] = inChar; index++; if (inChar == '\n'){ Serial.println("Termination char read..."); index = 0; stringComplete = true; }else{ inString += inChar; } } } 

Haciendo esto, en el monitor obtengo:

 Setting up... In serialEvent1... Char in... WTF WTF2 

InChar normalmente se imprime como nada, pero durante una prueba se imprime como un carácter '@'. La cadena enviada es "s, 1 \ n" del dispositivo Android.

Basado en la impresión, el evento en serie se activa por la disponibilidad de datos en serie, pero Serial1.available () permanece verdadero sólo para la primera iteración, 's' no se lee (ni ninguno de los otros caracteres que hacen cuando Serial es Utilizado), y un carácter de terminación (newline char) nunca se lee para que pueda comenzar a analizar.

También intenté diversas tarifas de baudios sin ninguna diferencia en comportamiento. Basado en la lectura de la documentación de Arduino, el puerto serie 1 debería funcionar igual que el puerto serie 0, y no perdí la sustitución de Serial por Serial1 en ninguna parte del código.

¿Alguien tiene alguna idea de lo que podría estar causando errores en la comunicación sobre Serial1 de la misma manera que ha funcionado perfectamente en Serial0?

Déjeme saber si no he incluido ninguna información relevante.

¡Gracias por adelantado!

EDITAR:

También encontré una pregunta SO relacionada, que fue resuelta con algo similar a mi código (que funciona perfectamente con Serial0 y se basa en la documentación de Arduino) usando un carácter de terminación esperado (la diferencia es que su código implementa la lectura en serie en el bucle principal , Mientras que el mío está en un serialEvent). Por alguna razón, parece que ambos estábamos teniendo problemas con los datos de Serial1 que no aparecen como disponibles al inicio de la siguiente iteración. Por alguna razón, serialEvent1 no se vuelve a llamar para mí. Y todavía no entiendo por qué el primer / único personaje leído no es "s". Al principio estaba pensando que el flujo se estaba vaciando antes de llegar al evento de serie de nuevo, pero que todavía no cuenta para la lectura en un primer carácter incorrecto.

Además, agregué la siguiente sentencia de impresión Serial1 para ejecutar varias veces en la configuración de Arduino y el dispositivo Android la recibe cada vez sin errores, por lo que el envío de datos funciona correctamente:

  Serial1.print("b,1\n"); 

o incluso

  Serial1.print("A long test message. A long test message.\n"); 

EDIT 2:

Estoy bastante cerca de responder a mi propia pregunta ahora con más pruebas / depuración. En realidad creo que la respuesta puede terminar siendo de hardware en lugar de software. Quería averiguar si el problema era con los datos enviados desde el HC-06 al puerto 1, o con la función de lectura del puerto 1. Básicamente tenía el puerto serie 0 leído en los datos, luego enviarlo en serie al puerto 1, el cual Leería esos datos y enviaría comentarios sobre bluetooth al dispositivo Android. El puerto serie 1 lee la multa de datos procedente del puerto 0, por lo que el problema es la lectura de datos específicamente del HC-06. Puede ser simplemente un problema de nivel de voltaje, por lo que la respuesta puede no pertenecer a stackoverflow. Voy a dejar la pregunta sin respuesta, aunque hasta que definitivamente he encontrado la causa raíz (teniendo en cuenta la posibilidad de que podría necesitar alguna declaración de definición para el HC-06 o el puerto serie 1 para que los datos se lean correctamente, aunque supongo un voltaje Nivel de conversión puede hacer el truco No estoy seguro de por qué habría tal diferencia entre Serial0 y Serial1 sin embargo).

2 Solutions collect form web for “Arduino Mega recibe los datos correctos a través de la Serie 0 pero no la Serie 1-3”

He resuelto el problema que permite la resistencia pullup del pin Rx1:

  Serial1.begin(9600); pinMode(19, INPUT); digitalWrite(19, HIGH); 

Por lo tanto el 3V es "overriden" por el arduino 5V para la lógica ALTO y el cero es bajado abajo por el bluetooth TX para el LOW lógico.

Después de comprobar las líneas de datos en serie en mi osciloscopio, pude llegar a una solución a mi problema. Con la configuración descrita en EDIT 2 (bluetooth TX -> RX0, TX0 -> RX1, TX1 -> Bluetooth RX), comprobé las señales enviadas por el dispositivo bluetooth y por el puerto serie 0 de Arduino.

La señal del dispositivo bluetooth era baja a 400 mV y alta a 3.68V, mientras que el puerto 0 de Arduino envió baja a 0V y alta a 5V. Sabía que el dispositivo bluetooth era un dispositivo de nivel 3.3V, pero el Arduino debería leer algo por encima de 3V como alto, por lo que esto no debería haber sido un problema (y obviamente no estaba en la Serie 0).

De todos modos, he sustituido el dispositivo HC-06 bluetooth con una copia de seguridad que había comprado y todo funciona bien con el código que utiliza Serial1 que publiqué en mi pregunta. Este dispositivo bluetooth transmitía bajo a unos 160 mV y alto a 3.3V.

Parece que mi problema estaba enraizado en el hardware (niveles de voltaje) como se esperaba, y que por alguna razón Serial1 es más sensible a los cambios en los niveles digitales que Serial0. Supongo que mi pregunta de por qué es que sería más adecuado para StackExchange o en algún lugar similar. Avísame si tienes más información o una respuesta más profunda.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.