Tengo el siguiente código ejecutándose en un atmega328 (ArduinoUno).
#include <stdint.h>
#include <avr/interrupt.h>
#include <stdbool.h>
#include <util/delay.h>
volatile bool receiveQ = true;
volatile bool transmitQ = true;
ISR(USART_RX_vect)
{
uint8_t byte = UDR0;
if( !receiveQ && byte != 19)
{
return;
}
switch ( byte)
{
case 19:
receiveQ = true;
transmitQ = false;
break;
case 17:
receiveQ = false;
transmitQ = true;
break;
// process incoming data
default:
break;
}
}
void transmitByte(uint8_t byte)
{
while( !(UCSR0A & 1 << UDRE0));
UDR0 = byte;
}
void transmitString(char *pstr)
{
while( *pstr != 0)
{
transmitByte(*pstr);
pstr++;
}
}
int main(void)
{
UBRR0H = 0;
UBRR0L = 103;
UCSR0C |= 1 << UCSZ01 | 1 << UCSZ00;
UCSR0B |= 1 << RXEN0 | 1 << TXEN0 | 1 << RXCIE0;
sei();
while( 1)
{
if( transmitQ)
{
transmitByte(19);
transmitString("data");
transmitByte(17);
transmitQ = false;
};
_delay_ms(1000);
}
return 0;
}
Quiero que implemente XOnXOff handshaking, y mi pregunta es si lo estoy haciendo correctamente.
Cuando configuro la comunicación con PuTTY, primero veo los "datos" que envía el Arduino. Luego envío XOff (Ctrl + S), algunos datos y XOn (Ctrl + Q), después de lo cual el Arduino envía los siguientes "datos". Y puedo seguir haciendo esto una y otra vez.
LarazónporlaquemepreguntosiestoyhaciendoestocorrectamenteesporquetengoqueenviarmanualmentelosbytesXOffyXOndePuTTYcuandotransmitodatos,aunqueheestablecidoelcontroldeflujocomoXOnXOff.
Sin embargo, PuTTY elimina los bytes XOff y XOn y solo proporciona "datos" cuando recibe datos.
Actualizar
El secnario es para control de retroalimentación en tiempo real. Durante cada período de tiempo, la entrada en serie al atmega328 es la señal de referencia. (Si no se reciben datos nuevos, utiliza los datos anteriores). La salida en serie del atmega328 es el valor del sensor (que también utiliza el controlador). Estoy usando los caracteres XOn y XOff para indicar cuándo debo comenzar a enviar los datos. y cuando se complete la transmisión.