Serieller Empfang am Arduino MEGA

Programmierung und Hardwaredesign mit Arduino, AVR, PIC und Konsorten.

Moderatoren: MaxZ, ebastler, SeriousD

Antworten
Benutzeravatar

Thread-Ersteller
L_B_S
Beiträge: 531
Registriert: Fr 24. Jul 2015, 10:13
Schule/Uni/Arbeit: KFZ-Elktr.
Hat sich bedankt: 19 Mal
Danksagung erhalten: 23 Mal

Serieller Empfang am Arduino MEGA

Beitrag von L_B_S »

Moin zusammen,

ich versuche seriell Daten über den "hauseigenen" USB-Port (UART) am MEGA zu empfangen. Ein angeschlossener 74HC595 wandelt dann die empfangenen Byte's um in eine parallele Ausgabe.
Der Programmcode:

Code: Alles auswählen

int shiftPin = 5;  // Pin SCK an 74HC595
int storePin = 6;  // PIN RCK an 74HC595
int dataPin  = 7;  // Pin SER an 74HC595
 
int incomingByte;   // for incoming serial data

 
void setup() {
  pinMode(storePin, OUTPUT);  
  pinMode(shiftPin, OUTPUT); 
  pinMode(dataPin, OUTPUT);  
  pinMode(13, OUTPUT); //Ausgang boardeigene LED
  
  digitalWrite(13, LOW);  // eigene LED aus 

  //HC595 Test
  write_595(255);  // HC595 alle EIN
  delay(200);
  write_595(0);    // HC595 alle AUS
    
  Serial.begin(9600);
}

  void loop() {
   if (Serial.available() > 0)
      {
      incomingByte = Serial.read();
      //delay(100);
      write_595(incomingByte);
      Serial.print (char(incomingByte));
      }
 } 
 
// =======================================================================
// Funktion: Wert seriell an HC595 senden
  void write_595(int Wert)
  {
  digitalWrite(storePin, LOW);                 // ClockPin auf Low
  shiftOut(dataPin, shiftPin, MSBFIRST, Wert); // Wert übertragen 
  digitalWrite(storePin, HIGH);                // ClockPin auf High  
  } 
Mit dem "hauseigenen" seriellen Monitor der IDE werden die Byte's über COM2 gesendet und werden auch wieder korrekt als Echo empfangen. Allerdings reagiert der HC595 nicht bzw. nicht richtig.
Sende ich die Daten mit einem anderen seriellen Monitor über COM2, in meinem Fall benutze ich den 'Terminal.exe', funktioniert das hervorragend. Also scheint das Programm auf dem MEGA-Board korrekt zu sein.
Hardwaremässig müsste dann auch alles richtig sein sein.

Ich möchte nun nicht die Byte's über 'Terminal.exe' per Hand senden, sondern aus einem anderen, von mir erstellten Programm.
Wieder über COM2 und den "hauseigenen" USB-Port (UART) am MEGA. Das klappte leider auch nicht.
Die Vermutung lag nahe , das läge vielleicht an meinem eigenen Programm, das die Daten sendet.

Daher habe ich einen seperaten USB zu seriell Wandler (USB to UART Bridge) am MEGA-Board am Pin RX2 (Pin 17) und GND angeschlossen (über COM4). Das MEGA-Programm vorher so umgeändert:

Code: Alles auswählen

//  Eingang seriell ist RX2 Pin 17

int shiftPin = 5;  // Pin SCK an 74HC595
int storePin = 6;  // PIN RCK an 74HC595
int dataPin  = 7;  // Pin SER an 74HC595
 

int incomingByte;   // for incoming serial data
 
void setup() {
  pinMode(storePin, OUTPUT);  
  pinMode(shiftPin, OUTPUT); 
  pinMode(dataPin, OUTPUT);  
  pinMode(13, OUTPUT); //Ausgang boardeigene LED
  
  digitalWrite(13, LOW);  // eigene LED aus 

  //HC595 Test
  write_595(255);  // HC595 alle Ausgänge EIN
  delay(200);
  write_595(0);    // HC595 alle Ausgänge AUS
    
  Serial2.begin(9600);
}

  void loop() {
   if (Serial2.available() > 0)
      {
      incomingByte = Serial2.read();
      //delay(100);
      write_595(incomingByte);
      Serial2.print (char(incomingByte));
      }
 } 
 
