www.mikrocontroller.net

Forum: Compiler & IDEs uIP - Daten senden mit Bestätigung


Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen.
Ich versuche gerade mit dem uIP Stack Daten zu senden. Prinzipiell 
funktioniert das auch gut. Zu gut. Für manche Anwendungen bin ich zu 
schnell, also habe ich eine while-Schleife eingebaut, die auf die 
Gegenstelle warten soll. Leider funktioniert das ganze nicht. Ich 
vermute weil ich mit der Schleife mein Programm lahm lege und uIP das 
Ack eben nicht empfangen kann :)

hier mein Code
  uip_send((void *)message.msg, message.characters);
  while(uip_acked() == 0)
  {
    if(uip_timedout() != 0 || uip_aborted() != 0 || uip_closed() != 0)
      break;
  }

Daher frage ich mich wie man sowas am besten lösen kann.

Das Problem ist, ich will in einer Funktion meine Sendefunktion aufrufen 
und etwas senden. Das will ich oft machen aber eben nur dann, wenn das 
vorherige Packet bestätigt wurde. Die Bestätigung kann ich aber nur über 
main erhalten, wo ich nicht hinkomme, solange ich meine große Stückzahl 
an Packeten senden will. Verwirrend.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Josef wrote:
> hier mein Code
>
>   uip_send((void *)message.msg, message.characters);
>   while(uip_acked() == 0)
>   {
>     if(uip_timedout() != 0 || uip_aborted() != 0 || uip_closed() != 0)
>       break;
>   }

Wundert mich, dass das überhaupt funktioniert. Du darfst uip_send nur 
aufrufen, wenn du innerhalb der Applikation bist, die vom uip Stack 
aufgerufen wurde (weil zB ein Paket angekommen ist). Du darfst sie nicht 
von extern aus benutzen.

uip.h:
 * This function is used to send out a single segment of TCP
 * data. Only applications that have been invoked by uIP for event
 * processing can send data.

Du solltest erstmal überlegen
1. Was willst du machen?
2. Wie willst du das machen?

Willst du eine TCP Verbindung zu einer Gegenstelle herstellen oder 
einfach ein UDP Paket schicken?

Für TCP benötigst du erstmal eine offene Verbindung (uip_open). Dann 
legst du eine uip-Applikation auf den Stack. Diese wird gestartet, 
sobald die Gegenstelle die Verbindung angenommen hast.
Und jetzt darfst du bei jedem Aufruf der uip-Applikation überprüfen ob 
neue Daten vorhanden sind. Falls ja: Sende sie. Falls nein: kannst du zB 
closen oder die TCP Verbindung auf stop stellen.
Wenn du die Verbindung auf stop stellst, kommt aber kein neues Paket 
mehr von der Gegenstelle (solange, bis du wieder eines schickst). 
Trotzdem wird die Applikation aber (bei richtiger Integration) 
regelmäßig aufgerufen (kannst du mit der Test-Funktion uip_poll() 
bestimmen).

PS: uip_acked() usw sind Testfunktionen. Diese sollst du innerhalb 
deiner Applikation anwenden und nicht außerhalb.

Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also meine Sendefunktion wird von einer Funktion in der 
"uIP-Statemachine", ähnlich der auf Seite 12 im uip-refman.pdf, 
aufgerufen.
Meine Webseite wird schon richtig übertragen und meine anderen Anwendung 
läuft mittlerweile auch, wobei die Lösung ein Puffer war.

Ich verstehe nicht ganz was du mir sagen willst? uip_send darf nur als 
Folge des Aufrufs,der in die in uipopt.h eingetragene Funktion, 
aufgerufen werden?! Wenn ja, dann mach ich das auch so. Also so wies 
beschrieben wird.

Kann ich eigentlich uip_connected auf mit "switch(uip_conn->lport)" und 
HTONS(XYZ) testen?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Josef wrote:
> Also meine Sendefunktion wird von einer Funktion in der
> "uIP-Statemachine", ähnlich der auf Seite 12 im uip-refman.pdf,
> aufgerufen.
> Meine Webseite wird schon richtig übertragen und meine anderen Anwendung
> läuft mittlerweile auch, wobei die Lösung ein Puffer war.

Dann solltest du es aber vermeiden while Schleifen in deine Anwendung 
einzubauen...

Autor: Patrick Wieland (wieland)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Wenn deine Applikation vom TCP-Stack aufgerufen wird, darfst du 
uip_send() nur einmal benutzen. Wenn du es mehrfachst verwendest, werden 
nur die Parameter des letzten Aufrufs an den TCP-Ausgangspuffer 
weitergereicht. Die Bestaetigung mittels uip_acked() wird erst beim 
naechsten Aufruf deiner Applikation durch uIP erfolgen.

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.