Обмен командами в Processing из Arduino

Тема в разделе "Проводная и беспроводная связь", создана пользователем Matiss, 28 фев 2015.

  1. Matiss

    Matiss Нуб

    Добрый день!
    Разъясните новичку один интересующий момент.
    Как (в частности) правильно отправить команду (читай - какой-либо код, например, "A001") из Arduino в Processing через COM-порт, чтобы он его верно распознал? У меня лишь последовательность чисел на выходе.
    Как могу полагать - либо типы данных не совпадают, либо передача идет побитно, а не сразу целиком..
    В общем нужен совет бывалых!
     
  2. Megakoteyka

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

    Передача данных через COM-порт всегда идет побайтно. Если количество команд укладывается в 256, то можете обойтись одним байтом, это проще всего. Если хотите обязательно многобайтную команду, придется придумать пакетный протокол. Либо передавать строки.
     
    Последнее редактирование: 28 фев 2015
  3. Matiss

    Matiss Нуб

    Я буду вполне рад командам, состоящим из буквы и 3 цифр (напр, A001) или только из пяти цифр (напр, 35001). Тем не менее, даже при передаче одной цифры, напр. 1, выдается последовательность неких чисел.
    Что я здесь делаю не так? Как мне отправить из Arduino "A001" и получить в Processing'е "A001" (ну или 35001 - 35001) ? Будьте так добры помочь в этом :)
     
  4. Megakoteyka

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

    Команды можно передавать в виде текста или байтами.
    В первом случае передается строка "A001", во втором случае передается байт со значением 1.
    Если передаются только команды и их количество укладывается в 256, имеет смысл передавать байтами. Тогда Arduino просто записывает 1 байт в порт, а на другой стороне этот байт принимается и в зависимости от его значения выполняются нужные действия.
    Если передавать строками, то к строке "А001" нужно добавить символ конца строки, а на другой стороне принимать символы и складывать их в буфер до тех пор, пока не попадется символ конца строки. Когда попадется - проанализировать строку, выполнить нужное действие и начать собирать строку заново.
     
  5. Megakoteyka

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

    Все же сколько всего команд ожидается? Если десяток-другой, то строка "А001" избыточна и не имеет особого смысла.
     
  6. geher

    geher Гуру

    Тут вопрос еще в том, как передавать и как читать.
    Serial.print(x) выдаст в порт строку, зависящую от типа переменной, выступающей параметром.
    Если x - целый тип, то это будет строка из цифр, составляющих текстовое представление числа.
    Если x - строка, то это будет та же самая строка.
    Serial.println сделает то же самое, но дорисует в конце посылки два символа, перевод строки и возврат каретки (коды 10 и 13 соответственно).
    Serial.write(x) в случае целого выдаст в порт байт со значением из переменной.
    Соответственно, читая в Processing нужно учитывать, каким именно образом были записаны данные в порт и интерпретировать их правильно.
    Если в порт была записана строка при помощи Serial.print, то и читать, и анализировать ее надо как строку.
    Если в порт был записан байт с некоторым значением, то и считывать его надо как байт, и анализировать как байт с заданным значением.
     
  7. Megakoteyka

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

    Matiss, тащите исходники обеих сторон сюда.