Probé un voltímetro sobre GND y DI10 y mientras lo medía mostraba
0V.
Eso no suena bien.
Cuando un UART no está transmitiendo ningún dato, permanece en el estado inactivo "1".
Esperaba que los cables conectados al Arduino fueran niveles llamados RS232TTL de + 5V en el estado "1" y cerca de GND en el estado "0".
(d)
Cuando el UART está transmitiendo gran cantidad de datos, un multímetro generalmente muestra algún tipo de voltaje promedio entre el estado "1" y el estado "0", rebotando alrededor de 2 V a 4 V.
¿Quizás una línea de alimentación o de datos se desconectó o se conectó incorrectamente?
Como nota al margen, si quito la línea pinMode (rxPin, INPUT) entonces
nunca se recibe nada (y rf.available () siempre es 0).
Eso es muy inesperado.
La mayoría de la documentación de Arduino dice cosas como
"Los pines Arduino (Atmega) están predeterminados en las entradas, por lo que no necesitan ser declarados explícitamente como entradas con pinMode ()". (a)
Algunos tutoriales para SoftwareSerial sugieren declarar explícitamente la salida de los pines TX.
(b)
Tal vez lo que sea que esté escuchando "txPin" esté captando ruido, ¿haciendo que haga algo inesperado?
La mayoría de los tutoriales de Arduino parecen usar 9600 bps para el hardware Serial uart.
(c)
rf.available () siempre es > 0 (y también se convierte en 63)
¿Cómo podrías saber eso?
Estoy empezando a sospechar que el código en su Arduino es un programa otro que el que usted publicó.
¿Qué sucede cuando prueba exactamente el mismo programa, pero con una fuente en serie conocida?
Por ejemplo,
en lugar de conectar Arduino D10 (su SoftwareSerial rxPin) a la radio, en lugar de eso, conecte D10 a Arduino D0 (los datos que escribe en el monitor de serie de su PC) y escriba algunas palabras.
¿Qué pasa entonces?
Tal vez el SoftwareSerial funciona bien con los datos normales de UART,
pero no puede manejar los fallos de alta frecuencia comunes en los receptores de radio de bajo costo.
En ese caso, tal vez sería mejor para
- (a) conecte el hardware de Arduino UART (D0 Rx y D1 Tx) a la radio, y el SoftwareSerial a su monitor serie de depuración. O
- (b) utiliza un hardware más sofisticado que recupera el reloj, etc., como el HopeRF RFM12B que se usa en el JeeNode y el Moteino, o
- (c) utiliza un software más sofisticado, como el protocolo que Roman Black inventó y describe en "Los módulos RF son fáciles" o el sistema de codificación de cambio de frecuencia desarrollado por Tom Boyd en "Detección de tren de pulsos con un Arduino" . li>
Algunos códigos de prueba:
#include <SoftwareSerial.h>
#define rxPin 10
#define txPin 11
SoftwareSerial rf(rxPin, txPin);
void setup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
Serial.begin(9600);
rf.begin(2400);
Serial.println("Hello, I was compiled " __DATE__ );
}
void loop() {
if( rf.available() ){
int incomingByte = rf.read();
Serial.print(incomingByte, DEC);
Serial.print(" ");
Serial.println( rf.available(), DEC);
}
}