Forum: Mikrocontroller und Digitale Elektronik Arduino Leonardo Serial.begin() Serial.end()


von Norbert V. (norbie)


Lesenswert?

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.

von Jürgen S. (jurs)


Lesenswert?

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
   }

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
  }

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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))

von Norbert V. (norbie)


Lesenswert?

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
Noch kein Account? Hier anmelden.