Probablemente no estés haciendo nada malo, pero estás llegando a una limitación de la biblioteca.
NewSoftSerial deshabilita las interrupciones en la transmisión, para asegurar la sincronización limpia del byte transmitido. Cuando NSS recibe datos al detectar una interrupción en el pin de recepción, esa interrupción no se activa, lo que significa que no se recibe nada.
Como referencia, la función de escritura (byte) de NSS
void NewSoftSerial::write(uint8_t b)
{
//irrelevant code
uint8_t oldSREG = SREG;
cli(); // turn off interrupts for a clean txmit
// Write the start bit
tx_pin_write(_inverse_logic ? HIGH : LOW);
tunedDelay(_tx_delay + XMIT_START_ADJUSTMENT);
//code to send a byte, omitted for brevity
SREG = oldSREG; // turn interrupts back on
tunedDelay(_tx_delay);
}
Y la función de grabación:
void NewSoftSerial::recv()
{
uint8_t d = 0;
// If RX line is high, then we don't see any start bit
// so interrupt is probably not for us
if (_inverse_logic ? rx_pin_read() : !rx_pin_read())
{
// Wait approximately 1/2 of a bit width to "center" the sample
tunedDelay(_rx_delay_centering);
// Read each of the 8 bits
for (uint8_t i=0x1; i; i <<= 1)
{
tunedDelay(_rx_delay_intrabit);
uint8_t noti = ~i;
if (rx_pin_read())
d |= i;
else // else clause added to ensure function timing is ~balanced
d &= noti;
}
// skip the stop bit
tunedDelay(_rx_delay_stopbit);
//buffer code omitted
}
}
Dos cosas a tener en cuenta: ambas rutinas asumen que tendrán control al enviar / recibir. Básicamente, NSS es semidúplex, sin lectura y escritura simultáneas.
Si desea probarlo, lo que podría hacer es atar el pin RX del arduino (pin 0 creo ; será TX del chip serial USB) al RX de NSS. Lo que esto hará es que cualquier información proveniente de USB serial se enviará a Serial y NSS. A continuación, puede transmitir los datos recibidos del NSS utilizando Serial. Debería funcionar, pero no ha sido probado.