Can someone explain this to me? I want to pass an array to a function to modify its values. But I faced some difficulties. First it looks like I get back some trash from memory.
void CustomEthernetClientClass::readMessages(size_t &messageCount, Message *messages) {
digitalWrite(ETHERNET_SS, LOW);
if(_client.available()) {
uint8_t msgBuffer[ETHERNET_RX_BUFF];
uint16_t bufferSize = 0;
while(_client.available() && (bufferSize < ETHERNET_RX_BUFF)) {
msgBuffer[bufferSize] = _client.read();
bufferSize++;
}
Serial.println("converting...");
messages = reinterpret_cast<Message *>(msgBuffer);
messageCount = ETHERNET_FRAME_LENGTH * sizeof(uint8_t) / sizeof(Message);
}
digitalWrite(ETHERNET_SS, HIGH);
}
void loop() {
Message messageBuffer[10];
size_t messageCount = 0;
CustomEthernetClient.readMessages(messageCount,messageBuffer);
Serial.println(messageCount);
if(messageCount > 0) {
for(int i=0; i<messageCount; i++) {
Serial.print("H1: ");
Serial.print(messageBuffer[i].header1 );
Serial.print(", ");
Serial.print(messageBuffer[i].header2 );
Serial.print(", ");
Serial.print(messageBuffer[i].data1 );
Serial.print(", ");
Serial.print(messageBuffer[i].data1 );
Serial.println();
}
}
delay(1000);
}
I get this result (not what I expected...):
converting...
1
H1: 255, 255, 4294967295, 4294967295
But If I modify the readMessages() function like this:
void CustomEthernetClientClass::readMessages(size_t &messageCount, Message *messages) {
digitalWrite(ETHERNET_SS, LOW);
if(_client.available()) {
uint8_t msgBuffer[ETHERNET_RX_BUFF];
uint16_t bufferSize = 0;
while(_client.available() && (bufferSize < ETHERNET_RX_BUFF)) {
msgBuffer[bufferSize] = _client.read();
bufferSize++;
}
Serial.println("converting...");
messages = reinterpret_cast<Message *>(msgBuffer);
messageCount = ETHERNET_FRAME_LENGTH * sizeof(uint8_t) / sizeof(Message);
//This is what I have added
for(int i=0; i<messageCount; i++){
Serial.print("H1: ");
Serial.print(messages[i].header1 );
Serial.print(", ");
Serial.print(messages[i].header2 );
Serial.print(", ");
Serial.print(messages[i].data1 );
Serial.print(", ");
Serial.print(messages[i].data1 );
Serial.println();
}
}
digitalWrite(ETHERNET_SS, HIGH);
}
But after I add some print lines to the code for the purpose of debugging, it started to work. I get what I expected:
converting...
H1: 1, 0, 0, 0
1
H1: 1, 0, 0, 0
Message is a simple struct with fields.
reinterpret_castcases.reinterpret_castis the customary thing to do.