Arduino - Läsa ut specifika byte från ett UDP-paket

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
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

Inlägg 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
arte
Inlägg: 317
Blev medlem: 13 januari 2006, 01:18:50

Re: Arduino - Läsa ut specifika byte från ett UDP-paket

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino - Läsa ut specifika byte från ett UDP-paket

Inlägg 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.
Användarvisningsbild
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

Inlägg 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 :whoho:

@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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino - Läsa ut specifika byte från ett UDP-paket

Inlägg 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.
Användarvisningsbild
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

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino - Läsa ut specifika byte från ett UDP-paket

Inlägg 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?
Användarvisningsbild
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

Inlägg 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

Kod: Markera allt

packetBuffer[20]
Jag förstod helt enkelt inte hur buffern fungerade och hur jag kunde plocka ut enskild data ur den.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino - Läsa ut specifika byte från ett UDP-paket

Inlägg 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... :-)
Skriv svar