PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Softwareserial - Console Output geht nach mySerial



ede62
06.02.2019, 10:14
Hallo,
Ich versuche über "SoftwareSerial" eine Verbindung an ein 'echtes' RS232 Gerät zu erstellen.
Den Code teste ich mit einem Terminal Programm wie "Terminal V19b", hterm oder "Putty",
anstelle des RS232 Gerätes.

********** --- via Serial.print(...) -----> Arduino IDE Serial Moitor ...
* ESP-12E * --- via mySerial.write(...) <----> JY-R2T V1.4 <----> some RS232 device
********** - dto - JY-R2T V1.4 <----> Terminal
- dto - JY-R2T V1.4 <----> another ESP-12E

Das Problem ist, das ich die Ausgabe von "Serial.print(...)" in der IDE Console und im Terminal Eingang sehen kann.
Vom eigentlichen "mySerial.write("bytebuff",7) ist nichts im Terminal zu sehen.

Ich benutze:
- Arduino IDE 1.8.7 or 1.8.8
- "ESP-12E" und "JY-R2T V1.4".
RX=Pin3 TX=Pin1 - am "ESP12E".
Ich drehe RX und TX. ( beides versucht )

- Baudrate meistens "Serial" und "mySerial" - 115200 - (8 1 none 1 none).
Auch bei 9600 für beides kein Unterschied.

- Mein SendBuffer zur RS232 ist ein hardcoded byte array - 7 Byte. 0 2 13 0 0 0 12


- Ich benutze kein Arduino Board, nur die Arduino IDE für ESP-12E - NodeMCU 1.0.

- Library: espsoftwareserial-master.zip
Ich habe auch schon andere versucht.
Die Zuordnungen Serial / mySerial habe ich x mal kontrolliert.

Kann mir jemand weiterhelfen ???

Mit freundlichen Grüßen
ede62

Searcher
06.02.2019, 10:47
********** --- via Serial.print(...) -----> Arduino IDE Serial Moitor ...
* ESP-12E * --- via mySerial.write(...) <----> JY-R2T V1.4 <----> some RS232 device
********** - dto - JY-R2T V1.4 <----> Terminal
- dto - JY-R2T V1.4 <----> another ESP-12E

Was soll das bedeuten?



Das Problem ist, das ich die Ausgabe von "Serial.print(...)" in der IDE Console und im Terminal Eingang sehen kann.
Vom eigentlichen "mySerial.write("bytebuff",7) ist nichts im Terminal zu sehen.

- Mein SendBuffer zur RS232 ist ein hardcoded byte array - 7 Byte. 0 2 13 0 0 0 12


Der Unterschied besteht im ".print" und ".write". "print" erzeugt ASCII-Werte und sendet sie zum Port raus. Das kann das Terminal darstellen. ".write" sendet die Werte aus dem array wie eine 0 auch als 0 zum port hinaus. Das Terminal kann das nicht als Zeichen darstellen - im Gegensatz zu einer 48 beim ".print", dem ASCII Wert einer 0.

Gruß
Searcher

ede62
06.02.2019, 16:08
Danke für die Antwort.
Nun ja, du hast recht. So ist es gedacht und kodiert.
Ich versuche es anders darzustellen.

Mein Serial.print geht zur Console - korrekt, und zum Terminal - falsch.

ESP-12e -> über Serial.print(...) --> Arduino IDE Serial Moitor !!!
!!! UND --> zum Terminal !!!

ESP-12E -> über mySerial.write(bytebuf,len) ... erscheint nirgends !!!



Anbei Ausschnitte aus dem Code.

RS232-test.ino Pseudo!!!

#include <SoftwareSerial.h>
...
#define rxPin 3
#define txPin 1
SoftwareSerial mySerial(rxPin, txPin); // RX TX

void setup() {
Serial.begin(9600);
while (!Serial) {
;
}
pinMode(rxPin, INPUT); //*3 pinMode(txPin, OUTPUT);

mySerial.begin(9600);
delay(500);
...
}

