Как упомянул Шафик Ягмур в своем ответе, вероятно, это порядок байтов, так как это единственная логическая проблема, с которой вы можете столкнуться при такой низкоуровневой операции. В то время как Shafiks answer в вопросе, который он связал, в основном охватывает процесс решения такой проблемы, я просто оставлю вам некоторые Информация:
Как заявлено на форумах Anduino, Anduino использует Little Endian . Если вы не уверены в том, каким будет порядок следования байтов в системе, над которой вы в конечном итоге будете работать, но хотите сделать свой код полумультиплатформенным, вы можете проверить порядок следования байтов во время выполнения с помощью простого фрагмента кода:
bool isBigEndian(){
int number = 1;
return (*(char*)&number != 1);
}
Имейте в виду, что, как и все остальное, это потребляет часть вашего процессорного времени и замедляет работу вашей программы, и хотя это почти всегда плохо, вы все равно можете использовать это, чтобы увидеть результаты в отладочной версии вашего приложения.
Как это работает, так это то, что он проверяет первый байт int
, хранящийся по адресу, указанному &number
. Если первый байт не 1
, это означает, что байты имеют формат Big Endian.
Кроме того, это будет работать только в том случае, если sizeof(int) > sizeof(char)
.
Вы также можете встроить это в свой код:
float getFromEeprom(int address){
char bytes[sizeof(float)];
if(isBigEndian()){
for(int i=0;i<sizeof(float);i++)
bytes[sizeof(float)-i] = EEPROM.read(address+i);
}
else{
for(int i=0;i<sizeof(float);i++)
bytes[i] = EEPROM.read(address+i);
}
float result;
memcpy(&result, bytes, sizeof(float));
return result;
}
person
Paweł Stawarz
schedule
11.10.2014