UART 3 funcionando con interrupciones de Rx

Dependencies:   mbed

main.cpp

Committer:
fpapayannis
Date:
2016-09-11
Revision:
4:e3357adeab6c
Parent:
3:c0f6dcd350a8

File content as of revision 4:e3357adeab6c:

#include "mbed.h"
#include "Serial.h"

#define SERIAL_TX P0_10
#define SERIAL_RX P0_11
#define LEDStick P0_22

Serial pc(SERIAL_TX, SERIAL_RX);
DigitalOut myled(LEDStick);

void Rx_interrupt();


// Circular buffers for serial TX and RX data - used by interrupt routines
const int buffer_size = 255;
// might need to increase buffer size for high baud rates
//char tx_buffer[buffer_size+1];
char rx_buffer[buffer_size+1];
// Circular buffer pointers
// volatile makes read-modify-write atomic 
//volatile int tx_in=0;
//volatile int tx_out=0;
volatile int rx_in=0;
volatile int rx_out=0;
// Line buffers for sprintf and sscanf
//char tx_line[80];
//char rx_line[80];
 
int main() {

  pc.baud(9600);
  pc.format(8,Serial::None,1);
  
  // Setup a serial interrupt function to receive data
    pc.attach(&Rx_interrupt, Serial::RxIrq);
  
  pc.printf("Hello World !\n");
  while(1)
  { 
      
      if(rx_in)
      {
          pc.printf("%c",rx_buffer[rx_out]);
          rx_out++;
          if(rx_in==rx_out)
          {
            rx_in=0;
            rx_out=0;
            }
        }
}
}



// Interupt Routine to read in data from serial port
void Rx_interrupt()
{
        if(pc.readable())
        {
            rx_buffer[rx_in] = pc.getc();
            rx_in++;
        }
        if(rx_in==buffer_size)
            pc.printf("Buffer excedido");
    return;
}