Hi,
ich habe ein Problem (scheinbar mit dem Buffer?) einer LwIP TCP
Verbindung.
Dazu hatte ich schonmal einen anderen Thread gemacht, allerdings ging es
da mehr um die netconn API...
Hier möchte ich direkt auf den Buffer selbst eingehen, in diesem Fall
aber bei der RAW API.
Ich kann aktuell mit der RAW API und den TCP Funktionen eine Verbindung
aufbauen, Daten senden und Daten empfangen. Allerdings nur eine
begrenzte Menge.
Hier der Code:
1
struct netif gnetif;
2
struct tcp_pcb *testClient_pcb;
3
uint8_t dataToSend[14];
4
int i;
5
6
int main(void)
7
{
8
/* STM32F4xx HAL library initialization:
9
- Configure the Flash prefetch, instruction and Data caches
10
- Configure the Systick to generate an interrupt each 1 msec
11
- Set NVIC Group Priority to 4
12
- Global MSP (MCU Support Package) initialization
13
*/
14
HAL_Init();
15
16
/* Configure the system clock to 180 MHz */
17
SystemClock_Config();
18
19
/* Initialize the LwIP stack */
20
lwip_init();
21
22
/* Configure the Network interface */
23
Netif_Config();
24
25
/* Notify user about the network interface config */
Der Kommunikationspartner sendet zyklisch Daten, nachdem ich ihm einen
Befehl geschickt habe. Das klappt soweit.
Bevor ich diese Zeilen eingefügt hatte...
1
pbuf_free(p);
2
p = NULL;
... konnte ich nur genau 8 Nachrichten empfangen.
Das habe ich durch die Variable "i" gesehen.
Es kam kein Fehler!
Ich habe sogar in der lwip/opt.h Datei versucht, die Memory
Einstellungen zu ändern. Leider ohne Erfolg. Immer nur 8 Nachrichten.
Nachdem ich nun die Zeilen oben ergänzt habe, kann ich mehr empfangen,
allerdings nicht "flüssig". Es kommen 8 Nachrichten, dann eine kurze
Pause, dann nochmal 3, dann nochmal eine kurze Pause, dann nochmal ein
paar. Nach 16 oder 17 Nachrichten kommt nun die Fehlernummer "-14" durch
die Error-Callback-Funktion, was einem "Connection reset" entspricht.
Ich verstehe die pbufs noch nicht so ganz.
Weiß LwIP nur durch die opt.h Datei, wie die buffer aussehen?
Wofür ist dann die "pbuf API" von LwIP?
Kann ich den pbuf "p" aus dem obigen Code noch anpassen ändern
optimieren?
Vielen Dank vorab!
Hallo,
Daniel F. schrieb:> Bevor ich diese Zeilen eingefügt hatte... pbuf_free(p);> p = NULL;> ... konnte ich nur genau 8 Nachrichten empfangen.> Das habe ich durch die Variable "i" gesehen.> Es kam kein Fehler!
Du solltest nicht p = NULL setzen, dadurch greifst du in den internen
Memory Management von LWIP ein und es kann zu Memory Leaks kommen, was
dazu führt, dass das Memory ausgeht.
Um mehr Daten zu empfangen, kannst du folgendes machen:
tcp_recved(tpcb, p->len);
pbuf_free(p);
pbuf_free(p->next);
pbuf_free(p->next->next);
pbuf_free(p->next->next->next);
ich mache die nächsten pBufs frei sicherheitshalber, aber die erste
Zeile signalisiert dem Sender, dass man wieder mehr Daten empfangen
kann.
Außerdem kannst Du in LWIP-opts.h auch die TCP_WND, TCP_MSS und
PBUF_POOL_SIZE und PBUF Buffergrößte ändern bzw. vergrößern.
Das sollte helfen.
Hi,
danke für die Antwort.
"tcp_recved(tpcb, p->len);" hatte ich ja genutzt...
Das hatte nichts gebracht.
Mittlerweile hab ich das Problem "indirekt" gelöst:
Der Fehler trat nur auf dem Dev-Board von ST auf. Sobald das Programm
auf dem eigenen Board war, war der Fehler weg und es lief tadellos!
Ich weiß nicht, ob auf dem Dev-Board etwas anders sein kann. Es ist zwar
mehr Hardware dran, aber da Programm ist das selbe...
Leider verstehe ich noch nicht so genau, warum, aber immerhin geht es!
:-)
Das ist erstmal die Hauptsache.
Werde da bei Gelegenheit nochmal nachforschen, beim nächsten Projekt...
Hallo, im Rahmen meiner Studienarbeit muss ich über Cube mx mit LwIP
Daten an den Mikrocontroller senden. Ich bin darin ein Anfänger und wäre
dankbar, wenn ihr mir da helfen könnt.
Frage:
1. Wie sende ich eine TCP/IP an den Controller?
2. Wie können die Low-Level Netzwerkfunktionen des Controllers getestet
werden?
3. Einfache Implementierung eines Low-Level Tests.
Ich muss mit st cube mx arbeiten... es soll für Frage 1 einen LwIP Code
geben..
Danke im voraus!
Für ‚mach mir meine Studienarbeit‘ einen Thread kapern? Kommt hier gar
nicht gut.
Da dürft ihr schon einen Codegenerator nutzen und dann immer noch zu
faul mal ein Tutorium dazu anzusehen? Coronastress?
Mahmud F. schrieb:> Ich muss mit st cube mx arbeiten... es soll für Frage 1 einen LwIP Code> geben..
Es soll - dunkle Gerüchte verbreiten diese Meinung - ein Wiki
zu LWIP geben. Aber das ist sehr geheim, Suchmascheinen ver-
weigern die Auskunft ....
Wenn man dann durch langjährige Suche darauf gestossen ist
könnte man dort sogar Beispielcode finden.
Und wenn man noch ein paar Jahre sucht (das ist natürlich nur
für ganz harte Jungs) findet man sogar im LWIP package Code
Beispiele.
Mahmud F. schrieb:> Danke im voraus!
Für Unterstützung im Wenig- bzw. Nichtstun?
Johannes S. schrieb:> Für ‚mach mir meine Studienarbeit‘ einen Thread kapern? Kommt hier gar> nicht gut.
--> Und dann auch noch einen, der eigentlich was ganz anderes zum Inhalt
hat! ^^
Mahmud F. schrieb:> im Rahmen meiner Studienarbeit muss ich über Cube mx mit LwIP> Daten an den Mikrocontroller senden.
Du willst von Cube mx über LwIP Daten an den µC schicken?
Oder willst du den µC mit Cube mx prgrammieren, dabei dann LwIP nutzen,
damit du Daten per Ethernet empfangen kannst?
Mahmud F. schrieb:> Frage:>> 1. Wie sende ich eine TCP/IP an den Controller?> 2. Wie können die Low-Level Netzwerkfunktionen des Controllers getestet> werden?> 3. Einfache Implementierung eines Low-Level Tests.
Antwort zu 1: Gibt viele Möglichkeiten: Zum Testen z.B. auch mit
RealTerm auf dem PC.
Gegenfrage zu 2:
Was willst du genau testen? Ob dein Code funktioniert? Ob die Hardware
i.O. ist?
Gegenfrage zu 3:
Was ist deine Frage?
Mahmud F. schrieb:> Ich muss mit st cube mx arbeiten... es soll für Frage 1 einen LwIP Code> geben..
Ja, es gibt nen Haufen Beispiele.
In deinem User Ordner auf der Festplatte findest du einen Ordner
"STM32Cube", darin das "Repository", darin die Firmware der
installierten Controller. Darin findest du unter "Projects" und deinem
Board dann den Ordner "Applications", wo auch einige Beispiele zu "LwIP"
sind.
Unter anderem TCP und UDP Server und Clients. Auch ein HTTP Server...
Du könntest dir nun die Application "LwIP_TCP_Echo_Server" ansehen, wo
in der Readme genau erklärt ist, was du machen musst!
Ich habe selbst damals länger gebraucht, bis ich die ganzen Examples
gefunden habe. Wenn man die aber mal gefunden hat, ist es nur noch ein
"Nachbauen" und "Zusammenkopieren"....
Zu Frage 1: Ich möchte erstmal nur Testdaten an den Controller senden
mit TCP/IP. Also nur zum üben wie man so etwas macht.
zu Frage2: Es soll ein Konzept sein wie man low-level Netzwerkfunktion
des Controllers testet. Ich denke, ob meine Funktion
funktioniert....Genaueres muss ich noch mal nachfragen.
zu Frage 3: nur Grundlagen wie man low-Level Funktion implementiert.
Ich werde hierzu noch genaueres nachfragen.
Ich danke dir für deine Hilfe...werde mal reinschauen was du mir
geschickt hast...
Als Alnfänger ist es etwas schwierig zurecht zu finden.
Du willst von Cube mx über LwIP Daten an den µC schicken?
Oder willst du den µC mit Cube mx prgrammieren, dabei dann LwIP nutzen,
damit du Daten per Ethernet empfangen kannst?
Von Cube mx über LWIP Daten an den µC schicken.
Mahmud F. schrieb:> Du willst von Cube mx über LwIP Daten an den µC schicken?> Oder willst du den µC mit Cube mx prgrammieren, dabei dann LwIP nutzen,> damit du Daten per Ethernet empfangen kannst?>> Von Cube mx über LWIP Daten an den µC schicken.
Das versteh ich nicht....
Vielleicht kann mich mal jemand aufklären! :-)
Cube mx (und die IDE) wird genutzt, um den µC zu programmieren.
LwIP ist eine Bibliothek, die genutzt wird, um eine
Netzwerkfunktionalität auf dem µC zu realisieren.
Meines Wissens nach kann man VON Cube mx keine Daten ÜBER LwIP AN den µC
schicken. Interpretiere ich was falsch, oder hast du einfach noch keine
Ahnung davon?