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 Zoltan Hudak

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?

UserRevisionLine numberNew 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 }