Как передать структуру между Ардуино и ESP8266 по UART?
Перерыл все форумы, нигде нет ответа.
Задача такая: есть датчик температуры, подключенный к NANO, NANO по Lora (подключен к UART) обменивается данными с ESP8266 (к ESP подключена Lora тоже по UART).
Для начала работы датчика отправляется запрос от ESP8266 к NANO с настройками. Настройки передаю через структуру. В структуре данные разных типов - String, float, uint16_t, uint8_t.
При передаче от ESP к NANO эта структура принимается, но происходит сдвиг между битами и в принятой структуре данные получаются не правильными.
Про порядок расположения данных читал - сначала "тяжелые", потом "легкие".
Нашел что-то близкое на форумах, там пишут про передачу данных побитно.
Передатчик:
Как правильно принять эти данные?
И второй вопрос:
Не правильно считается crc на ESP. Пробовал посчитать без отправки структуры:
Получается случайное число. На NANO crc считается верно.
Перерыл все форумы, нигде нет ответа.
Задача такая: есть датчик температуры, подключенный к NANO, NANO по Lora (подключен к UART) обменивается данными с ESP8266 (к ESP подключена Lora тоже по UART).
Для начала работы датчика отправляется запрос от ESP8266 к NANO с настройками. Настройки передаю через структуру. В структуре данные разных типов - String, float, uint16_t, uint8_t.
При передаче от ESP к NANO эта структура принимается, но происходит сдвиг между битами и в принятой структуре данные получаются не правильными.
Про порядок расположения данных читал - сначала "тяжелые", потом "легкие".
Нашел что-то близкое на форумах, там пишут про передачу данных побитно.
Передатчик:
C++:
struct StrSend {
String testStr;
uint16_t test;
uint8_t crc;
};
StrSend dataTx;
void setup () {
SendStr.testStr = "testing";
SendStr.test = 1234;
SendStr.crc = crc8((byte*)&dataTx, sizeof(dataTx) - 1);
}
void loop() {
Tx();
delay(1000);
}
void Tx() {
for (byte i = 0; i < sizeof(dataTx); i++) {
LoraUART.print(*((byte*)&dataTx + i));
}
}
byte crc8(byte *buffer, byte size){
byte crc = 0;
for(byte i = 0; i < size; i++){
byte data = buffer[i];
for(int j = 8; j > 0; j--){
crc = ((crc ^ data) & 1) ? (crc >> 1) ^ 0x8C : (crc >> 1);
data >>= 1;
}
}
return crc;
}
И второй вопрос:
Не правильно считается crc на ESP. Пробовал посчитать без отправки структуры:
C++:
void setup () {
SendStr.testStr = "testing";
SendStr.crc = crc8((byte*)&SendStr, sizeof(SendStr) - 1);
byte crc = crc8((byte*)&SendStr, sizeof(SendStr));
Serial.println(crc);
}
Изменено: