Python + arduino

Тема в разделе "Arduino & Shields", создана пользователем Frozen, 30 сен 2013.

  1. Frozen

    Frozen Нерд

    Здравствуйте, передаю дату из питона на ардуино:
    ser = serial.Serial(device, 9600, timeout=0)
    ser.write(var)

    Принимаю её на ардуино:

    Вот весь код:

    String getParam(){
    String re;
    while (Serial.available()) {
    re.concat(Serial.read()-48);
    }
    return re;
    }

    int getVal(String p){
    return p.substring(0,2).toInt();
    }



    // Главный цикл
    void loop() {

    while (Serial.available()) {

    char command = (char)Serial.read();
    String param = getParam();
    int p = getVal(param);

    switch (command) {
    case '0':
    Serial.print("raz");
    break;
    case '1':
    Serial.print("dva");
    break;
    }

    }

    }

    А так как я понимаю нельзя передать дату типа : ключ=>значение. Пытаюсь парсить строку, типа первые два числа это ключ, любые следующие параметр[key][val]. Но что-то ничего не выходит. Я подозреваю, что с типами данных я не так работаю, либо еще что то?
     
  2. Unixon

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

    Кажется, необходимость отдельной статьи на wiki "Как прочитать строку из порта" назрела и перезрела.
    Насколько помню, не было такого, чтобы хоть кто-нибудь на эти и те же грабли не наступил.
    Постоянно одни и те же ошибки. Сейчас объясню...
     
  3. Unixon

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

    1) У микроконтроллера очень мало оперативной памяти и сложение строк в такой ситуации - это издевательство над животным и пир во время чумы вместе взятые. Иметь динамическое выделение памяти и ее фрагментацию, когда свободные байты можно пальцами пересчитать - это все равно, что разбегаться в направлении стены.

    Нужно управлять ресурсами очень аккуратно! Вы знаете сколько у вас есть SRAMа, знаете максимальную длину команды, сообщения, чего бы там ни было. Делайте приемный буфер фиксированного размера и читайте в него. К тому же, это намного быстрее.
     
  4. Unixon

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

    2) Определите, наконец, протокол обмена! Не пересылайте бессвязный мусор без начала и конца. Обозначайте границы сообщения какими-нибудь специальными символами, знаками препинания. Предоставьте способ контроля целостности сообщения, чтобы быть уверенным, что принялось именно то, что посылали: передавайте простые контрольные суммы вместе с полезной нагрузкой, подсчитывайте длину сообщения.
     
    Последнее редактирование: 30 сен 2013
  5. Unixon

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

    3) Читайте из порта правильно. Следите за началом и концом сообщения. Если Serial.available() говорит, что ничего нет, это не значит, что наступил конец света и ничего уже не будет, это значит, что оно могло не успеть передаться или приняться, а может сдохло от помех по дороге. Отсутствие данных в момент их возжелания в приемнике не есть конец сообщения, конец сообщения - это символ-маркер конца или событие истечения времени, отпущенного на прием сообщения. Используйте таймауты, не давайте программе висеть по пустякам.
     
  6. NR55RU

    NR55RU Гик

    Хочу еще подкинуть мини-мысль.
    Я в платформе под управлением ПК использовал подтверждение команд.
    То есть ПК кидает команду на ардуин, ардуин ее принимает и если все принято ОК, кидает подтверждение в ответ ПК и ПК пока не получит подтверждение о первой команде не пошлет вторую.
    Ну там еще есть ряд логики но это главная мысль, подтверждение команды от принимающей стороны. Это решало целую пачку проблем + избавляло заполнение сериал порта ардуина кучей ожидающих данных.
     
    atompost нравится это.
  7. Frozen

    Frozen Нерд

    Ок.
    С теорией более менее понятно. А есть живые примеры "как надо делать"? Рысканье в интернете результатов не дали.
     
  8. Unixon

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

    Да, это тоже к вопросу о потоколах.
     
  9. Unixon

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

    Так начните же, наконец, писать код. Не нужно рыскать в интернете.
    Вы знаете, что хотите сделать. Знаете язык программирования, на котором это будет реализовано.
    Что мешает просто сесть и написать код с чистого листа, не подглядывая в шпаргалку ?

    Давайте тогда разберем все по частям. Вот вам первое задание:
    Напишите кусочек кода, который читает строку в буфер char[] заданной длины N.
     
    Megakoteyka нравится это.
  10. Frozen

    Frozen Нерд

    На самом деле я не знаю Питон и Си. Я веб разработчик, и для меня совершенно не понятно что значит "считать строку в буфер char[]", возможно я ошибаюсь но не это ли строка выполняет то что вы говорите?
    char command = (char)Serial.read();
     
  11. Unixon

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

    Эм... ну тогда, может быть, для начала стоит немного ознакомиться с основными конструкциями языка C (C++) ? Как вы собираетесь что-то делать, совсем не зная языка?

    Нет, эта строка кода не прочитает вам строчку из порта, она лишь пытается считать один символ.
     
  12. Megakoteyka

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

    А если первая посылка не дошла - все зависло.
    ПК должен иметь таймаут. Если в течение таймаута контроллер не ответил - надо повторить посылку либо передать следующую.
     
  13. NR55RU

    NR55RU Гик

    Ну я как бы написал:
    "Ну там еще есть ряд логики..."

    Более того что ПК ждет тайм аут и проверяет количество непрерывно не доставленных команд, что переводит ПК к установке статуса что связь с платформой потерянна, послеле чего ПК становится в режим пинга платформы ожидая подключения.
    Так еще и платформа в случае не получения очередной команды в течении какого то времени остановится и перейдет в режим ожидания команды чтобы она не уехала к черту на кулички :)

    Просто я не стал тут расписывать более глубокую логику ибо тут речь шла о более простом, к которому подходила именно мысль о том что можно еще использовать подтверждения :)
     
    Megakoteyka нравится это.
  14. Megakoteyka

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

    Хорошая логика :)
     
  15. Unixon

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

    С какими языками имеете дело?
     
  16. Frozen

    Frozen Нерд

    php, js.
    Возможно я неправильно делаю, что пытаюсь написать код на языке который не знаю и не понимаю.
    Просто так хочется уже что нибудь сделать. А на изучение Python и Си могут уйти месяцы.
    Вот я и рою интернет в поисках чего то готового.
     
  17. NR55RU

    NR55RU Гик

    Я свое изучение ардуина начал с уроков Джереми, очень рекомендую, амперка молодцы перевели, для начинающих как раз позволяет ну хоть что то очень быстро сделать :)
     
  18. Megakoteyka

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

    Довольно близко к С/С++, Вам только синтаксис выучить осталось и освоить немного более строгий подход к работе по сравнению с php. Постарайтесь разобраться, как код работает с физической памятью - станет сильно легче.
     
  19. Frozen

    Frozen Нерд

    Конечно же, я их тоже посмотрел.
    Вы про ардуино?
     
  20. Frozen

    Frozen Нерд

    В принцепе, если абстрагироваться от получения значение по серал порту, дальше становится все ясно.
    Возможно у кого то есть есть готовое решение?