Отправить структуру в Serial порт

Тема в разделе "Глядите, что я сделал", создана пользователем Shargon, 24 окт 2012.

  1. Shargon

    Shargon Нуб

    Есть сие

    struct package
    {
    int packageLength;
    char adr[3];
    char badr[3];
    char command[1];
    char addcommand[addInfo];
    char crc[2];
    };

    //отправляем структуру ???
    //struct package = Serial.write(str);

    Как отправить эту структуру по сериал ?

    Спасибо за ваше время!
     
  2. Unixon

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

    Например, так:
    Код (Text):

    package p;
    for (int i = 0; i < sizeof(p); i++)
    {
     Serial.write(*((char*)&p+i));
    }
     
    Только не забывайте, что компиляторы любят делать выравнивание полей структуры в памяти, в результате чего одна и та же структура в бинарном виде может выглядеть по разному для разных компьютеров.
     
    nailxx нравится это.
  3. Shargon

    Shargon Нуб

    У меня явно проблемы с использованием поинтеров.

    есть такой код и такая ошибка : 59: error: array bound is not an integer constant
    Явно нужно выделить статичное место в памяти под "char addcommand[addInfo];" так как это addInfo будет скакать всё время. Я пробовал мудрил, но так и не осилил.

    int packageLength = 0;
    char adr[3];
    char badr[3];
    int addInfo=0;
    char zeroByte[1];
    char command[1];
    char crc[2];

    void setup() {
    Serial.begin(9600); // открывает последовательный порт, устанавливает скорость 9600 бит/c
    }

    void loop()
    {
    if (Serial.available() > 0 )
    {
    if (packageLength == 0)
    {
    packageLength = Serial.read();
    addInfo = packageLength - 11; //nahodim dlinnu bloka dopolnitelnoi informazii
    }

    if (Serial.available() > packageLength - 2 )
    {
    //schityvaem addr
    adr[0] = Serial.read();
    adr[1] = Serial.read();
    adr[2] = Serial.read();

    //schityvaem broadcast adr
    badr[0] = Serial.read();
    badr[1] = Serial.read();
    badr[2] = Serial.read();

    //schityvaem nulevoi
    zeroByte[0] = Serial.read();
    // nuzno li delat proverku na nol?

    //schityvaem komanda
    command[0] = Serial.read();
    //schityvaem dopol inf
    char addcommand[addInfo];
    for (int i=0; i <= addInfo; i++)
    {
    addcommand[addInfo] = Serial.read();
    }


    //schityvaem crc
    crc[0] = Serial.read();
    crc[1] = Serial.read();

    // sosdajem strukturu
    struct package
    {
    int packageLength;
    char adr[3];
    char badr[3];
    char command[1];
    char addcommand[addInfo];
    char crc[2];
    };

    //отправляем структуру ???
    package p;
    for (int i = 0; i < sizeof(p); i++)
    {
    Serial.write(*((char*)&p+i));
    }
    packageLength = 0;
    }
    }

    }




    Я нуб, потому вопрос, как с этим бороться?
    *((char*)&p+i) Если вам не трудно, как это понять?
     
  4. Unixon

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

    Вы не можете выделять динамический массив, таким же образом, как статический.
    Выхода два:
    1) оцениваете максимальную длину сообщения и делаете статический массив нужного размера заранее;
    2) используете оператор new или функцию malloc для динамического выделения памяти; освобождать память не забывайте, у контроллера ее и так крайне мало.
     
  5. Unixon

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

    p - переменная типа package
    &p - адрес переменной p
    (char*)&p - адрес переменной p приведенный к типу (char*) - адресу на массив байт, т.е. здесь мы маскируем структуру package под массив байт
    (char*)&p+i - адрес i-го элемента массива байт, в которых хранится переменная p
    *((char*)&p+i) - разыменует полученный выше указатель, т.е. достаем байт по адресу переменной p + i байт
     
  6. Unixon

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

    Альтернативная запись:
    Код (Text):
    ((char*)&p)[i]
    - i-ый элемент массива байт, в которых хранится структура
     
  7. Shargon

    Shargon Нуб

    Спасибо, всё понятно.
     
  8. thearr

    thearr Нерд

    Unixon нравится это.
  9. Shargon

    Shargon Нуб

    У меня Ардуина связывается не со своим собратом. А с совершенно другим контроллером. Вот только я ещё не придумал, как будет происходить адресация. То есть как ардуинка узнает, что сообщение приходит именно ей, чтобы не забивать и так малую память.
     
  10. thearr

    thearr Нерд

    А это не важно, просто посмотрите код библиотеки и все станет понятно.
     
  11. Shargon

    Shargon Нуб

    Очень интересная затея. Как я понимаю, мы создаём на каждом конце по структуре, которую будем юзать. И с помощью этой библиотеке обмениваться данными с проверкой суммы.
    Круто конечно, надо пробовать, сразу отпадает главная проблема в памяти.