void loop() {
... .available ...
byte bb[] = { 0x0, 0x2, 0x13, 0x0, 0x0, 0x0, 0x17 }; //
bytesSent = mySerial.write(bb, len);

Serial.println("-i sBB- sC: " + String(sendCount)
+ " len: " + String(len)
+ String(" bytesSent: ") + String(bytesSent)
+ String(" bb: ") + byteToString(bb, len));
}

Jede weitere Idee ist willkommen.

Gruß ede62

Searcher
06.02.2019, 17:24
Hallo, wenn ich jetzt richtig verstehe, läuft der Sketch auf dem ESP-12E und soll einmal über die Hardware TX Daten senden und zum anderen auch mit Softserial Daten senden? Mit Hardware TX kommt an der Gegenstelle etwas an. Mit Softserial nicht? Egal ob mit ".print" oder ".write"?

Da kann ich jetzt kaum weiterhelfen, da ich mich mit den Sketchen zu wenig auskenne.



#include <SoftwareSerial.h>
...
#define rxPin 3
#define txPin 1
SoftwareSerial mySerial(rxPin, txPin); // RX TX


Mit fiel noch auf, daß Du bei den defines für die RX/TX Pins nur Nummern verwendest. Sollte es da nicht beim ESP-12E wie beim NodeMCU D1 bzw D2 oder so heißen?

https://www.mikrocontroller-elektronik.de/esp12e-tutorial-einstieg-mit-dem-esp8266-modul/

Gruß
Searcher

PS: Code wird sehr viel besser im Forum formatiert wenn er in den Code Tags eingeschlossen wird. Codetags: [ CODE] ...programmcode... [ /CODE] aber ohne jegilche Leerzeichen in den Klammern. Auch erreichbar auf der "Erweitert" bzw "Vorschau" Ansicht mit dem # Zeichen aus der Formatierungsleiste.

HaWe
06.02.2019, 19:07
Sollte es da nicht beim ESP-12E wie beim NodeMCU D1 bzw D2 oder so heißen?

ESP8266 pins haben GPIO-Nummern plus zusätzlich optionale Arduino-D-Nummern (welche aber nur für manche Boardmanager-Cores wie nodeMCU 0.9 und 1.0 und Adafruit Huzzah vordefiniert sind, nicht für alle generell):


digital GPIO default
D0 16 WAKE
D1 5 I2C SCL
D2 4 I2C SDA
D3 0 FLASH/LED
D4 2 TX1
D5 14 SPI SCK
D6 12 SPI MISO
D7 13 SPI MOSI
D8 15 MTD0 PWM
D9 3 UART RX0
D10 1 UART TX0

-

hier also für UART:

D9 3 UART RX0
D10 1 UART TX0

- - - Aktualisiert - - -

PS,
interessant übrigens, dass mySerial auf dieselben Pins initialisiert wurde wie das standardmäßige Hardware-Serial ... :-s

ede62
06.02.2019, 22:50
Hallo, vielen Dank für die Antworten.
ich habe natürlich alle möglichen RX TX Pins versucht. Letztlich habe ich die UART Box von HaWe als richtig empfunden.

Ich werde das Gefühl nicht los das ich in Library-Probleme gelaufen bin.
d.h.
Serial.print soll zur IDE Console gehen - geht auch.
mySerial.write soll zum TX Pin gehen und auf der Receiver Seite erscheinen - geht nicht.

Gibt es jemanden der mit Softwareserial und einem RS232 Gerät erfolgreich kommunizieren kann???
Den Konverter "JY-R2T V1.4" nicht vergessen.


Vielen Dank nochmal ich gebe noch nicht auf.

Mit freundlichen Grüßen
ede62

HaWe
07.02.2019, 09:11
Serial läuft per default über UART 1+3,
wenn du SoftSerial zusätzlich brauchst, muss es IMMER über ANDERE Pins laufen (z.B. 12+13).
Was allerdings sein kann, ist, dass der esp8266 überhaupt nicht zu den SoftSerial Libs kompatibel ist.

PS,
es ist aber denkbar, dass du für reine Ausgabezwecke den TX1 (GPIO2=D4) mit Serial1() nutzen kannst, zusätzlich zu Serial() RX+TX

Ceos
07.02.2019, 09:19
https://github.com/plerup/espsoftwareserial

