demonstration of using serial port as console/terminal

Dependencies:   mbed

Demonstration of using serial port with a dumb terminal. Such as teraterm. This example uses serial port at 57600bps.

purpose

provide quick/easy user interface.

features

  • backspace key stops at start of line
  • <enter> on empty line repeats last command
  • Ctrl-C can be used to abort something

teraterm console

reset
> ?
.       print status
led     toggle LED
da<%d>  get/set my_data
> .
LED1:0
my_data:0
> led
> .
LED1:1
my_data:0
> da
data:0
> da1337
data:1337
> .
LED1:1
my_data:1337
> led
>
>
>
>
Committer:
dudmuck
Date:
Thu Nov 06 02:58:50 2014 +0000
Revision:
0:9a142eb22e83
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:9a142eb22e83 1 #include "mbed.h"
dudmuck 0:9a142eb22e83 2
dudmuck 0:9a142eb22e83 3 Serial pc(USBTX, USBRX);
dudmuck 0:9a142eb22e83 4 char pcbuf[64];
dudmuck 0:9a142eb22e83 5
dudmuck 0:9a142eb22e83 6 DigitalOut myled(LED1);
dudmuck 0:9a142eb22e83 7
dudmuck 0:9a142eb22e83 8 uint16_t my_data;
dudmuck 0:9a142eb22e83 9
dudmuck 0:9a142eb22e83 10 void service_something()
dudmuck 0:9a142eb22e83 11 {
dudmuck 0:9a142eb22e83 12 /* poll something while waiting for keyboard */
dudmuck 0:9a142eb22e83 13 }
dudmuck 0:9a142eb22e83 14
dudmuck 0:9a142eb22e83 15 int get_kbd_str(char* buf, int size)
dudmuck 0:9a142eb22e83 16 {
dudmuck 0:9a142eb22e83 17 char c;
dudmuck 0:9a142eb22e83 18 int i;
dudmuck 0:9a142eb22e83 19 static int prev_len;
dudmuck 0:9a142eb22e83 20
dudmuck 0:9a142eb22e83 21 for (i = 0;;) {
dudmuck 0:9a142eb22e83 22 if (pc.readable()) {
dudmuck 0:9a142eb22e83 23 c = pc.getc();
dudmuck 0:9a142eb22e83 24 if (c == 8) { // backspace
dudmuck 0:9a142eb22e83 25 if (i > 0) {
dudmuck 0:9a142eb22e83 26 pc.putc(8);
dudmuck 0:9a142eb22e83 27 pc.putc(' ');
dudmuck 0:9a142eb22e83 28 pc.putc(8);
dudmuck 0:9a142eb22e83 29 i--;
dudmuck 0:9a142eb22e83 30 }
dudmuck 0:9a142eb22e83 31 } else if (c == '\r') {
dudmuck 0:9a142eb22e83 32 if (i == 0) {
dudmuck 0:9a142eb22e83 33 return prev_len; // repeat previous
dudmuck 0:9a142eb22e83 34 } else {
dudmuck 0:9a142eb22e83 35 buf[i] = 0; // null terminate
dudmuck 0:9a142eb22e83 36 prev_len = i;
dudmuck 0:9a142eb22e83 37 return i;
dudmuck 0:9a142eb22e83 38 }
dudmuck 0:9a142eb22e83 39 } else if (c == 3) {
dudmuck 0:9a142eb22e83 40 // ctrl-C abort
dudmuck 0:9a142eb22e83 41 return -1;
dudmuck 0:9a142eb22e83 42 } else if (i < size) {
dudmuck 0:9a142eb22e83 43 buf[i++] = c;
dudmuck 0:9a142eb22e83 44 pc.putc(c);
dudmuck 0:9a142eb22e83 45 }
dudmuck 0:9a142eb22e83 46 } else {
dudmuck 0:9a142eb22e83 47 service_something();
dudmuck 0:9a142eb22e83 48 }
dudmuck 0:9a142eb22e83 49 } // ...for()
dudmuck 0:9a142eb22e83 50 }
dudmuck 0:9a142eb22e83 51
dudmuck 0:9a142eb22e83 52 void
dudmuck 0:9a142eb22e83 53 print_status()
dudmuck 0:9a142eb22e83 54 {
dudmuck 0:9a142eb22e83 55 printf("LED1:%d\r\n", myled.read());
dudmuck 0:9a142eb22e83 56 printf("my_data:%d\n", my_data);
dudmuck 0:9a142eb22e83 57 }
dudmuck 0:9a142eb22e83 58
dudmuck 0:9a142eb22e83 59 void console()
dudmuck 0:9a142eb22e83 60 {
dudmuck 0:9a142eb22e83 61 int len, n;
dudmuck 0:9a142eb22e83 62
dudmuck 0:9a142eb22e83 63 len = get_kbd_str(pcbuf, sizeof(pcbuf));
dudmuck 0:9a142eb22e83 64 if (len < 0) {
dudmuck 0:9a142eb22e83 65 printf("abort\r\n");
dudmuck 0:9a142eb22e83 66 return;
dudmuck 0:9a142eb22e83 67 }
dudmuck 0:9a142eb22e83 68
dudmuck 0:9a142eb22e83 69 printf("\r\n");
dudmuck 0:9a142eb22e83 70 if (len == 1) {
dudmuck 0:9a142eb22e83 71 /* single character handling */
dudmuck 0:9a142eb22e83 72 switch (pcbuf[0]) {
dudmuck 0:9a142eb22e83 73 case '?':
dudmuck 0:9a142eb22e83 74 printf(". print status\r\n");
dudmuck 0:9a142eb22e83 75 printf("led toggle LED\r\n");
dudmuck 0:9a142eb22e83 76 printf("da<%%d> get/set my_data\r\n");
dudmuck 0:9a142eb22e83 77 break;
dudmuck 0:9a142eb22e83 78 case '.':
dudmuck 0:9a142eb22e83 79 print_status();
dudmuck 0:9a142eb22e83 80 break;
dudmuck 0:9a142eb22e83 81 } // ...switch (pcbuf[0])
dudmuck 0:9a142eb22e83 82 } else if (pcbuf[0] == 'l' && pcbuf[1] == 'e' && pcbuf[2] == 'd') {
dudmuck 0:9a142eb22e83 83 if (myled.read()) // invert LED state
dudmuck 0:9a142eb22e83 84 myled = 0;
dudmuck 0:9a142eb22e83 85 else
dudmuck 0:9a142eb22e83 86 myled = 1;
dudmuck 0:9a142eb22e83 87 } else if (pcbuf[0] == 'd' && pcbuf[1] == 'a') {
dudmuck 0:9a142eb22e83 88 if (pcbuf[2] >= '0' && pcbuf[2] <= '9') {
dudmuck 0:9a142eb22e83 89 sscanf(pcbuf+2, "%d", &n);
dudmuck 0:9a142eb22e83 90 my_data = n; // set user data
dudmuck 0:9a142eb22e83 91 }
dudmuck 0:9a142eb22e83 92 printf("data:%d\r\n", my_data); // show current value;
dudmuck 0:9a142eb22e83 93 }
dudmuck 0:9a142eb22e83 94
dudmuck 0:9a142eb22e83 95 printf("> ");
dudmuck 0:9a142eb22e83 96 fflush(stdout);
dudmuck 0:9a142eb22e83 97 }
dudmuck 0:9a142eb22e83 98
dudmuck 0:9a142eb22e83 99 int main()
dudmuck 0:9a142eb22e83 100 {
dudmuck 0:9a142eb22e83 101 pc.baud(57600);
dudmuck 0:9a142eb22e83 102 printf("\r\nreset\r\n");
dudmuck 0:9a142eb22e83 103
dudmuck 0:9a142eb22e83 104 printf("> ");
dudmuck 0:9a142eb22e83 105 fflush(stdout);
dudmuck 0:9a142eb22e83 106
dudmuck 0:9a142eb22e83 107 while (1) {
dudmuck 0:9a142eb22e83 108 console();
dudmuck 0:9a142eb22e83 109 }
dudmuck 0:9a142eb22e83 110 }