Hallo zusammen, ich habe ein Problem beim Programmieren meines Arduino Leonardo mit Serial1.begin() und Serial1.end(). Ich möchte die Serielle Schnittstelle sowohl als Digital Output verwenden, als eben auch als Serielle Schnittstelle (speziell PIN 1). Anbei erstmal der Code, bis jetzt nur quick&dirty geschrieben, um zu sehen ob meine Gedanken überhaupt umsetzbar sind: #include <HardwareSerial.h> #define BAUDRATE 9600 int Break = 1; void setup() { //Serial1.begin(BAUDRATE, SERIAL_8N1); pinMode(Break, OUTPUT); // sets the digital pin as output } int start(void){ Serial1.end(); digitalWrite(Break, LOW); delayMicroseconds(13*1e6/BAUDRATE); return 0; } void loop() { start(); Serial1.begin(BAUDRATE, SERIAL_8N1); Serial1.write(0x55); //SYNC Serial1.write(0xCF); //PID Serial1.write(0x20); //CMD Serial1.write(0x00); //DATA Serial1.write(0x10); //CHECKSUM //Serial1.end(); delayMicroseconds(1000); start(); Serial1.begin(BAUDRATE, SERIAL_8N1); Serial1.write(0x55); //SYNC Serial1.write(0xCF); //PID Serial1.write(0x61); //CMD Serial1.write(0x40); //DATA Serial1.write(0x8E); //CHECKSUM delay(2000); } Das Problem besteht darin, dass ich den Pin 1 auch dazu benötige um für eine gewisse Zeit den PIN auf LOW zu halten und dann anschließend Daten über den gleichen PIN raus schicken möchte. Für den ersten Teil, also senden des ersten Paketes funktioniert dies auch einwandfrei, wenn das zweite Paket dann allerdings geschickt werden soll, fehlt sowohl das Delay als auch die LOW Phase, wie beim ersten Paket. Es scheint so, dass der Programmteil vor dem SYNC für den zweiten Teil komplett ignoriert wird. Dabei sollte es möglich sein, auch laut bisherigen Recherchen, die Schnittstelle zu schließen, als Digital PIN zu nutzen und anschließend mit begin, wieder als Schnittstelle. Ich bin ehrlich gesagt etwas ratlos, da ich im Netz auch keine weitere Lösungsmöglichkeit gefunden habe, denn für den ersten Teil funktioniert es so, wie es soll. Habt ihr eine Erklärung öder Lösung für mein Problem? Vielen Dank im Voraus.
Norbert Van der Heyd schrieb: > Habt ihr eine Erklärung öder Lösung für mein Problem? Wie wäre es damit, den PIN auf OUTPUT zu setzen, bevor Du ihn als OUTPUT verwendest?
1 | int start(void){ |
2 | Serial1.end(); // die Serial-Pins sind jetzt INPUT |
3 | // (jedenfalls dann, wenn Serial1 vorher aktiv war)
|
4 | pinMode(Break, OUTPUT); // Pin auf OUTPUT setzen |
5 | digitalWrite(Break, LOW); |
6 | delayMicroseconds(13*1e6/BAUDRATE); |
7 | return 0; |
8 | }
|
Norbert Van der Heyd schrieb: > Habt ihr eine Erklärung öder Lösung für mein Problem? Kann nur raten:
1 | int start(void){ |
2 | Serial1.end(); |
3 | ///////////////////////////////////////
|
4 | pinMode(Break, OUTPUT); // sets the digital pin as output |
5 | //////////////////////////////////////
|
6 | digitalWrite(Break, LOW); |
7 | delayMicroseconds(13*1e6/BAUDRATE); |
8 | return 0; |
9 | }
|
Jürgen S. schrieb: > Wie wäre es damit, den PIN auf OUTPUT zu setzen, bevor Du ihn als OUTPUT > verwendest? Hahaha. Das war aber Zeitgleich ;-D))
Vielen Dank für die beiden hilfreichen Antworten. Genau so hat es funktioniert, musste lediglich noch eine kurze Pause einfügen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.