A USB to UART bridge

Dependencies:   USBDevice BufferedSerial mbed

Committer:
yihui
Date:
Wed Jul 23 09:40:47 2014 +0000
Revision:
3:2b4d2284bab0
Parent:
2:427b69ad737c
Child:
4:9c038f12d460
use ring buffers

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yihui 0:8c4eea221dcf 1 /**
yihui 0:8c4eea221dcf 2 * USB to UART Bridge
yihui 0:8c4eea221dcf 3 */
yihui 0:8c4eea221dcf 4
yihui 0:8c4eea221dcf 5 #include "mbed.h"
yihui 0:8c4eea221dcf 6 #include "USBSerial.h"
yihui 3:2b4d2284bab0 7 #include "Buffer.h"
yihui 0:8c4eea221dcf 8
yihui 0:8c4eea221dcf 9 Serial uart(USBTX, USBRX);
yihui 0:8c4eea221dcf 10 USBSerial pc;
yihui 2:427b69ad737c 11 DigitalOut led1(LED1);
yihui 2:427b69ad737c 12 DigitalOut led2(LED2);
yihui 2:427b69ad737c 13 DigitalOut led3(LED3);
yihui 3:2b4d2284bab0 14 DigitalOut led4(LED4);
yihui 3:2b4d2284bab0 15
yihui 3:2b4d2284bab0 16 Buffer <char> rxbuf;
yihui 3:2b4d2284bab0 17 Buffer <char> txbuf;
yihui 3:2b4d2284bab0 18
yihui 3:2b4d2284bab0 19 Ticker ticker;
yihui 3:2b4d2284bab0 20 volatile bool rxflag = false;
yihui 3:2b4d2284bab0 21 volatile bool txflag = false;
yihui 3:2b4d2284bab0 22
yihui 3:2b4d2284bab0 23
yihui 3:2b4d2284bab0 24 void indicate()
yihui 3:2b4d2284bab0 25 {
yihui 3:2b4d2284bab0 26 if (rxflag) {
yihui 3:2b4d2284bab0 27 led3 = !led3;
yihui 3:2b4d2284bab0 28 rxflag = false;
yihui 3:2b4d2284bab0 29 } else {
yihui 3:2b4d2284bab0 30 if (led3) {
yihui 3:2b4d2284bab0 31 led3 = 0;
yihui 3:2b4d2284bab0 32 }
yihui 3:2b4d2284bab0 33 }
yihui 3:2b4d2284bab0 34
yihui 3:2b4d2284bab0 35 if (txflag) {
yihui 3:2b4d2284bab0 36 led4 = !led4;
yihui 3:2b4d2284bab0 37 txflag = false;
yihui 3:2b4d2284bab0 38 } else {
yihui 3:2b4d2284bab0 39 if (led4) {
yihui 3:2b4d2284bab0 40 led4 = 0;
yihui 3:2b4d2284bab0 41 }
yihui 3:2b4d2284bab0 42 }
yihui 3:2b4d2284bab0 43 }
yihui 0:8c4eea221dcf 44
yihui 0:8c4eea221dcf 45 // Called by ISR
yihui 3:2b4d2284bab0 46 void settings_changed(int baud, int bits, int parity, int stop)
yihui 0:8c4eea221dcf 47 {
yihui 0:8c4eea221dcf 48 const Serial::Parity parityTable[] = {Serial::None, Serial::Odd, Serial::Even, Serial::Forced0, Serial::Forced1};
yihui 0:8c4eea221dcf 49
yihui 2:427b69ad737c 50
yihui 2:427b69ad737c 51 led1 = 1;
yihui 0:8c4eea221dcf 52 if (stop != 2) {
yihui 0:8c4eea221dcf 53 stop = 1; // stop bit(s) = 1 or 1.5
yihui 0:8c4eea221dcf 54 }
yihui 0:8c4eea221dcf 55 uart.baud(baud);
yihui 0:8c4eea221dcf 56 uart.format(bits, parityTable[parity], stop);
yihui 2:427b69ad737c 57 led1 = 0;
yihui 0:8c4eea221dcf 58 }
yihui 0:8c4eea221dcf 59
yihui 0:8c4eea221dcf 60 int main()
yihui 0:8c4eea221dcf 61 {
yihui 3:2b4d2284bab0 62 pc.attach(settings_changed);
yihui 3:2b4d2284bab0 63 ticker.attach_us(indicate, 10000);
yihui 0:8c4eea221dcf 64
yihui 0:8c4eea221dcf 65 while (1) {
yihui 0:8c4eea221dcf 66 while (uart.readable()) {
yihui 3:2b4d2284bab0 67 rxflag = true;
yihui 3:2b4d2284bab0 68 char r = uart.getc();
yihui 3:2b4d2284bab0 69 rxbuf.put(r);
yihui 0:8c4eea221dcf 70 }
yihui 0:8c4eea221dcf 71
yihui 3:2b4d2284bab0 72 while (txbuf.available() && uart.writeable()) {
yihui 3:2b4d2284bab0 73 txflag = true;
yihui 3:2b4d2284bab0 74 uart.putc(txbuf.get());
yihui 3:2b4d2284bab0 75 }
yihui 3:2b4d2284bab0 76
yihui 3:2b4d2284bab0 77 if (pc.readable()) {
yihui 3:2b4d2284bab0 78 char r = pc.getc();
yihui 3:2b4d2284bab0 79 txbuf.put(r);
yihui 3:2b4d2284bab0 80 }
yihui 3:2b4d2284bab0 81
yihui 3:2b4d2284bab0 82 if (rxbuf.available() && pc.writeable()) {
yihui 3:2b4d2284bab0 83 pc.putc(rxbuf.get());
yihui 0:8c4eea221dcf 84 }
yihui 0:8c4eea221dcf 85 }
yihui 0:8c4eea221dcf 86 }