Hello,
I have a nano using soft serial to communicate with an esp8266-01 module. I would use hardware serial but everything I've read says that connecting external hardware to the hardware serial pins can cause problems, so I opted for softSerial.
Baud rate on esp8266 and nano's softserial port is 9600.
Basically everything works as expected EXCEPT when sending text TO the nano over the softserial port FROM the esp8266.
Heres the breakdown:
Send text from serial monitor to esp8266 via USB to serial adapter in both directions ---> WORKS!
Send text from nano to esp8266 via nanos softserial port ---> WORKS!
Send text from esp8266 to nano using nanos softserial port ---> FAIL!
Here is the sketch running on the nano:
#include <Arduino.h>
#include <SoftwareSerial.h>
const int RX = 3;
const int TX = 4;
String serialData;
String softSerialData;
boolean serialReceived;
boolean softSerialReceived;
SoftwareSerial softSerial(RX, TX);
void sendSerials(String msg){
Serial.println(msg);
softSerial.println(msg);
}
void setup() {
Serial.begin(115200);
softSerial.begin(9600);
sendSerials("\nReady!");
}
void loop() {
if(softSerialReceived){
sendSerials("soft: " + softSerialData);
softSerialData="";
softSerialReceived=false;
}
if(serialReceived) {
sendSerials("hard: " + serialData);
serialData="";
serialReceived=false;
}
}
void serialEvent() {
while (Serial.available() > 0) {
char inChar = (char)Serial.read();
if (inChar == '\n') {
serialReceived = true;
}
else {
serialData += inChar;
}
}
while (softSerial.available() > 0) {
char inChar = (char)Serial.read();
if (inChar == '\n') {
softSerialReceived = true;
}
else {
softSerialData += inChar;
}
}
}
And here is the sketch running on the esp8266:
#include <SPI.h> // needed for Arduino versions later than 0018
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Arduino.h>
#include <BlockNot.h>
#ifndef STASSID
#define STASSID "Spanky24"
#define STAPSK "**********" //masked for forum posting
#endif
unsigned int rcvPort = 8787; // local port to listen on
unsigned int remotePort = 7878; // remote port to send on
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1]; //buffer to hold incoming packet,
boolean serialReceived;
boolean ping = false;
String serialData;
WiFiUDP udpRcv;
WiFiUDP udpSnd;
BlockNot rcvTimer = BlockNot(3000); //receive timeout timer after sending data over serial
BlockNot pingTimer = BlockNot(10000); //ping timer
IPAddress remoteIP = IPAddress(10,10,10,90); //my laptop running java UDP app
void serialEvent(void);
void sendUDP(String);
void processSerial(void);
void sendSerial(String msg){
Serial.println(""); //for some reason the data wont hit the serial port unless i do this first
Serial.println(msg); //This should be sending the data to the nanos softserial port but its not receiving it.
sendUDP("sent: "+msg);
}
void sendUDP(String message){
char msg[100];
message.toCharArray(msg,message.length()+1); //without +1 it cuts off last character
udpSnd.beginPacket(remoteIP,remotePort);
udpSnd.write(msg);
udpSnd.endPacket();
udpSnd.flush();
}
String getUDP(){
String response = "";
int packetSize = udpRcv.parsePacket();
if(packetSize > 0){
remoteIP = udpRcv.remoteIP();
int n = udpRcv.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
packetBuffer[n] = 0;
response = packetBuffer;
}
serialEvent(); //poll for serial data coming in
return response;
}
void setup() {
Serial.begin(9600);
WiFi.mode(WIFI_STA);
WiFi.begin(STASSID, STAPSK);
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.print("\nConnected! IP address: ");
Serial.println(WiFi.localIP());
Serial.print("UDP server on port "+String(rcvPort));
WiFi.setAutoReconnect(true);
WiFi.setAutoConnect(true);
WiFi.enableAP(false);
udpRcv.begin(rcvPort);
udpSnd.begin(remotePort);
sendUDP("Ready!");
}
void loop() {
static String response;
String inData = getUDP(); //check for data coming in over udp
boolean dataReceived = inData.length() > 1;
if(!dataReceived && serialReceived) processSerial();
else if(dataReceived) {
inData.toLowerCase();
if (inData.startsWith("setping")) ping = !ping; //toggle ping if master says so
else if (!inData.equals("")) {
rcvTimer.reset();
sendSerial(inData); // send the data down the serial port
while (!rcvTimer.done() && !serialReceived) { //wait for a response for three seconds
serialEvent();
if (serialReceived) sendUDP(serialData); //if we get response bounce it back to the sender
}
if (rcvTimer.done() && !serialReceived) { //let sender know that there was no response
sendUDP("no response");
}
serialData = ""; //clean house
serialReceived = false; // clean house
}
}
if(pingTimer.doneReset() && ping){ //if ping enabled, send one every 10 seconds (BlockNot timer)
response = "ping("+String(millis())+")";
sendUDP(response);
}
}
void processSerial() {
sendUDP(serialData); //Bounce serial data to UDP server
serialData = "";
serialReceived=false;
}
void serialEvent() {
if(!serialReceived) {
while (Serial.available()) {
char inChar = (char) Serial.read();
if (inChar == '\n') {
serialReceived = true;
} else {
serialData += inChar;
}
}
}
}
Any ideas?
Thank you,
Mike