UART repeater for FRDM-KL25

Dependencies:   USBDevice mbed

UART repeater for FRDM-KL25

Committer:
ohneta
Date:
Mon Jun 22 02:57:55 2015 +0000
Revision:
0:26f0a25e8be6
1st commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ohneta 0:26f0a25e8be6 1 //---------------------------------------------------------
ohneta 0:26f0a25e8be6 2 /**
ohneta 0:26f0a25e8be6 3 * FRDM-KL25Z用
ohneta 0:26f0a25e8be6 4 * UART -> USB Serial変換
ohneta 0:26f0a25e8be6 5 *
ohneta 0:26f0a25e8be6 6 * UART : UART1
ohneta 0:26f0a25e8be6 7 *
ohneta 0:26f0a25e8be6 8 * モード認識ポート : D0、D1、D2、D3
ohneta 0:26f0a25e8be6 9 * GND接続でON
ohneta 0:26f0a25e8be6 10 *
ohneta 0:26f0a25e8be6 11 * UART入力モード
ohneta 0:26f0a25e8be6 12 * D0=OFF, D1=OFF : スルー
ohneta 0:26f0a25e8be6 13 * D0=ON, D1=OFF : CR(0x0D, \r)を改行と認識する
ohneta 0:26f0a25e8be6 14 * D0=OFF, D1=ON : LF(0x0A, \n)を改行と認識する
ohneta 0:26f0a25e8be6 15 * D0=ON, D1=ON : CRとLFの両方とも改行と認識する
ohneta 0:26f0a25e8be6 16 *
ohneta 0:26f0a25e8be6 17 * USB Serial出力モード
ohneta 0:26f0a25e8be6 18 * D2=OFF, D3=OFF : スルー
ohneta 0:26f0a25e8be6 19 * D2=ON, D3=OFF : 改行ををCR(0x0D, \r)として出力する
ohneta 0:26f0a25e8be6 20 * D2=OFF, D3=ON : 改行ををLF(0x0A, \n)として出力する
ohneta 0:26f0a25e8be6 21 * D2=ON, D3=ON : 改行ををCR+LF(0x0D+0x0A, \r\n)として出力する
ohneta 0:26f0a25e8be6 22 *
ohneta 0:26f0a25e8be6 23 * 備考
ohneta 0:26f0a25e8be6 24 * USB Serialからの入力はスルー
ohneta 0:26f0a25e8be6 25 * モード認識ポートの利用の利便性を考えてそれぞれのポートの隣のポートを意図的にGNDにしてある。
ohneta 0:26f0a25e8be6 26 */
ohneta 0:26f0a25e8be6 27 //---------------------------------------------------------
ohneta 0:26f0a25e8be6 28
ohneta 0:26f0a25e8be6 29 #include "mbed.h"
ohneta 0:26f0a25e8be6 30 #include "USBSerial.h"
ohneta 0:26f0a25e8be6 31
ohneta 0:26f0a25e8be6 32 enum newline_mode {
ohneta 0:26f0a25e8be6 33 nlmode_none = 0x00, // 処理しない
ohneta 0:26f0a25e8be6 34 nlmode_cr = 0x01, // CRを出力
ohneta 0:26f0a25e8be6 35 nlmode_lf = 0x02, // LFを出力
ohneta 0:26f0a25e8be6 36 nlmode_crlf = 0x03, // CR+LFを出力
ohneta 0:26f0a25e8be6 37 };
ohneta 0:26f0a25e8be6 38
ohneta 0:26f0a25e8be6 39 //---------------------------------------------------------
ohneta 0:26f0a25e8be6 40 DigitalOut myled1(LED1);
ohneta 0:26f0a25e8be6 41 DigitalOut myled2(LED2);
ohneta 0:26f0a25e8be6 42 DigitalOut myled3(LED3);
ohneta 0:26f0a25e8be6 43
ohneta 0:26f0a25e8be6 44 DigitalOut nlInModeGnd0(PTC7);
ohneta 0:26f0a25e8be6 45 DigitalOut nlInModeGnd1(PTC0);
ohneta 0:26f0a25e8be6 46 DigitalOut nlOutModeGnd0(PTC3);
ohneta 0:26f0a25e8be6 47 DigitalOut nlOutModeGnd1(PTC4);
ohneta 0:26f0a25e8be6 48
ohneta 0:26f0a25e8be6 49 DigitalIn nlInModePin0(D0);
ohneta 0:26f0a25e8be6 50 DigitalIn nlInModePin1(D1);
ohneta 0:26f0a25e8be6 51 DigitalIn nlOutModePin0(D2);
ohneta 0:26f0a25e8be6 52 DigitalIn nlOutModePin1(D3);
ohneta 0:26f0a25e8be6 53
ohneta 0:26f0a25e8be6 54
ohneta 0:26f0a25e8be6 55 int inMode = nlmode_none;
ohneta 0:26f0a25e8be6 56 int outMode = nlmode_none;
ohneta 0:26f0a25e8be6 57
ohneta 0:26f0a25e8be6 58 USBSerial pc;
ohneta 0:26f0a25e8be6 59 Serial uart(D14, D15); // tx, rx
ohneta 0:26f0a25e8be6 60 Ticker flipper;
ohneta 0:26f0a25e8be6 61
ohneta 0:26f0a25e8be6 62 //---------------------------------------------------------
ohneta 0:26f0a25e8be6 63 /**
ohneta 0:26f0a25e8be6 64 *
ohneta 0:26f0a25e8be6 65 */
ohneta 0:26f0a25e8be6 66 void flip()
ohneta 0:26f0a25e8be6 67 {
ohneta 0:26f0a25e8be6 68 myled3 = !myled3;
ohneta 0:26f0a25e8be6 69 }
ohneta 0:26f0a25e8be6 70
ohneta 0:26f0a25e8be6 71 //---------------------------------------------------------
ohneta 0:26f0a25e8be6 72 /**
ohneta 0:26f0a25e8be6 73 *
ohneta 0:26f0a25e8be6 74 */
ohneta 0:26f0a25e8be6 75 void checkNlMode()
ohneta 0:26f0a25e8be6 76 {
ohneta 0:26f0a25e8be6 77 int inModePin0 = !nlInModePin0;
ohneta 0:26f0a25e8be6 78 int inModePin1 = !nlInModePin1;
ohneta 0:26f0a25e8be6 79 int outModePin0 = !nlOutModePin0;
ohneta 0:26f0a25e8be6 80 int outModePin1 = !nlOutModePin1;
ohneta 0:26f0a25e8be6 81
ohneta 0:26f0a25e8be6 82 inMode = (inModePin1 << 1) | inModePin0;
ohneta 0:26f0a25e8be6 83 outMode = (outModePin1 << 1) | outModePin0;
ohneta 0:26f0a25e8be6 84
ohneta 0:26f0a25e8be6 85 #if 0
ohneta 0:26f0a25e8be6 86 static char* modeString[] = { "nlmode_none", "nlmode_cr", "nlmode_lf", "nlmode_crlf" };
ohneta 0:26f0a25e8be6 87 pc.printf("[MODE: %x %x %x %x] => %s %s", inModePin0, inModePin1, outModePin0, outModePin1, modeString[inMode], modeString[outMode]);
ohneta 0:26f0a25e8be6 88 pc.printf("\r\n");
ohneta 0:26f0a25e8be6 89 wait(0.1);
ohneta 0:26f0a25e8be6 90 #endif
ohneta 0:26f0a25e8be6 91 }
ohneta 0:26f0a25e8be6 92
ohneta 0:26f0a25e8be6 93 //---------------------------------------------------------
ohneta 0:26f0a25e8be6 94 //---------------------------------------------------------
ohneta 0:26f0a25e8be6 95 /**
ohneta 0:26f0a25e8be6 96 *
ohneta 0:26f0a25e8be6 97 */
ohneta 0:26f0a25e8be6 98 int main()
ohneta 0:26f0a25e8be6 99 {
ohneta 0:26f0a25e8be6 100 myled1 = 1; myled2 = 1; myled3 = 1; wait(0.1);
ohneta 0:26f0a25e8be6 101 myled1 = 0; myled2 = 0; myled3 = 0; wait(0.1);
ohneta 0:26f0a25e8be6 102 myled1 = 1; myled2 = 1; myled3 = 1; wait(0.2);
ohneta 0:26f0a25e8be6 103 myled1 = 0; myled2 = 0; myled3 = 0; wait(0.2);
ohneta 0:26f0a25e8be6 104 myled1 = 1; myled2 = 1; myled3 = 1; wait(0.3);
ohneta 0:26f0a25e8be6 105 myled1 = 0; myled2 = 0; myled3 = 0; wait(0.3);
ohneta 0:26f0a25e8be6 106 myled1 = 1; myled2 = 1; myled3 = 1; wait(0.4);
ohneta 0:26f0a25e8be6 107 myled1 = 0; myled2 = 0; myled3 = 0; wait(0.4);
ohneta 0:26f0a25e8be6 108
ohneta 0:26f0a25e8be6 109 nlInModeGnd0 = 0;
ohneta 0:26f0a25e8be6 110 nlInModeGnd1 = 0;
ohneta 0:26f0a25e8be6 111 nlOutModeGnd0 = 0;
ohneta 0:26f0a25e8be6 112 nlOutModeGnd1 = 0;
ohneta 0:26f0a25e8be6 113
ohneta 0:26f0a25e8be6 114 flipper.attach(&flip, 0.5);
ohneta 0:26f0a25e8be6 115 wait(2);
ohneta 0:26f0a25e8be6 116 pc.printf("** serial repeater **\r\n");
ohneta 0:26f0a25e8be6 117 pc.printf("----------------\r\n");
ohneta 0:26f0a25e8be6 118
ohneta 0:26f0a25e8be6 119 bool nlFlag = false;
ohneta 0:26f0a25e8be6 120 while(1) {
ohneta 0:26f0a25e8be6 121 checkNlMode();
ohneta 0:26f0a25e8be6 122 nlFlag = false;
ohneta 0:26f0a25e8be6 123
ohneta 0:26f0a25e8be6 124 if (pc.available() > 0) {
ohneta 0:26f0a25e8be6 125 int c = pc.getc();
ohneta 0:26f0a25e8be6 126 uart.putc(c);
ohneta 0:26f0a25e8be6 127 myled1 = !myled1;
ohneta 0:26f0a25e8be6 128 }
ohneta 0:26f0a25e8be6 129
ohneta 0:26f0a25e8be6 130 if(uart.readable()) {
ohneta 0:26f0a25e8be6 131 int c = uart.getc();
ohneta 0:26f0a25e8be6 132
ohneta 0:26f0a25e8be6 133 if ((inMode == nlmode_cr) && (c == '\r')) {
ohneta 0:26f0a25e8be6 134 nlFlag = true;
ohneta 0:26f0a25e8be6 135 }
ohneta 0:26f0a25e8be6 136 if ((inMode == nlmode_lf) && (c == '\n')) {
ohneta 0:26f0a25e8be6 137 nlFlag = true;
ohneta 0:26f0a25e8be6 138 }
ohneta 0:26f0a25e8be6 139 // inModeには nlmode_crlfは存在しない -> cr/lfの両方を処理する
ohneta 0:26f0a25e8be6 140
ohneta 0:26f0a25e8be6 141 if (nlFlag) {
ohneta 0:26f0a25e8be6 142 if (outMode == nlmode_cr) {
ohneta 0:26f0a25e8be6 143 pc.putc('\r'); // CR
ohneta 0:26f0a25e8be6 144 } else if (outMode == nlmode_lf) {
ohneta 0:26f0a25e8be6 145 pc.putc('\n'); // LF
ohneta 0:26f0a25e8be6 146 } else if (outMode == nlmode_crlf) {
ohneta 0:26f0a25e8be6 147 pc.putc('\r'); // CR
ohneta 0:26f0a25e8be6 148 pc.putc('\n'); // LF
ohneta 0:26f0a25e8be6 149 }
ohneta 0:26f0a25e8be6 150 } else {
ohneta 0:26f0a25e8be6 151 pc.putc(c);
ohneta 0:26f0a25e8be6 152 }
ohneta 0:26f0a25e8be6 153 myled2 = !myled2;
ohneta 0:26f0a25e8be6 154 }
ohneta 0:26f0a25e8be6 155
ohneta 0:26f0a25e8be6 156 }
ohneta 0:26f0a25e8be6 157 }
ohneta 0:26f0a25e8be6 158 //---------------------------------------------------------