Передача структуры

Тема в разделе "ESP8266, ESP32", создана пользователем GeoShu, 27 дек 2021.

  1. parovoZZ

    parovoZZ Гуру

    напиши свой алгоритм расчёта контрольной суммы. Для CRC там всё ну очень не сложно.
     
  2. akl

    akl Гуру

    короче делаешь вот такую структуру
    Код (C++):
    struct StrSend {
      char testStr[32];
      uint16_t test;
      uint8_t  crc;
    };
    StrSend dataTx = {"",0,0};
    дальше когда надо суешь туда строку и переменные вот так
    Код (C++):
    strcpy(dataTx.testStr,"djigurda");
      dataTx.test=0xFAFB;
      dataTx.crc=0xFC;
     
    и она начинает нормально отправляться этой приблудной функцией.
    размер массива (32) подбирается исходя из самой возможной длинной строки которая туда может быть положена. при положении желательно следить чтоб не переполнить
     
  3. GeoShu

    GeoShu Гик

    Так понять бы чем старый не подходит. Он же считает для нано. Почему для есп не считает?
     
  4. GeoShu

    GeoShu Гик

    А как собрать потом переданный массив байт обратно в структуру?
     
  5. parovoZZ

    parovoZZ Гуру

    потому как компилятор не обязан располагать поля структуры также последовательно, как он это делает с массивом.
     
  6. akl

    akl Гуру

    а до этого как планировалось собирать?
    по идее в приемнике делаешь такую же структуру, и в нее побайтово копируешь пришедшее. в результате эта строка там сама окажется в собранном виде.
     
  7. GeoShu

    GeoShu Гик

    Так вопрос то и был - как на приемнике собрать все обратно. На приемнике создал структуру. Принимаю байты. А как эти байты преобразовать в структуру? Данные же принимаются как набор байт.
     
  8. SergeiL

    SergeiL Оракул Модератор

    Чтобы это понять, нужно вывести в монитор порта:
    Код (C++):
     Serial.println(sizeof(dataTx));
    На Нано и на ESP ;)
    А потом побайтово вывести значения ячеек памяти, занимаемых структурой, на нано и на ЕСП.
     
  9. parovoZZ

    parovoZZ Гуру

    сказали же - принимай данные в массив. А из массива заполняй поля структуры. Только не через указатель - наступишь на те же грабли.
     
  10. GeoShu

    GeoShu Гик

    Так я и на том же есп считаю. Сначала посчитал контрольную сумму без бита контрольной суммы, потом дописал ее в структуру, пересчитал и вместо нуля получаю значение, что означает ошибку передаваемых данных. В коде же все написал, как делал.
     
  11. GeoShu

    GeoShu Гик

    Так получается тот же парсинг, вид сбоку....
     
  12. akl

    akl Гуру

    memcpy(&dataTx,buf,sizeof(dataTx));

    но опять же, если там структуры будут разные из-за компиляторов, то ничего не получится

    ящитаю, проще всего все передавать текстовым протоколом
     
    GeoShu нравится это.
  13. parovoZZ

    parovoZZ Гуру

    парсинг - это разбор строки. Здесь нет никаких строк.
    Если такие сложности с такими простыми вещами - отказывайся от структуры.
     
  14. GeoShu

    GeoShu Гик

    А как называется разбор массива по элементам структуры? Это не парсинг массива? Это вопрос термина или содержания действия? (Хотел бы разобраться, чтобы использовать этот термин правильно). Я использую его как: разбор набора символов по элементам, чтобы потом можно было их использовать (обращаться к ним).
     
  15. akl

    akl Гуру

    да не нужен никакой парсинг. нужно только определиться, что есть пакет данных, в нем в ячейках условно с 0 по 32 лежит строка символов, с 33 по 34 лежит переменная, а в 35 лежит срс, а потом по этим индескам и вынимать все что нужно. ну и класть туда точно так же в правильные места, а не в структуру
     
    GeoShu нравится это.
  16. parovoZZ

    parovoZZ Гуру

    нет, не парсинг. Просто операцией присваивания переносишь значения из одной области памяти в другую. Каким инструментом это будет сделано - личное дело программиста. Если есть DMA в МК - то лучше через него, хотя иногда это и медленнее, чем просто копирование.
     
    GeoShu нравится это.
  17. DetSimen

    DetSimen Гик

    Если унутре структуры хранятся только типы-значения, то проблем нет, рассматривай саму структуру как массив байт определенного размера и с той и с другой стороны, потом приведешь типы как тебе надо. А вот если в массиве хранится хоть один указатель, тогда тебе надлежит немедленно ехать в Якутию.
     
  18. GeoShu

    GeoShu Гик

    То есть надо определить адрес начала структуры, к нему прибавлять адреса побитно, куда складываются полученные биты. Понятно.
    А можно тогда экспертное мнение - лучше массивом символов передавать данные или структурой? Из MySQL я получаю данные get запросом, то есть текстовую строку. Хотел ее разбирать в есп, у него мощностей побольше будет, а в нано хотел отправлять структуру. Но могу и в нано разобрать точно так же. Что требует меньших затрат памяти и времени обработки?
     
  19. akl

    akl Гуру

    если есть уверенность что и в нане и в есп структуры будут точно одинаковой формы, то без разницы. но я в этом не шарю и ваще не эксперт ни разу

    только ведь можно передавать и не массив символов и не структуру, а пакет данных - то есть обычный массив байтов, в котором заранее известно где что лежит
     
  20. SergeiL

    SergeiL Оракул Модератор

    Там с одной стороны АВР, с другой стороны ЕСП, без pragma pack на ЕСП выравнивание увеличит размер структуры, поля не совпадут :-(