Здравствуйте, передаю дату из питона на ардуино: 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]. Но что-то ничего не выходит. Я подозреваю, что с типами данных я не так работаю, либо еще что то?
Кажется, необходимость отдельной статьи на wiki "Как прочитать строку из порта" назрела и перезрела. Насколько помню, не было такого, чтобы хоть кто-нибудь на эти и те же грабли не наступил. Постоянно одни и те же ошибки. Сейчас объясню...
1) У микроконтроллера очень мало оперативной памяти и сложение строк в такой ситуации - это издевательство над животным и пир во время чумы вместе взятые. Иметь динамическое выделение памяти и ее фрагментацию, когда свободные байты можно пальцами пересчитать - это все равно, что разбегаться в направлении стены. Нужно управлять ресурсами очень аккуратно! Вы знаете сколько у вас есть SRAMа, знаете максимальную длину команды, сообщения, чего бы там ни было. Делайте приемный буфер фиксированного размера и читайте в него. К тому же, это намного быстрее.
2) Определите, наконец, протокол обмена! Не пересылайте бессвязный мусор без начала и конца. Обозначайте границы сообщения какими-нибудь специальными символами, знаками препинания. Предоставьте способ контроля целостности сообщения, чтобы быть уверенным, что принялось именно то, что посылали: передавайте простые контрольные суммы вместе с полезной нагрузкой, подсчитывайте длину сообщения.
3) Читайте из порта правильно. Следите за началом и концом сообщения. Если Serial.available() говорит, что ничего нет, это не значит, что наступил конец света и ничего уже не будет, это значит, что оно могло не успеть передаться или приняться, а может сдохло от помех по дороге. Отсутствие данных в момент их возжелания в приемнике не есть конец сообщения, конец сообщения - это символ-маркер конца или событие истечения времени, отпущенного на прием сообщения. Используйте таймауты, не давайте программе висеть по пустякам.
Хочу еще подкинуть мини-мысль. Я в платформе под управлением ПК использовал подтверждение команд. То есть ПК кидает команду на ардуин, ардуин ее принимает и если все принято ОК, кидает подтверждение в ответ ПК и ПК пока не получит подтверждение о первой команде не пошлет вторую. Ну там еще есть ряд логики но это главная мысль, подтверждение команды от принимающей стороны. Это решало целую пачку проблем + избавляло заполнение сериал порта ардуина кучей ожидающих данных.
Ок. С теорией более менее понятно. А есть живые примеры "как надо делать"? Рысканье в интернете результатов не дали.
Так начните же, наконец, писать код. Не нужно рыскать в интернете. Вы знаете, что хотите сделать. Знаете язык программирования, на котором это будет реализовано. Что мешает просто сесть и написать код с чистого листа, не подглядывая в шпаргалку ? Давайте тогда разберем все по частям. Вот вам первое задание: Напишите кусочек кода, который читает строку в буфер char[] заданной длины N.
На самом деле я не знаю Питон и Си. Я веб разработчик, и для меня совершенно не понятно что значит "считать строку в буфер char[]", возможно я ошибаюсь но не это ли строка выполняет то что вы говорите? char command = (char)Serial.read();
Эм... ну тогда, может быть, для начала стоит немного ознакомиться с основными конструкциями языка C (C++) ? Как вы собираетесь что-то делать, совсем не зная языка? Нет, эта строка кода не прочитает вам строчку из порта, она лишь пытается считать один символ.
А если первая посылка не дошла - все зависло. ПК должен иметь таймаут. Если в течение таймаута контроллер не ответил - надо повторить посылку либо передать следующую.
Ну я как бы написал: "Ну там еще есть ряд логики..." Более того что ПК ждет тайм аут и проверяет количество непрерывно не доставленных команд, что переводит ПК к установке статуса что связь с платформой потерянна, послеле чего ПК становится в режим пинга платформы ожидая подключения. Так еще и платформа в случае не получения очередной команды в течении какого то времени остановится и перейдет в режим ожидания команды чтобы она не уехала к черту на кулички Просто я не стал тут расписывать более глубокую логику ибо тут речь шла о более простом, к которому подходила именно мысль о том что можно еще использовать подтверждения
php, js. Возможно я неправильно делаю, что пытаюсь написать код на языке который не знаю и не понимаю. Просто так хочется уже что нибудь сделать. А на изучение Python и Си могут уйти месяцы. Вот я и рою интернет в поисках чего то готового.
Я свое изучение ардуина начал с уроков Джереми, очень рекомендую, амперка молодцы перевели, для начинающих как раз позволяет ну хоть что то очень быстро сделать
Довольно близко к С/С++, Вам только синтаксис выучить осталось и освоить немного более строгий подход к работе по сравнению с php. Постарайтесь разобраться, как код работает с физической памятью - станет сильно легче.
В принцепе, если абстрагироваться от получения значение по серал порту, дальше становится все ясно. Возможно у кого то есть есть готовое решение?