Forum: Mikrocontroller und Digitale Elektronik Arduino: udp.read() - woher kommen die Daten?


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Ich möchte mit einem Arduino und einem kleinen Display eine Art Monitor 
parallel zu einer draußen stehenden LED-Matrixanzeige bauen. Die 
LED-Matrix erhält ihre Daten als RAW-RGB-Block per UDP-Multicast, da 
könnte ich am Arduino bequem die Daten parallel mitempfangen.

Die Auflösung der LED-Matrix beträgt 192x96, was bei RGB über 55kByte 
pro Bild sind. Wenn ich von der Sender-Applikation alternativ für den 
Monitor ein Bild mit halber Auflösung erstellen lasse, bin ich bei 
96x46. In RGB sind das ca. 13KByte - für Arduino immer noch ziemlich 
"sportlich". Wndle ich die 3 Byte RGB für die Übertragung auf insgesamt 
1 Byte (z.B. 3-3-2 Bit), bleiben noch 4,4k ...

Das Problem ist der vermutlich viel zu kleine Speicher des Arduino mit 
ca. 2kByte. Dabei stellt sich mir die Frage, wo kommen die Daten denn 
bei udp.read() eigentlich her? Werden die zwangsweise im RAM des Arduino 
gepuffert oder werden die aus dem Empfangspuffer des Netzwerkchip 
gelesen?

Wenn letzteres, dann könnte es gehen, denn der WIZ5000x hat 16 oder 32 
KByte Buffer ... ein ENC28J60 immerhin 8kByte ...

: Bearbeitet durch User
von Karl (Gast)


Lesenswert?

Viel TCP Stack wird da nicht vorhanden sein. Warum schaust du nicht im 
Code nach?

von Wolfgang (Gast)


Lesenswert?

Frank E. schrieb:
> Das Problem ist der vermutlich viel zu kleine Speicher des Arduino mit
> ca. 2kByte.

Dann nimm einen Arduino mit z.B. 96kByte RAM. Das nimmt dir viele Sorgen 
ab.

von Michael U. (amiga)


Lesenswert?

Hallo,

da UDP ohne Quittung arbeitet, wird es eher das Problem sein, daß Du die 
Daten ausreichend schnell abholst, verarbeitest und dabei möglichst 
wenig Ram brauchst.
Zumindest beim ENC28J60 ist soviel TCP Stack da, wie man in die eigene 
Software einbaut, der hat ja selbst nichts.
Ich habe aus anderen gründen gerade mit den ENC28J60 rumgespielt.
Mit der UIPEthernet-Lib vom Arduino (da steckt fast der komplette 
LWIP-Stack drin)  und dem MQTT-Client den ich benutze sind 23k Flash 
belegt, das stört für die Anwendung nciht weiter, allerdings sind auch 
1,5k Ram belegt und da wird die Luft nach oben schnell dünn.
Die UPD-Daten abholen und direkt zum Display weiterreichen könnte aber 
vielleicht klappen.

Ausprobieren, ein China ENC28J60-Modul bekommt man ab 2,75€, den Arduino 
ProMini ab 1,80€, soviel riskiert man bei einem Fehlversuch alos auch 
nicht.
Wenn man nicht solange auf die Lieferung warten will, landet man ca. bei 
je 5,00€ aus Deutschland.

Gruß aus Berlin
Michael

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Michael U. schrieb:
> Hallo,
>
> da UDP ohne Quittung arbeitet, wird es eher das Problem sein, daß Du die
> Daten ausreichend schnell abholst, verarbeitest und dabei möglichst
> wenig Ram brauchst.
> Zumindest beim ENC28J60 ist soviel TCP Stack da, wie man in die eigene
> Software einbaut, der hat ja selbst nichts.


Ja ... das ist mir alles weitgehend klar, Hardware habe ich hier. Die 
entscheidende Frage ist aber nicht beantwortet:

Wo holt die Funktion udp.read() die Daten her?

Wird dabei auf den Puffer des Netzwerkchips zugegriffen (dann liegen die 
empfangenen Daten nicht im Arduino-RAM) oder "Nur" auf einen Bereich im 
RAM des Arduino?

Die Daten in einem Loop dort rauszuholen und direkt auf ein Display zu 
scheiben wäre dann mein Ziel.

Ich könnte das nat. auch einfach ausprobieren, aber wozu gibts ein 
Forum, wo evtl. jemand bescheid weiss.

Nochwas: Da ein Ethernet-Frame max. 1500 Bytes transportiert, müsste der 
ENC28J60 (oder der WIZ5000x) sowas wie (de-)Fragmentierung beherrschen, 
was ich eher nicht glaube. Bin deprimiert ...

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Frank E. schrieb:
> Die
> entscheidende Frage ist aber nicht beantwortet:
>
> Wo holt die Funktion udp.read() die Daten her?

Öhmmm....

Karl schrieb:
> Warum schaust du nicht im
> Code nach?

Oder soll ich das für dich tun?

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Arduino F. schrieb:
> Frank E. schrieb:
>> Die
>> entscheidende Frage ist aber nicht beantwortet:
>>
>> Wo holt die Funktion udp.read() die Daten her?
>
> Öhmmm....
>
> Karl schrieb:
>> Warum schaust du nicht im
>> Code nach?
>
> Oder soll ich das für dich tun?

Fremden Programmcode nachzuvollziehgen ist nicht gerade einfach.

NEIN, du sollst nicht für mich nachsehen, vlt. findet sich ja noch 
jemand, der dies auch so schon weiss ...

Forum heisst, Wissen zu teilen (wenn es denn vorhanden ist), nicht für 
andere Arbeit zu machen.

von Einer K. (Gast)


Lesenswert?

Frank E. schrieb:
> Fremden Programmcode nachzuvollziehgen ist nicht gerade einfach.

Habe das mal gerade getestet....
Ich finde, so schwer ist das nicht....
Zumindest nicht in diesem Fall.

von Sascha W. (sascha-w)


Lesenswert?

Frank E. schrieb:
> Nochwas: Da ein Ethernet-Frame max. 1500 Bytes transportiert, müsste der
> ENC28J60 (oder der WIZ5000x) sowas wie (de-)Fragmentierung beherrschen,
> was ich eher nicht glaube. Bin deprimiert ...
Da musst du dir selbst was einfallen lassen, mit UPD sendest du ein 
Paket und gut ist es, ein 2.,3.,... Paket hat keine Beziehung zu 
vorherigen Paketen. Wenn du für deine Übertragung mehr als ein Paket 
brauchst, musst du selbst noch mit reinschreiben was Inhalt des Pakets 
ist damit dein Empfänger das zuordnen kann.

Sascha

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.