Sida 1 av 1
Arduino - Läsa ut specifika byte från ett UDP-paket
Postat: 24 oktober 2015, 02:48:58
av Magnus_K
Vet inte hur jag ska ställa frågan och tror det blir svårt att förstå vad jag frågar efter men ska göra ett försök.
Just nu tar min Arduino emot ett UDP-paket över Ethernet. Paketet är 28 bytes stort men jag är enbart intresserad av de 8 sista byte:n, vilket är själva payloaden (datan).
Först används
UDPParsePacket() för att få reda på storleken av paketet och sedan
UDPRead() för att rapportera innehållet.
Problemet jag tror jag har är just det dom skriver på UDPRead-sidan, dvs
"If no arguments are given, it will return the next character in the buffer."
Datan jag får ut är 0 och kollar jag med Wireshark så är just första byte:n 0 i paketet.
Min fråga är: Hur skriver jag "argumentet" dom nämner ovan för att läsa ut dom 8 sista byte:n? Det kommer aldrig vara på tal om annat än just dom 8 sista. Detta kommer ej ändras.
(Som sagt, vet inte riktigt själv vad jag pratar om så håll till godo!)
EDIT: Kan också nämna att jag omdefinerat storleken på paket-bufferten från original 24 bytes till 40 bytes.
EDIT2: Tydligen finns det olika versioner av UDP_read() men här tar det stop för mina kunskaper. Som jag förstår så använder jag versionen som enbart läser en byte, vilket givetvis blir tokigt. Referens ->
EthernetUDP.h
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
Postat: 24 oktober 2015, 06:26:14
av arte
Har aldrig använt eller testat men kolla i
https://www.arduino.cc/en/Reference/EthernetUDPRead
Kanske någit i stil med:
Kod: Markera allt
int buffer[28];
int packetSize =0;
void loop()
{
int i;
packetSize += Udp.parsePacket();
if(packetSize>=28)
{
// read the packet into packetBufffer
Udp.read(buffer,28);
for(i=19;i<27;i++)
{
Serial.println("Data %d", buffer[i]);
}
packsetSize-=28;
}
delay(10);
}
Dock så är det oklart vad parsePacket gör ifall du inte läser ut all data. T.ex tänk om du får 2 paket på en gång, då har du 56 bytes i bufferten. Vet inte ifall parsePacket nollställer.
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
Postat: 24 oktober 2015, 11:32:52
av sodjan
Din payload lär väl alltid börja vid samma position.
Enklast är väl att läsa hela paketet och sedan använda
den del som man är intresserad av. Sidorna du länkade
till verkar beskriva hur. Parse för att få längden och
Read för att läsa.
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
Postat: 24 oktober 2015, 13:28:23
av Magnus_K
@arte:
Tack! Efter lite modifiering så fungerade det kalas! Vilken läcker känsla när Arduinon utför saker med kommandon från PLC:n
@sodjan:
Jo det är ju ungefär det här jag försöker göra men förstod inte hur jag läste delar av paketet utan fick alltid bara första byte:n.
Gör ett till inlägg under helgen med en liten sammanfattning med bilder, kod och kanske en liten videosnutt.
Tack än en gång
arte för att du fick in mig på rätt spår.
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
Postat: 24 oktober 2015, 15:00:37
av sodjan
> men förstod inte hur jag läste delar av paketet
Du läser väl alltid från aktuell position (som från början
ju alltid är första byten). Men om du läser samma antal
som Parse returnerar så får du hela paketet. Sen plockar
du den del som du vill ha. Du kan även köra Read() utan
parameter och loopa igenom byte för byte tills du kommer
till det du vill ha.
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
Postat: 24 oktober 2015, 20:40:45
av Magnus_K
Så här ser det ut nu ->
PLC:n och Arduinon kommunicerar.
Ursäkta bildkvalitén.
Resten av kvällen får bli att städa koden och anpassa den till det verkliga projektet -
LED-skylten. Tar och postar den färdiga koden där istället.
@sodjan:
Ska läsa lite mer om det här så kanske ljuset går upp för mig. Det har varit lite väl mycket "klipp&klistra" det senaste.
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
Postat: 25 oktober 2015, 11:16:45
av sodjan
OK...

Jag tyckte att det som står kring ParsePacket och Read är tydligt nog.
Kör UDPParsePacket för att få längden på paketet.
Kör UDPRead (med längden ovan som parameter) för att hämta paketet.
Läs den del av paketet som du är intresserad av.
Fungerar inte det?
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
Postat: 25 oktober 2015, 21:56:13
av Magnus_K
Att du tycker dokumentationen var tydlig nog hjälper ju inte mig speciellt mycket.
Det var just delen
"Läs den del av paketet som du är intresserad av." som jag behövde hjälp att lösa.
arte visade med for-loopen att det var en väg att vandra och senare så har jag testat att plocka ut enskilda byte genom att skriva tex
Jag förstod helt enkelt inte hur buffern fungerade och hur jag kunde plocka ut enskild data ur den.
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
Postat: 25 oktober 2015, 23:02:42
av sodjan
Alltså, bufferten är bara en "array" eller "sträng" (eller hur man väljer
att se på den). Det är bara att läsa delar av det "som vanligt". Inget
speciellt med det bara för att det råkar innehålla UDP data.
Om ditt data ligger på t.ex. pos 21 till 28 (eller whatever) så kan
läsa det med packetBuffer[20] till packetBuffer[27].
> EDIT: Kan också nämna att jag omdefinerat storleken på paket-bufferten från original 24 bytes till 40 bytes.
Då har du en array som kan läsas med packetBuffer[0] till packetBuffer[39].
Bara att läsa de positioner som är intressanta...
