Arduino - Läsa ut specifika byte från ett UDP-paket
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Arduino - Läsa ut specifika byte från ett UDP-paket
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
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
Har aldrig använt eller testat men kolla i https://www.arduino.cc/en/Reference/EthernetUDPRead
Kanske någit i stil med:
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.
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);
}
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
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.
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.
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
@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.
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
> 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.
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.
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
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.
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
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?

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?
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
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.
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
Kod: Markera allt
packetBuffer[20]
Re: Arduino - Läsa ut specifika byte från ett UDP-paket
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...
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...
