mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Senden über serielle Schnittstelle funktioniert teilweise nicht


Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Community,

hier ein (für mich jedenfalls) recht kurioses Problem, bei dem ich Eure 
Hilfe benötige!

Ich hole erst mal aus:

Ich benutze einen µC (deRFmega128 von DresdenElektronik), das AVR Studio 
und den MAC Layer von Atmel in der Version 2.4.2. Hier speziell die PAL 
- API.
Diese API stellt eine Funktion bereit, mit der Daten über die Serielle 
Schnittstelle empfangen und gesendet werden können. Das Empfangen 
funktioniert tadellos. Von HTerm gesendete Daten können vom µC erkannt 
und verarbeitet werden. Nun zum kuriosen Teil des Ganzen: Das Senden an 
den PC funktioniert nur teilweise.

Rufe ich die Funktion zum Senden von Daten zum Beispiel aus einer Timer 
- Routine oder einer undendlichen While - Schleife aus auf, so kann ich 
die Daten auch wunderbar im HTerm sehen. Rufe ich die Funktion jedoch 
aus einem switch - case oder einem if - Konstrukt heraus auf, so 
passiert gar nichts. Auch Debugging hat mich hier nicht weitergebracht. 
Ich habe die Funktion schon einmal komplett durchgesteppt und mir alles 
genau angeschaut, aber ich kann einfach nicht entdecken wo dort etwas 
verloren geht. Als Rückgabewert gibt die Funktion die tatsächlich 
übermittelten Bytes zurück. Dieser Rückgabewert entspricht auch 
tatsächlich der Anzahl an Bytes, die ich übertragen will.

Ich habe schon vermutet, dass der Puffer vielleicht nicht richtig 
geleert wird, oder sowas ähnliches, aber wenn ich die Daten mit einem 
Timer alle paar Sekunden zum Beispiel losschicke, dann kommen sie nicht 
stoßweise an, sondern immer schön einzeln, Byte für Byte...

Der zweite Gedanke der mir kam, war dass vielleicht irgendwelche 
Interrupts etwas kaputt machen. Also habe ich die Funktion in cli() und 
sei() "eingepackt". Leider mit dem gleichen Ergebnis.

Auch Delays konnten das Problem nicht beheben. Den Tipp hatte mir ein 
Arbeitskollege gegeben.

Der Code, den ich benutze ist ein adaptiertes Beispiel von Atmel, dass 
sich Wireless UART nennt. Ich habe den entsprechenden Teil des Codes mal 
angehängt:
static void app_task(void){
  uint8_t number_of_bytes_received = 0;
  uint8_t opcode[2] = {0x00, 0x00};
  char r_byte;
  uint8_t return_value = (uint8_t)('r');

  /* Überprüfen ob Daten über die serielle Schnittstelle empfangen worden sind */
  number_of_bytes_received = pal_sio_rx(SIO_CHANNEL, sio_rx_data, MAX_APP_DATA_LENGTH);

  /* Wenn Daten empfangen worden sind, dann decodieren */
  if(number_of_bytes_received){
    r_byte = (char)sio_rx_data[0];
    
    switch(r_byte){
      /*Hier werden vorher noch ein paar anderen Cases abgearbeitet*/
      case 'c':
        /* bevor wir dem PC sigalisieren, dass wir fertig sind, halten wir die ActiveNode an */
        opcode[0] = TRANSMITTER_OFF;
      
        /* PC signalisieren, dass wir fertig sind */
        pal_sio_tx(SIO_CHANNEL, &return_value, sizeof(return_value));
        break;
    }
  }
}


Hat vielleicht jemand eine Ahnung, wie das zustande kommt? Ich habe 
wirklich schon ne Menge versucht, aber nichts hat mich weitergebracht. 
Auch google war nichts in der Richtung bekannt.

Mit freundlichen Grüßen,
Henning

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
IMHO ist die gezeigte Funktion ist nur fürs Empfangen zuständig.

Senden tut die Funktion lediglich einen festen Rückgabewert ('r') und 
das auch nur in einem bestimmten Fall (hier: (number_of_bytes_received 
!= 0) && ((char)sio_rx_data[0] == 'c')).

"Als Rückgabewert gibt die Funktion die tatsächlich übermittelten Bytes 
zurück." sehe ich nicht. Die Funktion selbst hat keinen Rückgabewert 
(static void app_task(void); Prototyp).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.