![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
TELNET TO UART using STM32F103C8 generic board and ENC28J60. It is a very initial version with just for test program. Uses UIPEthernet Library courtesy of Zoltan hudak and Norbert Truchsess. Thanks
Dependencies: UIPEthernet mbed-STM32F103C8T6 mbed Adafruit_GFX
Fork of WebSwitch_ENC28J60 by
main.cpp@7:df33cd7ec9de, 2016-12-01 (annotated)
- Committer:
- neutron_striker
- Date:
- Thu Dec 01 11:42:27 2016 +0000
- Revision:
- 7:df33cd7ec9de
- Parent:
- 6:b38a3b476a45
- Child:
- 8:bb8aa896c7f5
Initial Commit of TELNET TO UART Test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hudakz | 5:0ab8292e37da | 1 | /* |
hudakz | 5:0ab8292e37da | 2 | * In this project LED1 on the mbed board is switched on/off using a web browser. |
hudakz | 5:0ab8292e37da | 3 | * However, you can easily modify the project to remotely switch on/off any external device. |
hudakz | 5:0ab8292e37da | 4 | * The HTTP server is built from an mbed board and an ENC28J60 board. |
hudakz | 5:0ab8292e37da | 5 | * ENC28J60 is driven by the UIPEthernet library <https://github.com/ntruchsess/arduino_uip>. |
hudakz | 4:d34811deedab | 6 | * The example is based on the Tuxgraphics Web Switch <http://www.tuxgraphics.org/>. |
hudakz | 0:68a0003c4cb8 | 7 | */ |
hudakz | 6:b38a3b476a45 | 8 | |
neutron_striker | 7:df33cd7ec9de | 9 | #define TARGET_STM32F103C8T6 1 // uncomment this line when using STM32F103C8T6 boards! |
hudakz | 6:b38a3b476a45 | 10 | |
hudakz | 6:b38a3b476a45 | 11 | #if defined(TARGET_STM32F103C8T6) |
hudakz | 6:b38a3b476a45 | 12 | #define LED_PIN PC_13 |
hudakz | 6:b38a3b476a45 | 13 | const int OFF = 1; |
hudakz | 6:b38a3b476a45 | 14 | const int ON = 0; |
hudakz | 6:b38a3b476a45 | 15 | #else |
hudakz | 6:b38a3b476a45 | 16 | #define LED_PIN LED1 |
hudakz | 6:b38a3b476a45 | 17 | const int OFF = 0; |
hudakz | 6:b38a3b476a45 | 18 | const int ON = 1; |
hudakz | 6:b38a3b476a45 | 19 | #endif |
hudakz | 6:b38a3b476a45 | 20 | |
hudakz | 6:b38a3b476a45 | 21 | #include "mbed.h" |
hudakz | 6:b38a3b476a45 | 22 | #include "UIPEthernet.h" |
hudakz | 6:b38a3b476a45 | 23 | #include "UIPServer.h" |
hudakz | 6:b38a3b476a45 | 24 | #include "UIPClient.h" |
hudakz | 6:b38a3b476a45 | 25 | #include "string" |
hudakz | 0:68a0003c4cb8 | 26 | |
hudakz | 5:0ab8292e37da | 27 | using namespace std; |
hudakz | 0:68a0003c4cb8 | 28 | |
neutron_striker | 7:df33cd7ec9de | 29 | Serial pc(PA_9, PA_10); // tx, rx |
hudakz | 6:b38a3b476a45 | 30 | |
hudakz | 6:b38a3b476a45 | 31 | #define DHCP 1 // if you'd like to use static IP address comment out this line |
hudakz | 6:b38a3b476a45 | 32 | |
hudakz | 0:68a0003c4cb8 | 33 | // UIPEthernet is the name of a global instance of UIPEthernetClass. |
hudakz | 0:68a0003c4cb8 | 34 | // Do not change the name! It is used within the UIPEthernet library. |
neutron_striker | 7:df33cd7ec9de | 35 | UIPEthernetClass UIPEthernet(PB_5, PB_4, PB_3, PB_6); // mosi, miso, sck, cs |
neutron_striker | 7:df33cd7ec9de | 36 | |
neutron_striker | 7:df33cd7ec9de | 37 | // However, make sure that it does not collide with any of the SPI pins |
neutron_striker | 7:df33cd7ec9de | 38 | // already used in the UIPEthernet(...) constructor above! |
neutron_striker | 7:df33cd7ec9de | 39 | // In this example we are turning on/off LED1. |
neutron_striker | 7:df33cd7ec9de | 40 | DigitalOut sw(LED_PIN); // Change LED_PIN to a pin of your choice. |
neutron_striker | 7:df33cd7ec9de | 41 | |
hudakz | 4:d34811deedab | 42 | |
hudakz | 5:0ab8292e37da | 43 | // If your board/plaform is not present yet then uncomment |
hudakz | 5:0ab8292e37da | 44 | // the following two lines and replace TARGET_YOUR_BOARD as appropriate. |
hudakz | 4:d34811deedab | 45 | |
hudakz | 5:0ab8292e37da | 46 | //#elif defined(TARGET_YOUR_BOARD) |
hudakz | 5:0ab8292e37da | 47 | //UIPEthernetClass UIPEthernet(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS); // mosi, miso, sck, cs |
hudakz | 4:d34811deedab | 48 | |
neutron_striker | 7:df33cd7ec9de | 49 | //#endif |
hudakz | 0:68a0003c4cb8 | 50 | |
hudakz | 4:d34811deedab | 51 | // Note: |
hudakz | 4:d34811deedab | 52 | // If it happends that any of the SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS pins collide with LED1 pin |
hudakz | 5:0ab8292e37da | 53 | // then either use different SPI port (if available on the board) and change the pin names |
hudakz | 5:0ab8292e37da | 54 | // in the constructor UIPEthernet(...) accordingly or instead of using LED1 pin, select |
hudakz | 5:0ab8292e37da | 55 | // a free pin (not used by SPI port) and connect to it an external LED which is connected |
hudakz | 5:0ab8292e37da | 56 | // to a 220 Ohm resitor that is connected to the groud. |
hudakz | 4:d34811deedab | 57 | // In the second case remember to replace LED1 in sw(LED1) constructor (see below). |
hudakz | 5:0ab8292e37da | 58 | // MAC number must be unique within the connected network. Modify as appropriate. |
hudakz | 5:0ab8292e37da | 59 | const uint8_t MY_MAC[6] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06 }; |
neutron_striker | 7:df33cd7ec9de | 60 | const uint16_t MY_PORT = 23; // for TELNET connection |
neutron_striker | 7:df33cd7ec9de | 61 | EthernetServer server = EthernetServer(MY_PORT); |
neutron_striker | 7:df33cd7ec9de | 62 | EthernetClient clients[4]; |
hudakz | 0:68a0003c4cb8 | 63 | |
neutron_striker | 7:df33cd7ec9de | 64 | void loop(); |
hudakz | 0:68a0003c4cb8 | 65 | |
neutron_striker | 7:df33cd7ec9de | 66 | typedef uint8_t byte; |
hudakz | 0:68a0003c4cb8 | 67 | |
neutron_striker | 7:df33cd7ec9de | 68 | int main(void) { |
neutron_striker | 7:df33cd7ec9de | 69 | |
neutron_striker | 7:df33cd7ec9de | 70 | pc.baud(57600); |
neutron_striker | 7:df33cd7ec9de | 71 | // pc.format(8,SerialBase::Even,1); |
neutron_striker | 7:df33cd7ec9de | 72 | pc.printf("Program begins\r\n"); |
hudakz | 0:68a0003c4cb8 | 73 | |
hudakz | 6:b38a3b476a45 | 74 | #if defined(DHCP) |
hudakz | 6:b38a3b476a45 | 75 | pc.printf("Searching for DHCP server..\r\n"); |
hudakz | 6:b38a3b476a45 | 76 | if(UIPEthernet.begin(MY_MAC) != 1) { |
hudakz | 6:b38a3b476a45 | 77 | pc.printf("No DHCP server found.\r\n"); |
hudakz | 6:b38a3b476a45 | 78 | pc.printf("Exiting application.\r\n"); |
hudakz | 6:b38a3b476a45 | 79 | return 0; |
hudakz | 6:b38a3b476a45 | 80 | } |
hudakz | 6:b38a3b476a45 | 81 | pc.printf("DHCP server found.\r\n"); |
hudakz | 6:b38a3b476a45 | 82 | #else |
hudakz | 6:b38a3b476a45 | 83 | // IP address must be unique and compatible with your network. |
hudakz | 6:b38a3b476a45 | 84 | const IPAddress MY_IP(192, 168, 1, 181); // Change as appropriate. |
hudakz | 5:0ab8292e37da | 85 | UIPEthernet.begin(MY_MAC, MY_IP); |
hudakz | 6:b38a3b476a45 | 86 | #endif |
hudakz | 6:b38a3b476a45 | 87 | IPAddress localIP = UIPEthernet.localIP(); |
hudakz | 6:b38a3b476a45 | 88 | pc.printf("Type "); |
hudakz | 6:b38a3b476a45 | 89 | for(uint8_t i = 0; i < 3; i++) |
hudakz | 6:b38a3b476a45 | 90 | pc.printf("%d.", localIP[i]); |
hudakz | 6:b38a3b476a45 | 91 | pc.printf("%d/secret/ into your web browser and hit ENTER\r\n", localIP[3]); |
neutron_striker | 7:df33cd7ec9de | 92 | server.begin(); |
neutron_striker | 7:df33cd7ec9de | 93 | while(1) |
neutron_striker | 7:df33cd7ec9de | 94 | { |
neutron_striker | 7:df33cd7ec9de | 95 | loop(); |
neutron_striker | 7:df33cd7ec9de | 96 | } |
neutron_striker | 7:df33cd7ec9de | 97 | |
neutron_striker | 7:df33cd7ec9de | 98 | } |
neutron_striker | 7:df33cd7ec9de | 99 | |
neutron_striker | 7:df33cd7ec9de | 100 | |
neutron_striker | 7:df33cd7ec9de | 101 | void clientPrint(char*, EthernetClient*); |
neutron_striker | 7:df33cd7ec9de | 102 | |
neutron_striker | 7:df33cd7ec9de | 103 | void loop() { |
neutron_striker | 7:df33cd7ec9de | 104 | // wait for a new client: |
neutron_striker | 7:df33cd7ec9de | 105 | EthernetClient client = server.available(); |
neutron_striker | 7:df33cd7ec9de | 106 | |
neutron_striker | 7:df33cd7ec9de | 107 | if (client) { |
hudakz | 0:68a0003c4cb8 | 108 | |
neutron_striker | 7:df33cd7ec9de | 109 | bool newClient = true; |
neutron_striker | 7:df33cd7ec9de | 110 | for (byte i=0;i<4;i++) { |
neutron_striker | 7:df33cd7ec9de | 111 | //check whether this client refers to the same socket as one of the existing instances: |
neutron_striker | 7:df33cd7ec9de | 112 | if (clients[i]==client) { |
neutron_striker | 7:df33cd7ec9de | 113 | newClient = false; |
neutron_striker | 7:df33cd7ec9de | 114 | break; |
neutron_striker | 7:df33cd7ec9de | 115 | } |
neutron_striker | 7:df33cd7ec9de | 116 | } |
hudakz | 0:68a0003c4cb8 | 117 | |
neutron_striker | 7:df33cd7ec9de | 118 | if (newClient) { |
neutron_striker | 7:df33cd7ec9de | 119 | //check which of the existing clients can be overridden: |
neutron_striker | 7:df33cd7ec9de | 120 | for (byte i=0;i<4;i++) { |
neutron_striker | 7:df33cd7ec9de | 121 | if (!clients[i] && clients[i]!=client) { |
neutron_striker | 7:df33cd7ec9de | 122 | clients[i] = client; |
neutron_striker | 7:df33cd7ec9de | 123 | // clead out the input buffer: |
neutron_striker | 7:df33cd7ec9de | 124 | client.flush(); |
neutron_striker | 7:df33cd7ec9de | 125 | // clead out the input buffer: |
neutron_striker | 7:df33cd7ec9de | 126 | client.flush(); |
neutron_striker | 7:df33cd7ec9de | 127 | pc.printf("We have a new client\r\n"); |
neutron_striker | 7:df33cd7ec9de | 128 | clientPrint("Hello Client\r\n",&client); |
neutron_striker | 7:df33cd7ec9de | 129 | clientPrint("my IP ",&client); |
neutron_striker | 7:df33cd7ec9de | 130 | //char localIP[]= UIPEthernet.localIP(); |
neutron_striker | 7:df33cd7ec9de | 131 | //client.write(localIP,strlen(localIP)); |
neutron_striker | 7:df33cd7ec9de | 132 | break; |
neutron_striker | 7:df33cd7ec9de | 133 | } |
neutron_striker | 7:df33cd7ec9de | 134 | } |
neutron_striker | 7:df33cd7ec9de | 135 | } |
hudakz | 0:68a0003c4cb8 | 136 | |
neutron_striker | 7:df33cd7ec9de | 137 | if (client.available() > 0) { |
neutron_striker | 7:df33cd7ec9de | 138 | // read the bytes incoming from the client: |
neutron_striker | 7:df33cd7ec9de | 139 | char thisChar = client.read(); |
neutron_striker | 7:df33cd7ec9de | 140 | // echo the bytes back to all other connected clients: |
neutron_striker | 7:df33cd7ec9de | 141 | for (byte i=0;i<4;i++) { |
neutron_striker | 7:df33cd7ec9de | 142 | if (clients[i] && clients[i]!=client) { |
neutron_striker | 7:df33cd7ec9de | 143 | clients[i].write(thisChar); |
neutron_striker | 7:df33cd7ec9de | 144 | } |
neutron_striker | 7:df33cd7ec9de | 145 | } |
neutron_striker | 7:df33cd7ec9de | 146 | // echo the bytes to the server as well: |
neutron_striker | 7:df33cd7ec9de | 147 | pc.putc(thisChar); |
neutron_striker | 7:df33cd7ec9de | 148 | } |
neutron_striker | 7:df33cd7ec9de | 149 | } |
neutron_striker | 7:df33cd7ec9de | 150 | for (byte i=0;i<4;i++) { |
neutron_striker | 7:df33cd7ec9de | 151 | if (!(clients[i].connected())) { |
neutron_striker | 7:df33cd7ec9de | 152 | // client.stop() invalidates the internal socket-descriptor, so next use of == will allways return false; |
neutron_striker | 7:df33cd7ec9de | 153 | clients[i].stop(); |
neutron_striker | 7:df33cd7ec9de | 154 | } |
neutron_striker | 7:df33cd7ec9de | 155 | } |
neutron_striker | 7:df33cd7ec9de | 156 | |
neutron_striker | 7:df33cd7ec9de | 157 | |
neutron_striker | 7:df33cd7ec9de | 158 | //This part is what I copied from ESP8266 WIFI TELNET example. |
neutron_striker | 7:df33cd7ec9de | 159 | //check UART for data |
neutron_striker | 7:df33cd7ec9de | 160 | if(pc.readable()){ |
neutron_striker | 7:df33cd7ec9de | 161 | /* |
neutron_striker | 7:df33cd7ec9de | 162 | size_t len = Serial.available(); |
neutron_striker | 7:df33cd7ec9de | 163 | uint8_t sbuf[len]; |
neutron_striker | 7:df33cd7ec9de | 164 | Serial.readBytes((char*)sbuf, len); |
neutron_striker | 7:df33cd7ec9de | 165 | */ |
neutron_striker | 7:df33cd7ec9de | 166 | char data_from_uart = pc.getc(); |
neutron_striker | 7:df33cd7ec9de | 167 | //push UART data to all connected telnet clients |
neutron_striker | 7:df33cd7ec9de | 168 | for(uint8_t i = 0; i < 4; i++){ |
neutron_striker | 7:df33cd7ec9de | 169 | if (clients[i] && clients[i].connected()){ |
neutron_striker | 7:df33cd7ec9de | 170 | clients[i].write(data_from_uart); |
neutron_striker | 7:df33cd7ec9de | 171 | wait(0.001); |
neutron_striker | 7:df33cd7ec9de | 172 | } |
neutron_striker | 7:df33cd7ec9de | 173 | } |
neutron_striker | 7:df33cd7ec9de | 174 | } |
neutron_striker | 7:df33cd7ec9de | 175 | |
neutron_striker | 7:df33cd7ec9de | 176 | } |
hudakz | 0:68a0003c4cb8 | 177 | |
neutron_striker | 7:df33cd7ec9de | 178 | void clientPrint(char * str, EthernetClient* client) |
neutron_striker | 7:df33cd7ec9de | 179 | {//TODO: make a member for client printf deriving from printf class |
neutron_striker | 7:df33cd7ec9de | 180 | uint8_t i=0; |
neutron_striker | 7:df33cd7ec9de | 181 | while(str[i]!='\0') |
neutron_striker | 7:df33cd7ec9de | 182 | { |
neutron_striker | 7:df33cd7ec9de | 183 | client->write((uint8_t)str[i]); |
neutron_striker | 7:df33cd7ec9de | 184 | i++; |
hudakz | 0:68a0003c4cb8 | 185 | } |
neutron_striker | 7:df33cd7ec9de | 186 | } |