hab ich in einem Forum gefunden, es braucht wohl eine ESP angepasste SoftwareSerial (die Info könnet aber auch schon Hoffnungslo veraltet sein)

Ansonsten schließe ich mich hier HaWe an, die SoftSerial auf die gleichen Pins wie die HWSerial zu packen könnte hier schon das Problem erklären, wobei ich nciht 100% sicher bin ob man die HWSerial Pins einfach mit einer Pin Konfiguration überschreiben könnte!?

HaWe
07.02.2019, 09:39
https://github.com/plerup/espsoftwareserial

hab ich in einem Forum gefunden, es braucht wohl eine ESP angepasste SoftwareSerial (die Info könnet aber auch schon Hoffnungslo veraltet sein)

Ansonsten schließe ich mich hier HaWe an, die SoftSerial auf die gleichen Pins wie die HWSerial zu packen könnte hier schon das Problem erklären, wobei ich nciht 100% sicher bin ob man die HWSerial Pins einfach mit einer Pin Konfiguration überschreiben könnte!?

Das "könnte" durchaus denkbar sein, dann "sollte" man aber vorher "vielleicht" UART 1+3 auf andere Pins umdefinieren, und dann "könnte" man anschließend die frei gewordenen 1+3 für SoftSerial verwenden -
bevor ich das aber hier jemandem empfehlen würde, würde ich lieber dazu raten, bei Standard-UART-1+3 zu bleiben und SoftSerial mit passenden Libs (?) auf anderen Pins probieren.

Der Einwurf zu SoftSerial-Anpassungen über spezielle ESP-Libs ist aber sicherlich wichtig, ich würde das Testprogramm stark abspecken und nur Softserial alleine mit diesen anderen Libs an 12+13 versuchen zum Laufen zu bringen.

- - - Aktualisiert - - -

PS,
dein Link, Ceos, scheint jedoch recht aktuell zu sein:

