serial.available() вор!!!

Тема в разделе "Arduino & Shields", создана пользователем lazerrain, 16 ноя 2016.

  1. lazerrain

    lazerrain Нуб

    здравствуйте, товарищи программисты!
    с компа через сериалпорт посылаю в ардуину буфер из 64 байт (буфер не символьный, а байтовый). serial.available() говорит, что принял 63 байта. Куда он нычит 1 байт знает лишь хрен (но я надеюсь, что кто-то из вас это тоже знает).
    буфер меньшего, чем 64 байт, размера принимается нормально.
    проблема возникает на любой скорости и ТОЛЬКО если размер передаваемых данных 64 байта.
    чтобы скетч работал нормально пришлось байты принимать и обрабатывать по кусочкам, но в виду моих склонностей к перфекционизму и любви к изящному коду гложет ощущение, что ситуацию не дожал и так и не выяснил можно ли принять сразу 64 байта
     
  2. ИгорьК

    ИгорьК Гуру

  3. lazerrain

    lazerrain Нуб

    в первоисточнике лишь издевательское подтверждение тому, что буфер ардуины просто обязан принимать 64 байта. моя задача понять почему по факту буфер недозаполняется на 1 байт. мне было бы очень удобно обрабатывать принятое если бы буфер заполнялся в аккурат на 64 байт, так как именно такой длины информацию мне и нужно обработать.
     
  4. ИгорьК

    ИгорьК Гуру

    Как перфекционист вы обязаны:
    - поверить документации;
    - разобраться с кодом, поскольку, если оно может, но не получается - дело в коде;
    - обратиться к автору кода с соответствующей претензией.
    П.С. Хотя, доподлинно известно, что если что-то не так - виновата всегда Ардуина, а не тот кто ее воткнул в электричество.
     
  5. Unixon

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

    А там разве кольцевой буфер не 32 байта вообще? Когда 64 сделали? :)
     
  6. Unixon

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

    Первый или последний байт теряется?
     
  7. rkit

    rkit Гуру

    Системный буфер полностью заполняться не должен. Выделите отдельную память под свое сообщение, и считывайте по мере поступления.
     
  8. lazerrain

    lazerrain Нуб

    только что внимательно просмотрел глазами все поступившие байты. 63 первых принятых байта соответствуют посланным. не хватает самого последнего. эксперимент подтверждает, что однозначно буфер >32;
    мера поступления определяется значением available(), которое при возникновении события serialEvent() сразу-же принимает значение 63. должен ли он полностью заполняться? а почему нет? заполняется же, я же не выбираю насколько ему заполниться и посреди заполнения вклиниться не могу чтобы что-то обработать
     
  9. rkit

    rkit Гуру

    Нет никакого "события serialEvent()".
    Вы можете опрашивать чаще.
     
  10. ostrov

    ostrov Гуру

  11. rkit

    rkit Гуру

  12. ostrov

    ostrov Гуру

    Почему должно смущать? Это прерывание у него работа такая постоянно отслеживать. Но в самой программе можно не прописывать опрос порта во всех местах куда ее занесет. Иногда это очень здорово упрощает жизнь.
     
  13. rkit

    rkit Гуру

    Это не прерывание, и работа у прерывания не такая.
     
  14. rkit

    rkit Гуру

    Это такой же опрос, просто выполняющийся после каждого прохода функции loop. Потому что разработчики ардуино решили, что в микроконтроллере дофига лишней вычислительной мощности.
     
  15. ostrov

    ostrov Гуру

    То есть вы уверены, что если зациклить программу где то внутри loop, то эвент работать не будет?
     
  16. Airbus

    Airbus Радиохулиган Модератор

    А что 63 не хватает?Последний символ признак конца строки он же \0 он же нуль терминатор
     
  17. rkit

    rkit Гуру

  18. ostrov

    ostrov Гуру

  19. ostrov

    ostrov Гуру

    Впрочем, что мешает сделать правильную функцию на прерывании по таймеру, которая бы опрашивала порт на наличие данных? С таким расчетом, чтобы там гарантировано не скопилось больше байт чем может поместиться.
     
  20. ostrov

    ostrov Гуру

    64, ладно пусть 63 байта при скорость 9600 передаются за минимальное время примерно 63 мс. То есть, если опрашивать каждые, например 50 мс, что не так уж нагрузит контроллер, и сливать полученное в буфер, то данные теряться не должны. Надо попробовать, кстати.