Software UART / Software Serial / SoftUart for ESP8266 to connect more than one UART
This library is very similar to the Arduino SoftSerial. It can be used to connect multiple GPIO's of the ESP8266 to UARTs.
No: If you want to use a library for Arduino with ESP8266 (https://github.com/esp8266/Arduino), consider https://github.com/plerup/espsoftwareserial
This library is just a plain C library, which you can include in your esp8266 sdk code (or with some modifications even in your Arduino code).
If there are any problems, please add issues and pull requests!
- Download this code
- Edit Makefile and change the Paths to your location of the sdk and compiler
XTENSA_TOOLS_ROOT ?= /home/main/esp8266/esp-open-sdk/xtensa-lx106-elf/bin
SDK_BASE ?= /home/main/esp8266/esp-open-sdk/sdk
ESPTOOL ?= /home/main/esp8266/esp-open-sdk/esptool/esptool.py
ESPPORT ?= /dev/ttyUSB0
- run
make clean && make
- connect your esp8266 in flash mode to your computer
- run
make flash
- connect UART (e.g. of computer) to rx and tx of the esp at 9600 baud, you shoud see some dots '...'
- connect UART (e.g. of computer) like this: rx -> PIN 12, tx -> PIN 14 and you should see some output like 'oneoneone'
- connect UART (e.g. of computer) like this: rx -> PIN 5, tx -> PIN 4 and you should see some output like '2222'
- start changing the example code
When you connect a software tx with a software rx (wire from pin tx to pin rx), the rx will not receive the data because of timing issues.
If you use an external tx source, e.g. your computer, then rx will work (at least up to 38400 reliable).
Downlaod code and include folder 'softuart' in your project
Minimal example of how to setup one Softuart and send and receive some data:
#include "softuart.h"
//create global softuart instance
Softuart softuart;
//somewhere in a setup funciton e.g.
void ICACHE_FLASH_ATTR user_init()
{
//init software uart
Softuart_SetPinRx(&softuart,14);
Softuart_SetPinTx(&softuart,12);
//startup
Softuart_Init(&softuart,9600);
}
//to send a string use
Softuart_Puts(&softuart,"one");
//to send one character use
Softuart_Putchar(&softuart,0x84); //will send a T
//to receive characters use
uint8_t buf;
if(Softuart_Available(&softuart)) {
buf = Softuart_Read(&softuart);
os_printf("Softuart received: %c\r\n", buf);
}
//create global softuart instance
Softuart softuart;
Softuart softuart2;
//in some setup function:
//init first softuart
Softuart_SetPinRx(&softuart,14);
Softuart_SetPinTx(&softuart,12);
//startup
Softuart_Init(&softuart,9600);
//init second uart
Softuart_SetPinRx(&softuart2,4);
Softuart_SetPinTx(&softuart2,5);
//startup
Softuart_Init(&softuart2,9600);
...
//to send a string to softuart one use
Softuart_Puts(&softuart,"one");
//to send a string to the second softuart use
Softuart_Puts(&softuart2,"two");
This library can be used to send data over a RS485 interface. To convert the signla, e.g. a MAX485 can be used. The rx and tx of the MAX485 are connected to the rx and tx of the esp8266 softuart pins. The additional pin to enable tx on the MAX485 chip will be connected to another GPIO of the esp82666, e.g. 13.
Just add this code after the normal initialization: Softuart_EnableRs485(&softuart, 13);
Then every time when the softuart wants to send some characters, it first enables the rs485 send (control pin HIGH) and after the character it will disable it again (control pin LOW).
Example code:
//create global softuart instance
Softuart softuart;
//in some setup function:
//init first softuart
Softuart_SetPinRx(&softuart,14);
Softuart_SetPinTx(&softuart,12);
//startup
Softuart_Init(&softuart,9600);
//addtional (for RS485)
//enable rs485 support
//set pin 13 as output to control tx enable/disable of rs485 driver
Softuart_EnableRs485(&softuart, 13);
...
//to send a string to softuart one use
Softuart_Puts(&softuart,"one");
//to send a string to the second softuart use
Softuart_Puts(&softuart2,"two");
Please contribute to this project and add issues / pull requests when you find any problems :)