// =======================================================================
// Funktion: Wert seriell an HC595 senden
  void write_595(int Wert)
  {
  digitalWrite(storePin, LOW);                 // ClockPin auf Low
  shiftOut(dataPin, shiftPin, MSBFIRST, Wert); // Wert übertragen  und StorePin auf High 
  digitalWrite(storePin, HIGH);                // ClockPin auf High  
  } 
Diese Variante funktionierte auch hervorragend. Also kann es doch nicht an meinem eigenen Programm liegen, dass die Daten sendet.
Wie schon gesagt, mein Programm , dass die Daten sendet, funktioniert mit dem seperaten USB zu seriell Wandler, aber nicht
mit dem verhandenen USB-Port (UART) am MEGA
. Ich kann mir das nicht erklären.
Vielleicht hat da jemand einen Rat.

Gruss
Ludwig
Benutzeravatar

Thread-Ersteller
L_B_S
Beiträge: 531
Registriert: Fr 24. Jul 2015, 10:13
Schule/Uni/Arbeit: KFZ-Elktr.
Hat sich bedankt: 19 Mal
Danksagung erhalten: 23 Mal

Re: Serieller Empfang am Arduino MEGA

Beitrag von L_B_S »

alles geklärt
...das ist natürlich blöd, daß der Arduino beim Ein und Ausschalten des Monitors resetet wird. ....
:facepalm:
das hatte ich nicht beachtet. Jetzt funkt es.
Benutzeravatar

Thread-Ersteller
L_B_S
Beiträge: 531
Registriert: Fr 24. Jul 2015, 10:13
Schule/Uni/Arbeit: KFZ-Elktr.
Hat sich bedankt: 19 Mal
Danksagung erhalten: 23 Mal

Re: Serieller Empfang am Arduino MEGA

Beitrag von L_B_S »

... und da ist schon das nächste Problem.
Ich sende eine Zeichenkette bestehend aus 6 Zeichen zB. "ABCDEF". MEGA empfängt diese mit:

Code: Alles auswählen

.....
while(Serial.available()) {
         incomingString = Serial.readString();   // read the incoming data as string
         Len_incomingString = 0;
         Len_incomingString = incomingString.length();  // Stringlänge ermitteln
         .....
Len_incomingString = incomingString.length(); ermittelt die Länge des Strings und speichert diese in Len_incomingString

Ich habe 6 Zeichen gesendet, allerdings Len_incomingString ist 12, also immer doppelt soviel, wie es sein sollte. warum ????
Benutzeravatar

Heisath
Beiträge: 539
Registriert: Mi 26. Jun 2013, 15:44
Hat sich bedankt: 33 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: Serieller Empfang am Arduino MEGA

Beitrag von Heisath »

Wie schnell sendest du denn? Serial.readString liest ja solange bis es einen Timeout hat. Wenn du in der Zeit schon 2 6er Pakete geschickt hast, kommen halt 12 Zeichen raus.

https://www.arduino.cc/reference/en/lan ... eadstring/
Benutzeravatar

Thread-Ersteller
L_B_S
Beiträge: 531
Registriert: Fr 24. Jul 2015, 10:13
Schule/Uni/Arbeit: KFZ-Elktr.
Hat sich bedankt: 19 Mal
Danksagung erhalten: 23 Mal

Re: Serieller Empfang am Arduino MEGA

Beitrag von L_B_S »

Heisath hat geschrieben: Do 29. Jul 2021, 14:26 Wie schnell sendest du denn? Serial.readString liest ja solange bis es einen Timeout hat. Wenn du in der Zeit schon 2 6er Pakete geschickt hast, kommen halt 12 Zeichen raus.
mal
Ich sende den String nur einmal und mit 9600 Bd. Es hat etwas mit meinem sendenden Programm zu tun (nicht das Prog auf dem MEGA !)
so sieht das Kommando aus:

Code: Alles auswählen

@WriteCom(hd_com%, Kommando$)
(ist eine andere Progr.-Sprache !)

Wenn ich danach noch eine Wartezeit von ca. 200 ms einfüge, klappt es. Ist aber schon komisch :gruebel:
Antworten