UART 3 funcionando con interrupciones de Rx
Dependencies: mbed
main.cpp@4:e3357adeab6c, 2016-09-11 (annotated)
- Committer:
- fpapayannis
- Date:
- Sun Sep 11 15:06:27 2016 +0000
- Revision:
- 4:e3357adeab6c
- Parent:
- 3:c0f6dcd350a8
UART3 funcionando con Interrupciones de Lectura
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bcostm | 0:028fac66239d | 1 | #include "mbed.h" |
fpapayannis | 2:ba95dcca2d90 | 2 | #include "Serial.h" |
bcostm | 1:e9d1c42a73ae | 3 | |
fpapayannis | 2:ba95dcca2d90 | 4 | #define SERIAL_TX P0_10 |
fpapayannis | 2:ba95dcca2d90 | 5 | #define SERIAL_RX P0_11 |
fpapayannis | 2:ba95dcca2d90 | 6 | #define LEDStick P0_22 |
fpapayannis | 2:ba95dcca2d90 | 7 | |
bcostm | 0:028fac66239d | 8 | Serial pc(SERIAL_TX, SERIAL_RX); |
fpapayannis | 2:ba95dcca2d90 | 9 | DigitalOut myled(LEDStick); |
fpapayannis | 4:e3357adeab6c | 10 | |
fpapayannis | 4:e3357adeab6c | 11 | void Rx_interrupt(); |
fpapayannis | 4:e3357adeab6c | 12 | |
fpapayannis | 4:e3357adeab6c | 13 | |
fpapayannis | 4:e3357adeab6c | 14 | // Circular buffers for serial TX and RX data - used by interrupt routines |
fpapayannis | 4:e3357adeab6c | 15 | const int buffer_size = 255; |
fpapayannis | 4:e3357adeab6c | 16 | // might need to increase buffer size for high baud rates |
fpapayannis | 4:e3357adeab6c | 17 | //char tx_buffer[buffer_size+1]; |
fpapayannis | 4:e3357adeab6c | 18 | char rx_buffer[buffer_size+1]; |
fpapayannis | 4:e3357adeab6c | 19 | // Circular buffer pointers |
fpapayannis | 4:e3357adeab6c | 20 | // volatile makes read-modify-write atomic |
fpapayannis | 4:e3357adeab6c | 21 | //volatile int tx_in=0; |
fpapayannis | 4:e3357adeab6c | 22 | //volatile int tx_out=0; |
fpapayannis | 4:e3357adeab6c | 23 | volatile int rx_in=0; |
fpapayannis | 4:e3357adeab6c | 24 | volatile int rx_out=0; |
fpapayannis | 4:e3357adeab6c | 25 | // Line buffers for sprintf and sscanf |
fpapayannis | 4:e3357adeab6c | 26 | //char tx_line[80]; |
fpapayannis | 4:e3357adeab6c | 27 | //char rx_line[80]; |
bcostm | 0:028fac66239d | 28 | |
bcostm | 0:028fac66239d | 29 | int main() { |
fpapayannis | 4:e3357adeab6c | 30 | |
fpapayannis | 2:ba95dcca2d90 | 31 | pc.baud(9600); |
fpapayannis | 2:ba95dcca2d90 | 32 | pc.format(8,Serial::None,1); |
fpapayannis | 4:e3357adeab6c | 33 | |
fpapayannis | 4:e3357adeab6c | 34 | // Setup a serial interrupt function to receive data |
fpapayannis | 4:e3357adeab6c | 35 | pc.attach(&Rx_interrupt, Serial::RxIrq); |
fpapayannis | 4:e3357adeab6c | 36 | |
bcostm | 0:028fac66239d | 37 | pc.printf("Hello World !\n"); |
fpapayannis | 4:e3357adeab6c | 38 | while(1) |
fpapayannis | 4:e3357adeab6c | 39 | { |
fpapayannis | 4:e3357adeab6c | 40 | |
fpapayannis | 4:e3357adeab6c | 41 | if(rx_in) |
fpapayannis | 4:e3357adeab6c | 42 | { |
fpapayannis | 4:e3357adeab6c | 43 | pc.printf("%c",rx_buffer[rx_out]); |
fpapayannis | 4:e3357adeab6c | 44 | rx_out++; |
fpapayannis | 4:e3357adeab6c | 45 | if(rx_in==rx_out) |
fpapayannis | 4:e3357adeab6c | 46 | { |
fpapayannis | 4:e3357adeab6c | 47 | rx_in=0; |
fpapayannis | 4:e3357adeab6c | 48 | rx_out=0; |
fpapayannis | 4:e3357adeab6c | 49 | } |
fpapayannis | 4:e3357adeab6c | 50 | } |
fpapayannis | 4:e3357adeab6c | 51 | } |
bcostm | 0:028fac66239d | 52 | } |
fpapayannis | 4:e3357adeab6c | 53 | |
fpapayannis | 4:e3357adeab6c | 54 | |
fpapayannis | 4:e3357adeab6c | 55 | |
fpapayannis | 4:e3357adeab6c | 56 | // Interupt Routine to read in data from serial port |
fpapayannis | 4:e3357adeab6c | 57 | void Rx_interrupt() |
fpapayannis | 4:e3357adeab6c | 58 | { |
fpapayannis | 4:e3357adeab6c | 59 | if(pc.readable()) |
fpapayannis | 4:e3357adeab6c | 60 | { |
fpapayannis | 4:e3357adeab6c | 61 | rx_buffer[rx_in] = pc.getc(); |
fpapayannis | 4:e3357adeab6c | 62 | rx_in++; |
fpapayannis | 4:e3357adeab6c | 63 | } |
fpapayannis | 4:e3357adeab6c | 64 | if(rx_in==buffer_size) |
fpapayannis | 4:e3357adeab6c | 65 | pc.printf("Buffer excedido"); |
fpapayannis | 4:e3357adeab6c | 66 | return; |
fpapayannis | 4:e3357adeab6c | 67 | } |