• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
ESP8266 - UART - odbiór danych
#1
Witam.
Od kilku dni borykam się z następującym problemem. Chce przesłać char'a z Nucleo do ESP8266 ( posiadam taki model ). Kod od strony Nucleo działa bez zarzutów. Mam problem z ESP. Oto mój kod dla ESP:
Kod:
#include <SoftwareSerial.h>

SoftwareSerial mySerial(D0, D1); // RX, TX

void setup() {

 Serial.begin(9600);
 Serial.println("WITAM");
 mySerial.begin(115200);
}

void loop()
{  
 
 if (mySerial.available()) {
   Serial.println("ZACZYNAM:");
   Serial.write(mySerial.read());
 }
 delay(1000);
}
A dla Nucleo:
Kod:
#include "mbed.h"


Serial device(PA_2, PA_3);
Serial pc(USBTX, USBRX); // tx, rx

int main() {
   
       device.baud(115200);
       
       while(1)
       {
           device.printf("a");
           pc.printf("\n\r");
           wait(3);  
       }
       
   
}

GND połączone, TX i RX na przemian, nie mam pojęcia co jest źle.

Proszę o pomoc i wskazówkę. Pozdrawiam
 
Odpowiedź
#2
Witam. Wywal delay z odbiornika ESP, zdefiniuj softserial na innych pinach niż hardwarowy serial, bo wydaje się, że odpalasz softwarowy na hardwarowym. Niestety te płytki są różnie opisane, na "Wemos D1"  są oznaczenia, że D0 i D1 to właśnie RX/TX hardwarowy (taka jest fotka w załączonym linku przez Ciebie), znalazłem też inne, gdzie TX/RX występują obok D0 i D1 - nie wiem czy jako faktycznie inne piny czy jako zdublowane. Najlepiej wgraj program tak by odczytywał faktycznie hardwarowym z Nucelo, a odpal sobie drugi hardwarowy (TX1 jest na pinie D9, GPIO2) i nim wysyłaj na przejściówkę USB/UART do PC. Nie powinien ESP w tej opcji być zasilany z USB, najlepiej zasilić go niezależnie i połączyć GND do nucleo. Gdybym miał też wybierać gdzie jaka prędkość to większą ustawiłbym na hardwarowy, mniejszą na softwarowy UART, tak samo mając wybór którym odbierać/którym wysyłać to hardwarowy do odbierania (bufor, przerwanie sprzętowe), softwarowy do wysyłania.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Dziękuje za odpowiedź.
Zmieniając SoftwareSerial mySerial(D0, D1) na (D2, D3) wyrażenie mySerial.available() ma wartość false, co wydaje mi się nie zbyt dobre. Spróbowałem też zewnętrznego zasilania, niestety nie pomogło.
Dodam, że gdy próbowałem pisać to w LUA, takie połączenie działało, problem był z zawieszaniem sie ESP, dlatego przerzuciłem się na Arduino IDE.
 
Odpowiedź
#4
Zrobiłem to u siebie. Płytka Wemos D1 podłączona do USB komputera i na terminal Arduino wypisuję dane z serial. Przejściówkę FTDI podłączyłem (3.3V) do soft serial D3/D4 + GDN. Kod jak poniżej. Działa.
Kod:
#include <SoftwareSerial.h>

SoftwareSerial mySerial(D3, D4); // RX, TX

void setup() {

Serial.begin(9600);
Serial.println("WITAM");
mySerial.begin(9600);
}

void loop()
{  

if (mySerial.available()) {
  Serial.println("ZACZYNAM:");
  Serial.write(mySerial.read());
}

}
Wynik na terminalu:

Kod:
ZACZYNAM:
cZACZYNAM:
oZACZYNAM:
sZACZYNAM:
dZACZYNAM:
fZACZYNAM:
aZACZYNAM:
kZACZYNAM:
jZACZYNAM:
dZACZYNAM:
lZACZYNAM:
kZACZYNAM:
aZACZYNAM:
jZACZYNAM:
f
Teraz ewentualnie można testować inne prędkości soft seriala.
Tak to wygląda, bo putty od razu wysyła każdą literkę, nic nie widać w terminalu.
Mnie chodziło o coś takiego:
Kod:
void setup() {
 // put your setup code here, to run once:
Serial.begin(115200);
Serial1.begin(115200);

}

void loop() {
 // put your main code here, to run repeatedly:
Serial.println("Wydruk serial");
Serial1.println("Wydruk serial1");

delay(1000);
if (Serial.available()){
 Serial1.write(Serial.read());
}

}



Kod:
Wysłanie na serial z terminala arduino "No i co teraz + znaki linii" daje w putty na TX1:
Wydruk serial1
Wydruk serial1
NWydruk serial1
oWydruk serial1
Wydruk serial1
iWydruk serial1
Wydruk serial1
cWydruk serial1
oWydruk serial1
Wydruk serial1
tWydruk serial1
eWydruk serial1
rWydruk serial1
aWydruk serial1
zWydruk serial1
Wydruk serial1

Wydruk serial1
Wydruk serial1
Tu tylko pin D9 jest podłączony do RX konwertera USB/UART FTDI.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#5
Dziękuje bardzo.

Działa mi sposób z Serial1. Udało mi się wysłać tekst z ESP do Nucleo.
Czy jest możliwość zrobienia tego w drugą stronę. Skoro D9 to TX1, gdzie znajde RX1?
 
Odpowiedź
#6
Nie wszystkie piny ESP  są wyprowadzone na płytki, między innymi dlatego, że spełniając do wyboru jedną z kilku funkcji alternatywnych danego pinu zostały już użyte do innego celu, np. do komunikacji z kością flash lub po prostu nie są dostępne dla programisty.
Na szczęście to ESP, największym ograniczeniem jest wyobraźnia i wiedza programisty. Jak dwa takie seriale to za mało, a softserial też nie wystarcza to otwierasz przykład WiFiTelnetToSerial, wgrywasz z parametrami swojej sieci, na Serial1 wyrzuca jakie ma IP, włączasz Putty, łączysz się na ten IP i port 23. Zresztą wszystko działa tak jak sobie zaprogramujesz - co kiedy, skąd i dokąd.


Załączone pliki Miniatury
   
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości