USB Serial to physical UART pass through demo. - legacy mbed (no RTOS) - Interrupt mode + ring buffer on both VCP and UART, which can survive in press-test
main.cpp
- Committer:
- nightseas
- Date:
- 2018-09-14
- Revision:
- 0:b44aebdb4d65
File content as of revision 0:b44aebdb4d65:
#include "mbed.h" #include "USBSerial.h" #include "USBMSD.h" // Ring buffer for serial RX data - used by interrupt routines #define SERIAL_RX_BUFF_LEN 2047 // might need to increase buffer size for high baud rates char serial_rx_buffer[SERIAL_RX_BUFF_LEN+1]; // Ring buffer pointers // volatile makes read-modify-write atomic volatile int serial_rx_in_inx=0; volatile int serial_rx_out_inx=0; // might need to increase buffer size for high baud rates char vcp_rx_buffer[SERIAL_RX_BUFF_LEN+1]; // Ring buffer pointers // volatile makes read-modify-write atomic volatile int vcp_rx_in_inx=0; volatile int vcp_rx_out_inx=0; USBSerial vcp2; USBSerial vcp3; USBSerial vcp; RawSerial pc(SERIAL_TX, SERIAL_RX, 115200); DigitalOut led1(LED1), led2(LED2), led3(LED3); // Interupt Routine to read in data from serial port void vcp_rx_isr_handler( void ) { led2 = !led2; // Loop just in case more than one character is in UART's receive FIFO buffer // Stop if buffer full while( vcp.readable() && ( (vcp_rx_in_inx + 1) % SERIAL_RX_BUFF_LEN != vcp_rx_out_inx ) ) { vcp_rx_buffer[vcp_rx_in_inx] = vcp.getc(); vcp_rx_in_inx = (vcp_rx_in_inx + 1) % SERIAL_RX_BUFF_LEN; } return; } // Interupt Routine to read in data from serial port void serial_rx_isr_handler( void ) { led3 = !led3; // Loop just in case more than one character is in UART's receive FIFO buffer // Stop if buffer full while( pc.readable() && ( (serial_rx_in_inx + 1) % SERIAL_RX_BUFF_LEN != serial_rx_out_inx ) ) { serial_rx_buffer[serial_rx_in_inx] = pc.getc(); serial_rx_in_inx = (serial_rx_in_inx + 1) % SERIAL_RX_BUFF_LEN; } return; } int main(void) { pc.attach(&serial_rx_isr_handler, Serial::RxIrq); vcp.attach(&vcp_rx_isr_handler); pc.printf("\n\r\n\r\n\r========== USB Device Test ==========\n\r\n\r"); vcp.printf("\n\r\n\r\n\r========== USB Device Test ==========\n\r\n\r"); while (1) { while( serial_rx_in_inx != serial_rx_out_inx ) { vcp.putc(serial_rx_buffer[serial_rx_out_inx]); serial_rx_out_inx = (serial_rx_out_inx + 1) % SERIAL_RX_BUFF_LEN; led1 = !led1; } while( vcp_rx_in_inx != vcp_rx_out_inx ) { pc.putc(vcp_rx_buffer[vcp_rx_out_inx]); vcp_rx_out_inx = (vcp_rx_out_inx + 1) % SERIAL_RX_BUFF_LEN; led1 = !led1; } } }