Библиотека WirelessUART для 434MHz модулей HC-11/HC-12 или им подобных

Тема в разделе "Проводная и беспроводная связь", создана пользователем RogerRU, 16 авг 2016.

  1. в ручную? азбукой морзе??
    лучше покажи как правельно данные через UART передавать
     
  2. SergeiL

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

    Да ладно! Писаного @parovoZZ -ом кода я здесь не видел. :)
    Только найденные примеры.
    Мне кажется он теоретик! :)
     
    Mitrandir нравится это.
  3. nednedned

    nednedned Нуб

    Я очень рад за вас - таких умных и образованных, которые потратили время на изучение и осознание всего вот этого вот. Я тоже трачу время, и тоже изучу и осознаю. Но для ускорения процесса написал на форум. Форумы же для этого нужны? Но нет, НА КАЖДОМ форуме найдутся такие кадры, которые, вместо ответов по делу, будут бросать фразы с высока, использую кучу многоточий. Такие ребята ещё смайлики любят (хорошо хоть здесь не такой запущенный случай). Чужая глупость не делает вас умней, и если вы видите безграмотность, то помогите её побороть, а не упивайтесь собственными знаниями.
     
  4. b707

    b707 Гуру

    nednedned - самое правильное - не обращать внимания. Начнете огрызаться - наверняка случайно ляпнете какую-нибудь глупость, за ней другую - и все, тогда точно заклюют.
    Лучше слушайте и задавайте вопросы.
     
    parovoZZ и Mitrandir нравится это.
  5. nednedned

    nednedned Нуб

    Возможность заняться кодом будет только через несколько дней. Как массив байт попробую кончено, но интересно почему такая штука происходит при передаче. Везде абсолютно точно тип данных указан uint16_t. Ещё попробую передавать структуры с ардуино на ESP, посмотрим как в таких условиях будет работать. До встречи через несколько дней.
     
  6. RogerRU

    RogerRU Нерд

    1. Проверьте структуры очень внимательно, они должны быть АБСОЛЮТНО одинаковы в т.ч. последовательность элементов, а лучше всего создать отдельный .h файл создать структуры там и прилинковать его к каждому устройству в проекте.
    2. я использую атрибут __attribute__((__packed__)) в структурах - он выравнивает структуру очень полезно если платформы разные AVR, ARM и т.д. Подробнее об этом тут
    struct MyStruct
    {
    uint8_t id;
    uint16_t levelMax;
    }__attribute__((__packed__));
    3. Я обновил библиотеку на гитхабе, теперь там есть параметр debugMode если его сделать true то в сериал он будет писать размер того что получил или отправил и писать ошибку если размеры разные.
     
  7. parovoZZ

    parovoZZ Гуру

    на приеме я делал так (SPI, правда, но какая разница?)
    Код (C++):


    uint8_t SPI_Send(struct SPI_Response *SPI_Resp)

    (*SPI_Resp).ID = SPI_ReadByte();
                    (*SPI_Resp).Data = (uint16_t)SPI_ReadByte();    //Старший байт
                    (*SPI_Resp).Data  = ((((*SPI_Resp).Data)<<8) & 0xff00) | (uint16_t)SPI_ReadByte();//младший байт
    Структура :
    Код (C++):

    struct SPI_Response{                      
        uint8_t    ID;                            
        uint16_t Data;                          
        };

     
    С передачей проще - взяли указатель на начало структуры и погнали.
     
  8. а если байт потеряется? а если мусор?? через модемы же гоним.
    там проверка контрольной суммы, определение свой\чужой?
     
    SergeiL нравится это.
  9. RogerRU

    RogerRU Нерд

    если про библиотеку вопрос то да
     
  10. Igor68

    Igor68 Гуру

    ...Да по поводу выравнивания. Всё вроде нормально... но писалась программа одна сервер на Debian (GCC) другая клиент Windows(Visual Studio 2005). Вроде и опции включил... но потом не хотелось структуру заменять массивом для обмена с указанием смещения типа:
    Код (C++):
    uint8_t par8=(*(uint8_t*)(&buf + _adpar8));
    //где _adpar8
    #define _adpar8 0x20 //смещение для par8 (тип uint8_d)
    делал и такое... но надо было переписывать до... А механизмы выравнивания для разных компиляторов разные. И вот это помогло:
    Код (C++):
    typedef struct _DAT1
    {
       uint32_t    par1_32;
       float       par1_float;
       uint16_t   par1_16;
       uint8_t      par1_8;
       uint8_t     buf8[0x100];
    } DAT1;
     
    Это помогло и работало и там и там, а обмен пакетами был как надо. Сначала данные более "тяжелых" типов... и по убыванию.
     
  11. parovoZZ

    parovoZZ Гуру

    Эмми... запутался в указателях... сперва берём адрес первой ячейки buf, смещаем на 0x20, затем по этому адресу берём данные и приводим их к байту? А для чего тогда ещё одна звездочка)))?
     
  12. Mitrandir

    Mitrandir Гуру

    берем адрес buf, смещаем его, приводим к типу указатель на uint8_t и далее разыменовываем
     
  13. parovoZZ

    parovoZZ Гуру

    А можно здесь поподробности? Кто-то из них 64 бит? Для чего адрес смещать аж на 32 ячейки?
     
  14. SergeiL

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

    Только вызов функции...;)
    Ну я же говорил:
     
    Пушной звер нравится это.
  15. nednedned

    nednedned Нуб

    Здрасьте вам! Не хилый у меня перерыв получился. Всё заработало, огромное спасибо всем кто участвовал)
    1. При передаче простых структур действительно помогает явное указание типов данных типа uint16_t.
    2. У меня был затык при передаче вложенной структуры. Причём очень интересная ситуация:
    Код (C++):
    struct BOX_STRUCT //эта структура занимает 2 байта, всё ОК
    { uint16_t r1; }
    Код (C++):
    struct TIME1
    { uint8_t h, m, s; };

    struct BOX_STRUCT //эта структура занимает 3 байта, тоже всё ОК
    { TIME1 TIME;
    };
    Код (C++):
    struct TIME1
    { uint8_t h, m, s; };

    struct BOX_STRUCT //а вот эта структура занимает 6 байт, хотя должна занимать 5
    {
    TIME1 TIME;
    uint16_t r1; }
    В итоге, при добавлении атрибута __attribute__((__packed__)) последняя структура начинает занимать 5 байт и без проблем передаётся библиотекой.

    Ещё раз спасибо за помощь! Буду рад если кто-нибудь разъяснит почему последняя структура без выравнивания имеет размер в 6 байт (это на ESP, на ардуино она весит 5 байт).
     
  16. DIYMan

    DIYMan Guest

    https://habr.com/post/142662/
     
    Mitrandir нравится это.
  17. regent.correon

    regent.correon Нерд

    Спрос уже есть! Тоже озадачился обменом данных для системы Умный Дом. Ввиду того что с сериалом почти не работал испытываю трудности в написании кода.
     
  18. regent.correon

    regent.correon Нерд

    И даже не лучший теоретик, как оказалось.
     
  19. Веталь

    Веталь Нуб

    Здравтсвуйте, я столкнулся с проблемой конфликта библиотек
    SoftwareSerial и Servo
    Будет ли ваша библиотека конфликтовать с библиотекой Servo?
     
  20. RogerRU

    RogerRU Нерд

    Нет не будет.
    Библиотеке все равно с чем работать с SoftwareSerial или с HardwareSerial
    Но если есть хоть какая нибудь возможность не используйте SoftwareSerial.
    Что до совместной работы c Servo, то SoftwareSerial полностью блокирует работу МК во время отправки и приема полных байтов. Поскольку в это время прерывания таймера не обрабатываются то сервоприводы не синхронизируется. + она весит до хрена в памяти.