Как собрать string от Com порта?
- Войдите на сайт для отправки комментариев
Втр, 15/05/2012 - 01:51
Всем доброго!
Вопрос таков: Delphi через Com порт отсылает PWideChar (в теории, да и на практике происходит это посимвольно). Как собрать слово в Arduino и считать его? Я понимаю, как это реализовать в Delphi, но как в Arduino что-то не догоняю...
Заранее спасибо за ответы
Примерно как-то так:
если посимвольно,то удобно в конце оправки поставить какой то "флажок" окончания пердачи,например '\0'
а в ардуине прописать
как то так,это только пример.я так принимал данные с Rx когда принимал данные посылаемые через bluetooth терминал с Andriod смартфона.
В этом случае у вас из всей отправленной строки прочитается только первый символ, а все остальное потеряется. И зачем создавать какой-то свой буфер и при этом очищать аппаратный?
потому что при связи через BT с андроид терминалом,я столкнулся с проблемой что принимаетья только первый символ бесконечное количество раз,а не вся строка.хотя это может только печатлся в IDE терминале первый символ.тем неменее мне такое решение помогло передавать с Андроид терминала строчки и расшифровывать их в команды на ардуине.
вот мое точное решение
в качестве флажка окончания используеться '\n' - то есть ASCII код Enter'a
без Serial.flush() тоже сработало бы?
Это скорее всего какие-то особенности вашего ВТ-модуля или глюк.
Если я правильно понял inString += (char)inChar; равносильно inString := inString + inChar; ?
Вот только я засек объявление inChar, а inString отчего-то нет.
Судя по сайту, string объявляется через Char массив.
2maksim, спасибо, вечером попробую...
2mixail844 - разумеется посимвольно, и через аски, так надежнее. Флаги стоят уже, хоть они особо и не нужны. Наверняка есть какой-нибудь SizeOf(Serial.available()); По нему и засекать размер передаваймого потока, а дальше в цикл цифирь посылать.
З.Ы. - Тяжко после Паскаля на С переползать...
Наверняка есть какой-нибудь SizeOf(Serial.available()); По нему и засекать размер передаваймого потока, а дальше в цикл цифирь посылать.
Нет. И быть не может. Откуда этому гипотетеческому SizeOf знать сколько байт данных СОБИРАЕТСЯ послать передающий? Функций возвращающих значения из будущего - не существует. Так что при вычитывании потока есть три подхода:
Среда Arduino не в состоянии прочесть буфер порта и узнать сколько данных готовы к приему?
Что вы понимаете под средой Arduino?
Если IDE, то естественно не в состоянии.
Если исполняемую программу, то она способна определить количество ПРИНЯТЫХ данных (Serial.Available()), уже находящихся в приемном буфере UART/USART.
Сколько данных еще поступит ("сколько данных готовы к приему"), одной лишь передающей программе известно. И никакой другой супер-пупер-контроллер не в состоянии это предсказать.
О чем вам leshak и сказал.
мдас.... а память ограничена....
maksim - не вышло. Даже через Serial Monitor выдает пустой результат. Переделал так:
Теперь при отсылке Low мне Serial Monitor выписывает:
String: L
String: »
String: 2
String: ?
String: I
Первая проблема - декодинг отсылаемой команды.
Вторая проблема - программа не объединяет символы в строку
По прежнему требуется помощь. Заранее спасибо за ответы.
Так естественно не вышло, для того что бы в сериал монитор вернулась собранная строка нужно что бы в конце отправляемой строки был символ '\n' - переход на новую строку, в сериал мониторе в правом нижнем углу вместо "No line ending" выбираете "Newline" и тогда все будет работать. Если хотите, то можете использовать какой-нибудь другой символ для определения конца сообщения.
Ну смотрите:
1) По прежнему ругается на inString. Помогло char объявление переменной в начале.
2) inString = ""; не пашет. Переписал на inString = 0;
3) Сменил метод отправки на Newline в Serial Monitor, в итоге на команду Low мне программа выдала вот что:
String: <
????????
Я так понимаю из-за char пересылается последний символ... Но выдача все равно кривая...
Так обЪявите переменную inString как String, а не как char и все у вас получится.
Ну а если нужен именно char, то примерно как то так:
т.е. тут меня жестоко обманули и тип string таки объявляется через string?
Нет. Вас там не обманули. Чуть-чуть не допереводили (скорее всего перевод был, какой-то болле старой версии).
Есть string - обычные C-шный строки. Которые суть массив чаров с последним нулем, а есть String (с большой буквы). Который суть "объект", утилита-обертка упрощающий работу со строками. Как-бы такая маленькая "библиотека для строк".
ясно, в общем юзать можно - самое главное. Спасибо. Вечером попробую - отпишусь. А вообще, на мой взгляд, исходников по таким вещам остро не хватает. Допишу минималку, скину сюда, пускай пользуются люди.
Каюсь, упустили, перевод делался к версии 0.18, где еще не было String как объект, а только string массив char. Вскорости допереводим.
Во, а то я чуть с ума не сошел)). Как так - нет строк)))
Каюсь, упустили, перевод делался к версии 0.18, где еще не было String как объект, а только string массив char. Вскорости допереводим.
Если можно, то начните "доперевод" с раздела "Bitwise Operators". Регулярно на форуме всплывают вопросы, где нужно отослать к этому разделу, а приходится слать на.... оригинал :) Все-таки это одна из базовых и часто используемых "фичей языка".
Ведь все очень просто - у Arduino есть класс замечательный класс Stream, с функцией readString(). Она есть в Ethernet и Serial библиотеках. Однако, почему-то в Serial вариации первый символ всегда игнорируется. И весь код получается таким:
Serial.read() сжирает первый символ
правильный код
Serial.read() сжирает первый символ
правильный код
Код то правильный, но когда в порт приходит байт = 0, то происходит выход из цикла. Как быть в такой ситуации?
Спрашиваю потому что есть необходимость в устройстве которое получает инфу из программы. А единственный способ ее получить, это эмуляция принтера Epson TM-88. А там при инициализации 5 байтом приходит 0.
Почему условия у меня срабатывают только один раз?
В порт отправляю temp#
в мониторе получаю
Почему условия у меня срабатывают только один раз?
Предположу что в сериале остаются символ(ы) перевода строки, коретки которые ложаться в начало переменной inString . После принятия символа '#' надо подчистить сериал.
в 19 строке выведите значение inString, все станет понятно.
Почему условия у меня срабатывают только один раз?
на что это повлияет если оно чистися в конце ?
код так читается намного легче
Как убрать символ перевода строки?
Почему условия у меня срабатывают только один раз?
на что это повлияет если оно чистися в конце ?
прав. Сослепу показалось. что очистка inString происходит в последнем If
Согласен насчет символов перевода строки.
Irinka, искать команды во входящим потоке жесткой операцией сравнения (str == "temperature") - плохой метод. Один лишний символ в Сериале - и условие уже не работает. Правильнее - искать вхождение нужной строки функцией indexOf
Как убрать символ перевода строки?
его не надо убирать
Irinka, искать команды во входящим потоке жесткой операцией сравнения (str == "temperature") - плохой метод. Один лишний символ в Сериале - и условие уже не работает. Правильнее - искать вхождение нужной строки функцией indexOf
Осваиваю потихоньку, всё интересно, всё хочу попробовать
это неверно. Совершенно не факт, что к моменту выполнения строки 22 у васв сериале будут только символы перевода строки. Вы так нужные символы потрете.
пошел ардуину откапаю...
пошел ардуину откапаю...
мне лень за ардуиной лезть - я и так скажу.
Алгоритм:
1. Читаем сериал посимвольно, прибавляем к строке Str
2. Если символ "#" - ищем в строке Str нужные команды методом Str.indexOf(). После обнуляем строку
3. Если символ == конец строки => обнуляем строку Str
Все, ничего специально чистить не надо.
Работает, НО:
Почему если отправляю t1e1m1p# получаю Temperatura,а не Net komandy
Irinka, все верно.
В строках 11 и 12 лучше искать "temp#"и "davl#".
Чтобы понять, почему ищется не то - добавьте вывод значения inString в сериал при совпадении температуры. давления и "нет команд"
Irinka, все верно.
В строках 11 и 12 лучше искать "temp#"и "davl#".
Чтобы понять, почему ищется не то - добавьте вывод значения inString в сериал при совпадении температуры. давления и "нет команд"
Если ищу "temp#"и "davl#" то при вводе temp# или davl# одинаково получаю Temperatura
Как так?
кавычки нужны двойные !
Упустила из виду, спасибо. Получилось, работает.
Разобралась как принимать/передавать в ардуино, теперь нужно разобраться с esp
Может тоже подскажите?
http://arduino.ru/forum/apparatnye-voprosy/podklyuchenie-hc-06-k-nodemcu
А меня удивляет другое, я чищу сериал, а 13/10 все равно цепляется в начало строки inString
Народ, привет! подскажите пожалуйстакак решить проблему - отправляю в порт строку
ND#SA=0&SB=1&ST=0&SC=0&PS=0&TW=255&TA=271&HD=34&PHA=834&PHB=700&UF=0
далалее читаю ее из порта и парсю, так вот парсится нормально, а вот с отправкой проблема - отправляется только часть строки, вот что в мониторе после отправки строки:
Заранее спасибо!
А что у Вас означает число 50 в 9-й строке?
И вообще, какой длины строку Вы, по Вашему мнению, хотите отправить?
andriano, понял, спасибо! :)
Что-то я туплю...
Отправляю "ping#" через микросхему MAX485
Считываю:
Если ставлю двойные кавычки, то поллучаю в ответ только Ок
Если кавычки одинырные, то неыважно что отравляю, получаю только Temperatura
#13 Serial.println(inString);
Значит никакой "ping#" не приходит. И то, что в одинарных кавычках - не строка. Применение такой конструкции может дать любые результаты.