Hallo,
für UDP Kommunikation auf einem Mikrocontroller wird der LWIP-Stack
eingesetzt. Folgendes Phänomen ist mir aufgefallen:
Der Mikrocontroller sowie zwei Rechner (in der gleichen Subnetz
Maske)sind an einem Switch verbunden. Wenn ich nun auf beiden Rechner
Ping permanent ausführe, dann werden die Ping-Antwortzeiten nach ca. 30
Sekunden deutlich schlechter (>200ms).
UDP Initialisierung:
1 | upcb = udp_new();
|
2 | if (upcb)
|
3 | {
|
4 | udp_bind(upcb, IP_ADDR_ANY, UdpPort);
|
5 | udp_recv(upcb, udp_server_receive_callback, NULL);
|
6 | }
|
Variablen:
1 | struct pbuf *p;
|
2 |
|
3 | char ReceiveBuffer[UDPBufferLen];
|
4 | int ReceiveBufferLen;
|
5 |
|
6 | unsigned int SrcAddr;
|
7 | unsigned int DstAddr;
|
8 | unsigned int GwAddr;
|
9 | unsigned int NetMask;
|
10 | unsigned int Port;
|
Receive Callback Funktion:
1 | void udp_server_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
|
2 | {
|
3 | if (ReceiveBufferLen==0)
|
4 | {
|
5 | int Len;
|
6 | Len = p->len;
|
7 | memcpy(ReceiveBuffer,p->payload,p->len);
|
8 | udp_connect(upcb, addr, port);
|
9 |
|
10 | DstAddr = addr->addr;
|
11 | Port = port;
|
12 |
|
13 | if ( Len<=0 )
|
14 | ReceiveBufferLen=0;
|
15 | else
|
16 | {
|
17 | ReceiveBufferLen=Len;
|
18 | }
|
19 | udp_disconnect(upcb);
|
20 | }
|
21 | pbuf_free(p);
|
22 | }
|
23 |
|
24 | UDP Nachrichten senden:
|
25 | [c]
|
26 | p = pbuf_alloc(PBUF_TRANSPORT,Len,PBUF_RAM);
|
27 | memcpy (p->payload, pMsg,Len);
|
28 | udp_sendto(upcb, p, &DstAddr, Port);
|
UDP-Nachrichten empfangen:
1 | int Len;
|
2 |
|
3 | Len=ReceiveBufferLen;
|
4 | if (Len)
|
5 | {
|
6 | int CountMax=Len;
|
7 | int i;
|
8 |
|
9 | if (MaxLen<Len) CountMax=MaxLen;
|
10 | memcpy(pMsg, ReceiveBuffer, CountMax);
|
11 | ReceiveBufferLen=0;
|
12 | }
|
13 | return Len;
|
Für jeden Hinweis bin sehr dankbar!