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

Dependencies:   USBDevice mbed

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;
        }
    }
}