harlock974 and plerup Add files via upload (#74)
Latest commit 56654d2 on 18 Dec 2018

ede62
11.02.2019, 11:17
Hallo, vielen Dank für die Informationen.
Ich habe jetzt ein Client.ino auf einem Rechner, einen Server.ino auf einem anderen.
An beiden einen ESP-12E und den JY-R2T Konverter. Über ein RS232 Kabel ist alles verbunden.
Jeweils RX Pin 3 und TX Pin 1.
Im Client ist PinMode RX auf INPUT und TX auf OUTPUT.
Im Server nur RX auf INPUT. Wenn TX hier ebenfalls auf OUTPUT gesetzt wird, geht nichts.

Der Client schickt alle 2 Sec. 7 Byte: 00021900000017,
diese kommen beim Server an und können auch in der Server IDE Console lesbar dargestellt werden.
In der Client IDE Console sehe ich nur Hieroglyphen.

Das ganze funktioniert nur mit erwähnten Einstellungen.

Wenn ich auf der Client-Seite die PinMode TX weglasse oder auf Server-Seite zufüge,
dann geht nicht mehr. ... " ... not available ", aber lesbar.

Ich werde, wie von euch angesprochen, mich jetzt um die RX/TX Pins und um die Library kümmern.

Vielen Dank nochmals, ich melde mich wieder.
Gruß Ede

HaWe
11.02.2019, 12:21
RX und TX musst du nicht als INPUT/OUTPUT konfigurieren, sie sind bereits korrekt für Serial() UART vorkonfiguriert.
Auch für SoftSerial() musst du nur die (abweichenden) pin-Nummern benennen, nichts weiter, den Rest erledigen die Libs.

Ceos
11.02.2019, 13:11
RX und TX musst du nicht als INPUT/OUTPUT konfigurieren, sie sind bereits korrekt für Serial() UART (http://rn-wissen.de/wiki/index.php?title=UART) vorkonfiguriert.

Jein!

wenn die default UART an ist und du dann eine SOFT-UART auf die gleichen Pins belegst, kann es sehr gut zu einem Konflikt führen(vor allem wenn der darunterliegende Chip die Portfunktion nicht automatisch konfiguriert sondern konfiguriert werden muss, leider stecke ich im 8266 was UART angeht nicht drin, aber soweit ich es verstanden habe muss man bei PIC controllern die Pins manuell auf Ausgang schalten auch wenn die peripherie darauf gemappt ist).

Nur um es auszuschließen, soll er prüfen wie die Pins konfiguriert sind.


den Rest erledigen die Libs.

Das gilt nur, solange du keine "merkwürdigen" Sachen machst und den z.B. Soft Serial auf die eigentlich Hardware Serial Pins zu legen ist in meinen Augen definitv "merkwürdig"

ede62
12.02.2019, 15:50
Uups, meine Antwort vom 13.2.2019 ist auf Seite 1 gelandet.
Sorry.

ede62
14.02.2019, 10:17
Hallo,
ich kann es kaum glauben, aber es funktioniert und liefert Ergebnisse die auf den ersten Blick sehr gut aussehen, sogar mit dem echten RS232 Controller.
Es liegt tatsächlich an den Pin's.
Ich fand den Code unter: https://github.com/Ariel-International/espsoftwareserial2. Diese zip Library habe ich eingebunden.
Nach einigen erneuten Pin Versuchen mit dem Code und einem Terminal nahm ich die Original angegebenen, RX=14 TX=12 ... und es klappte.
Leider habe ich bei allen Rechechen betr. NodeMCU etc. und RS232 und Pin-Belegung oder -Layout nichts gefunden was auf andere RX/TX Pin's weist.
Ob es mit der anderen Library und den Pin's 14/12 auch geht werde ich demnächst mal testen.

Vielen Dank für die erfolgreichen Dialoge.
Ich stehe für Fragen weiter zur Verfügung.
Ede

P.S. Ich hatte auch die neueste Arduino IDE 1.8.8 nochmal neu installiert und vorher ziemlich aufgeräumt.

HaWe
14.02.2019, 11:47
Jein!
wenn die default UART an ist und du dann eine SOFT-UART auf die gleichen Pins belegst, kann es sehr gut zu einem Konflikt führen(vor allem wenn der darunterliegende Chip die Portfunktion nicht automatisch konfiguriert sondern konfiguriert werden muss, leider stecke ich im 8266 was UART angeht nicht drin, aber soweit ich es verstanden habe muss man bei PIC controllern die Pins manuell auf Ausgang schalten auch wenn die peripherie darauf gemappt ist).
Nur um es auszuschließen, soll er prüfen wie die Pins konfiguriert sind.
Das gilt nur, solange du keine "merkwürdigen" Sachen machst und den z.B. Soft Serial auf die eigentlich Hardware Serial Pins zu legen ist in meinen Augen definitv "merkwürdig"

@Ceos:
(las gerade eben erst deine Antwort vom 11.2.)
Das default UART für Serial() auf ESP8266 GPIOs 3+1 ist bei Arduino nodeMCU cores immer per default an, sobald es per Serial.begin() gestartet wurde. Hier muss man für die Benutzung per Serial() auch keine INPUT/OUTPUT pins zusätzlich initialisieren, das macht die Serial() Lib automatisch.

Auch bei SoftwareSerial() muss man nur die Klasse mir den gewünschten Pins instanziieren und keine INPUT/OUTPUT pins zusätzlich initialisieren, denn das macht auch hier die Arduino-Standard-Lib intern: https://www.arduino.cc/en/Tutorial/SoftwareSerialExample

SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(57600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(4800);
mySerial.println("Hello, world?");
}
//

Ich sehe noch nicht, dass das bei der auf ESP angepassten Lib anders laufen sollte...(?)

Und wir reden hier ja auch ausschließlich über die Arduino API Libs!

Daher schrieb ich ja, dass SoftwareSerial() NICHT auf dieselben Pins wie Serial() initialisiert werden sollte, gerade wenn man Serial() RX0/TX0 dort ebenfalls benutzt!
Daher schrieb ich ebenfalls, dass man für Serial() RX0/TX0 bei GPIO 3+1 bleiben soll und für SoftSerial andere GPIOs nutzen soll...

@ede62
... was du ja jetzt wohl auch getan hast - und es funkioniert ;)

HaWe
30.03.2019, 11:05
gerade gefunden, als update zu esp8266 software-serial::
https://github.com/arduino/Arduino/issues/8733