Avatar billede steen-h Mester
06. februar 2021 - 09:05 Der er 2 kommentarer og
1 løsning

Modtager byte omvendt i sigfox backend

Jeg har problemer med de data jeg sender til sigfox backend
Jeg bruger en mkrfox1200 arduino

Jeg sender en struct indeholdende  7  2000  3  4  5  6

Her er ravdata fra backend

07d007000003000400050006

Hvis jeg deler det op i byte byte
07  d0070000  0300  0400  0500  06
07 er OK
2000 decimal er 07D0 i hex

Hvorfor er variabler større en 2 byte byttet rundt ?

Her arduino kode

typedef struct __attribute__ ((packed)) sigfox_message {
  uint8_t mode;
  int32_t kg;
  uint16_t moduleTemperature;
  uint16_t Temperature;
  uint16_t bat;
  uint8_t ekstra;
} SigfoxMessage;

SigfoxMessage msg;


Her indsætter jeg data

msg.mode = 7;
msg.kg = 2000;
msg.moduleTemperature = 3;
msg.Temperature = 4;
msg.bat = 5; 
msg.ekstra = 6;


Her er min send kode

// Start the module
  SigFox.begin();
  // Wait at least 30ms after first configuration (100ms before)
  delay(100);

  // Clears all pending interrupts
  SigFox.status();
  delay(1);

  SigFox.beginPacket();
  SigFox.write((uint8_t*)&msg, sizeof(msg));
  int ret =  SigFox.endPacket(); // if (ret == 0) = OK
  Serial.println("Status: " + String(ret));
  SigFox.end();
Avatar billede arne_v Ekspert
06. februar 2021 - 14:06 #1
Computere findes i 2 varanter:

little endian
big endian

Little endian computere har mindst signifikante bytes foerst.

Big endian computere har mest signifikante bytes foerst.

Det du ser er hvad man forventer for little endian.

Og idag er little endian det mest almindelige. x86 og x86-64 er little endian.
Avatar billede steen-h Mester
06. februar 2021 - 19:35 #2
Tak for det arne_v, så lærte jeg noget nyt.

Har før brugt et gsm modul uden problemer.

Jeg løste problemet med 2 procedure som swapper bytes på arduino
Skal måske døbe dem om.

#if !defined(ntohl)
uint32_t ntohl(uint32_t n)
{
    return ((n & 0xFF) << 24) | ((n & 0xFF00) << 8) | ((n & 0xFF0000) >> 8) | ((n & 0xFF000000) >> 24);
}
#endif

#if !defined(htons)
uint16_t htons(uint16_t a)
{
return (a << 8) | (a >> 8);
}
#endif
Avatar billede arne_v Ekspert
08. februar 2021 - 21:01 #3
Navnene er jo kendte.

htonl = host (order) to network (order) long
htons = host (order) to network (order) short

Network order er big endian.

Saa det er normalt at man har htonl og htons funktioner som konverterer mellem endianess paa host (det system koden koerer paa) og big endian.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester