/**** This version is ported by Atadiat to work on ESP8266 (tested on NodeMCU 1.0) ****/ /**** Porting was done by Yahya Tawil****/ // ESP8266 WiFi <-> 2x UART Bridge // by AlphaLima // www.LK8000.com // Disclaimer: Don't use for life support systems // or any other situations where system failure may affect // user or environmental safety. #include // config: //////////////////////////////////////////////////////////// #ifndef STASSID #define STASSID "" #define STAPSK "" #endif // NETWORK: Static IP details... IPAddress ip(192, 168, 0, 65); IPAddress gateway(192, 168, 0, 1); IPAddress subnet(255, 255, 255, 0); /************************* COM Port 0 *******************************/ //#define UART_BAUD0 115200 // Baudrate UART0 #define UART_BAUD0 9600 // Baudrate UART0 #define SERIAL_PARAM0 SERIAL_8N1 // Data/Parity/Stop UART0 #define SERIAL0_TCP_PORT 8880 // Wifi Port UART0 /************************* COM Port 1 *******************************/ #define UART_BAUD1 115200 // Baudrate UART1 //#define UART_BAUD1 9600 // Baudrate UART1 #define SERIAL_PARAM1 SERIAL_8N1 // Data/Parity/Stop UART1 #define SERIAL1_TCP_PORT 8881 // Wifi Port UART1 ////////////////////////////////////////////////////////////////////////// #define bufferSize 1024 #define MAX_NMEA_CLIENTS 1 #define DEBUG_COM 0 // debug output to COM 0 #define VERSION "1.10" ////////////////////////////////////////////////////////////////////////// #define NUM_COM 2 #define MODE_STA // ESP connects to WiFi router #define PROTOCOL_TCP bool debug = true; // For STATION mode: #ifdef MODE_STA const char *ssid = STASSID; // Your ROUTER SSID const char *pw = STAPSK; // and WiFi PASSWORD #endif //////////////////////////////////////////////////////////////////////////// // To support printing const char *swversion = VERSION; const int uart_baud0 = UART_BAUD0; const int uart_baud1 = UART_BAUD1; //////////////////////////////////////////////////////////////////////////// #ifdef PROTOCOL_TCP #include WiFiServer server_0(SERIAL0_TCP_PORT); WiFiServer server_1(SERIAL1_TCP_PORT); WiFiServer *server[NUM_COM] = {&server_0, &server_1}; WiFiClient TCPClient[NUM_COM][MAX_NMEA_CLIENTS]; #endif HardwareSerial* COM[NUM_COM] = {&Serial, &Serial1}; uint8_t buf1[NUM_COM][bufferSize]; uint16_t i1[NUM_COM] = {0,0}; uint8_t buf2[bufferSize]; uint16_t i2[NUM_COM] = {0,0}; ////////////////////////////////////////////////////////////////////////// /*** Setup ***/ ////////////////////////////////////////////////////////////////////////// void setup() { delay(500); COM[0]->begin(UART_BAUD0, SERIAL_PARAM0, SERIAL_FULL); COM[1]->begin(UART_BAUD1, SERIAL_PARAM1, SERIAL_FULL); if (debug) COM[DEBUG_COM]->print("\n\nLK8000 WiFi serial bridge "); if (debug) COM[DEBUG_COM]->println(swversion); #ifdef MODE_STA if (debug) COM[DEBUG_COM]->println("Open ESP Station mode"); if (debug) COM[DEBUG_COM]->print("IP Address "); if (debug) COM[DEBUG_COM]->println(ip); if (debug) COM[DEBUG_COM]->print("Gateway Address "); if (debug) COM[DEBUG_COM]->println(gateway); if (debug) COM[DEBUG_COM]->print("Subnet Mask "); if (debug) COM[DEBUG_COM]->println(subnet); // STATION mode (ESP connects to router and gets an IP) // Assuming controller is also connected to that router // from RoboRemo you must connect to the IP of the ESP WiFi.mode(WIFI_STA); WiFi.config(ip, gateway, subnet); if (debug) COM[DEBUG_COM]->print("try to Connect to Wireless network: "); WiFi.begin(ssid, pw); if (debug) COM[DEBUG_COM]->println(ssid); while (WiFi.status() != WL_CONNECTED) { delay(500); if (debug) COM[DEBUG_COM]->print("."); } if (debug) COM[DEBUG_COM]->println("\nWiFi connected"); #endif #ifdef PROTOCOL_TCP if (debug) COM[DEBUG_COM]->print("Starting TCP Server 1 "); if (debug) COM[DEBUG_COM]->println(SERIAL0_TCP_PORT); if (debug) COM[DEBUG_COM]->print("Baud Rate "); if (debug) COM[DEBUG_COM]->println(uart_baud0); server[0]->begin(); // start TCP server server[0]->setNoDelay(true); if (debug) COM[DEBUG_COM]->print("Starting TCP Server 2 "); if (debug) COM[DEBUG_COM]->println(SERIAL1_TCP_PORT); if (debug) COM[DEBUG_COM]->print("Baud Rate "); if (debug) COM[DEBUG_COM]->println(uart_baud1); server[1]->begin(); // start TCP server server[1]->setNoDelay(true); #endif if (debug) COM[DEBUG_COM]->println(); if (debug) COM[DEBUG_COM]->print("connected, address="); if (debug) COM[DEBUG_COM]->println(WiFi.localIP()); } // End Setup ////////////////////////////////////////////////////////////////////////// void loop() { #ifdef PROTOCOL_TCP for (int num = 0; num < NUM_COM ; num++) { if (server[num]->hasClient()) { for (byte i = 0; i < MAX_NMEA_CLIENTS; i++) { //find free/disconnected spot if (!TCPClient[num][i] || !TCPClient[num][i].connected()) { if (TCPClient[num][i]) TCPClient[num][i].stop(); TCPClient[num][i] = server[num]->available(); if (debug) COM[DEBUG_COM]->print("New client for COM"); if (debug) COM[DEBUG_COM]->print(num); if (debug) COM[DEBUG_COM]->print('/'); if (debug) COM[DEBUG_COM]->println(i); continue; } } //no free/disconnected spot so reject WiFiClient TmpserverClient = server[num]->available(); TmpserverClient.stop(); } } #endif for (int num = 0; num < NUM_COM ; num++) { if (COM[num] != NULL) { for (byte cln = 0; cln < MAX_NMEA_CLIENTS; cln++) { if (TCPClient[num][cln]) { while (TCPClient[num][cln].available()) { buf1[num][i1[num]] = TCPClient[num][cln].read(); // read char from client (LK8000 app) if (i1[num] < bufferSize - 1) i1[num]++; } COM[num]->write(buf1[num], i1[num]); // now send to UART(num): // if (debug) COM[DEBUG_COM]->write(buf1[num], i1[num]); // now send to UART(num): i1[num] = 0; } } if (COM[num]->available()) { String myString[NUM_COM] ; while (COM[num]->available()) { myString[num] += (char)Serial.read(); // read char from UART(num) } // now send to WiFi: for(byte cln = 0; cln < MAX_NMEA_CLIENTS; cln++) { if (debug) COM[DEBUG_COM]->print(myString[num]); if(TCPClient[num][cln]) TCPClient[num][cln].print(myString[num]); } i2[num] = 0; } } } }