Go Down

Topic: Accesso ad una typdef Struct per lettura byte a byte (Read 135 times) previous topic - next topic

Sandroelec

Ciao a tutti,
ho realizzato una typedef struct con una serie di valori che poi utilizzo per comunicare col PC. Ho collegato una scheda ethernet e spedisco il pacchetto della struct con il comando
Code: [Select]
Serial2.write((byte *)&UTC, sizeof(UTC_Packet));

la mi struttura è
Code: [Select]
typedef  struct {
  uint16_t startU;
  uint16_t SampleTimeFine;
  int Year;
  byte Month;
  byte Second;
  byte Day;
  byte Minute;
  byte Hour;
  uint16_t Milliseconds;
  uint16_t ackU;
} __attribute__((__packed__))UTC_Packet;


ora all'interno di UTC_Packet.ackU vorrei avere il CRC del pacchetto . Ho trovato una libreria che calcola il CRC 16 passando i singoli byte. Come posso puntare ai singoli byte della struttura e calcolare quindi il CRC?
Grazie a tutti!

nid69ita

Con un puntatore, ma i comando ha anche quanti byte ?   Quello lo calcoli con un sizeof della struct
my name is IGOR, not AIGOR

Sandroelec

Ciao! Grazie per la risposta!
La size la calcolo già col size of(struct) ma purtroppo con i puntatori non sono molto capace. Come posso scrivere la funzione ? Cioè è possibile avere tipo un array del tipo
Code: [Select]
byte pippo[size of (struttura) e poi
Code: [Select]
pippo[k]=byte n della struttra ?? spero di essere stato chiaro.

Ho provato con funzioni del tipo
Code: [Select]
byte *pippo = (byte *)&struttura,1; ma non mi funziona niente  >:(  >:(  :smiley-confuse:

nid69ita

#3
Sep 16, 2019, 04:44 pm Last Edit: Sep 16, 2019, 04:46 pm by nid69ita
Serve il link alla libreria ed il comando che usi per calcolare il CRC
Un array in C non può avere lunghezza calcolata a runtime.
Un array il C lo vede come un puntatore e poi con l'indice un aumento dell'indirizzo.
my name is IGOR, not AIGOR

Sandroelec

Ciao, allego il codice completo. La libreria è la uCRC16BPBLib.h di Naguissa. Ora il punto non credo sia una questione di libreria ma piuttosto come accedere a quella struct maledetta. E' molto comoda per l'invio di dati via seriale ma non riesco a trattarla e farla diventare un array di byte ed accedere ai singoli byte per il calcolo del CRC.

Grazie!

Code: [Select]
#include <Ethernet.h>
#include "uCRC16BPBLib.h"
#include <SPI.h>
#include <Wire.h>
#define RST_ETH 9
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 55, 155);
byte server[] = { 192, 168, 55, 100 }; // SI MOTION

EthernetClient client;
uCRC16BPBLib crc;
uint16_t crcStringBytes(byte * string, uint16_t length) {
  uint16_t i;
  crc.reset();
  for (i = length; i > 0; string++, i--) {
    crc.feedByte(*string);
  }
  return crc.getResult();
}

typedef  struct {
  uint16_t startU;
  uint16_t SampleTimeFine;
  int Year;
  byte Month;
  byte Second;
  byte Day;
  byte Minute;
  byte Hour;
  uint16_t Milliseconds;
  uint16_t ackU;
} __attribute__((__packed__))UTC_Packet;

void setup() {

  pinMode(RST_ETH, OUTPUT);
  digitalWrite(RST_ETH, LOW);    // begin reset the WIZ820io
  delay(1);
  digitalWrite(RST_ETH, HIGH);    // begin reset the WIZ820io
  delay(1);
  Serial.print(crcStringBytes(&UTC_Packet, (sizeof(UTC_Packet))), HEX);
}
void loop(){

}

C1P8

Ho provato con funzioni del tipo
Code: [Select]
byte *pippo = (byte *)&struttura,1; ma non mi funziona niente  >:(  >:(  :smiley-confuse:
È il virgola 1, toglilo

E studia l'operatore virgola
„Quando il sole della cultura è basso, i nani hanno l'aspetto di giganti"
Un Karma non costa nulla, ma dimostra che hai apprezzato, e che ne è valsa la pena.........

Diego67

Ciao Sandroelec, come suggerito da C1P8 tramite l'istruzione
Code: [Select]
byte *pippo = (byte *)&struttura ottieni il puntatore "pippo" che punta al primo byte della struttura.
A questo punto per scansionare l'intera struttura ti basta un ciclo "for" incrementando ogni volta il valore del puntatore:
Code: [Select]
byte *pippo = (byte *)&struttura;
for (int n = 0; n < sizeof(struttura); n++)
byte Valore_n_Struttura = *pippo++;

Sandroelec

Ciao a tutti e grazie per le risposte! scusate ma purtroppo sui puntatori e l'operatore virgola sono proprio scarso farò dei ripassi. :smiley-confuse:  :smiley-confuse: 
Tuttavia correggendo il codice in questo modo mi resta un problema, l'indianess...
Per calcolare il CRC avrei bisogno di un array con i dati in forma normale quindi Hbyte,LowByte etc
Invece accedendo all'array mi ritrovo con i dati girati...
Come posso fare?


alla fine ho cambiato libreria pe ril CRC ed uso la CRC.h di Hideakitai e funziona benissimo calcola direttamente su array!
Grazie

Go Up