Преобразование из Float в String
- Войдите на сайт для отправки комментариев
Пт, 15/11/2013 - 15:07
Всем привет. Не могу понять как сделать преобразование из из Float в String. Что то пытался сделать но не получилось:(
#include "Ultrasonic.h" // sensor connected to: // Trig - 12, Echo - 13 Ultrasonic ultrasonic(12, 13); void setup() { Serial.begin(9600); // start the serial port } void loop() { String dist_str; float dist_cm = ultrasonic.Ranging(CM); // get distance dist_str=dist_cm; Serial.println(dist_cm); // print the distance delay(100); // arbitary wait time. }
Я использую библиотеку floatToString.
Мне казалось, что для вывода через Serial.print() - не надо преобразовывать типы. А так - есть функция dtostrf().
Мне казалось, что для вывода через Serial.print() - не надо преобразовывать типы. А так - есть функция dtostrf().
да посути не нужно. но я принимаю данные через порт в делфи, если туда так просто отправлять приходят иероглифы китайские:( так что отправляю вот так : Serial.write(48); (48- код числа в ascii "0") да и отправлять приходится по одному символу с задержкой в несколько миллисекунд:( если кто то знает другой спооб реализации, и расскажет как сделать то буду признателен:)
Я использую библиотеку floatToString.
вот уж не думал что даже библиотека для этого есть:) попробую поискать и разобраться:)
А ссылки у вас нету на не а то что то в нормальном виде найти не могу:(
А вообще задача такая повесить ультразвуковой дальномер на сервопривод - и отправлять в прогу на делфе данные расстояния и угла поворота, и из этих данных строить подобие карты местности:) может уже кто то делал что то подобное на форуме?
Я планировад, но у уз дальномеров очень хреновая точность на далёких расстояниях.
Проводил эксперемент со своим HC-SR04 - направлял в одну точку и снимал две дельты.
Первая усреднённая между двумя бликими замерами, вторая между максимальным и минимальным временем за сессию
Расстояние до точки составляло около 3,5 4-х метров (точно не мерял так как интересовали дельты, а такое расстояние на глаз соответствовало планируемым рабочим).
первая дельта составляла 11-14 см, вторая до полуметра. что на таких расстояниях весьма ощутимо
да он всеравно в пределах квартиры ездить будет, а есди на далеких плохая точность то можно сделать чтоб белее 2ух метров показаня не учитывал( если я конечно правильно вас понял). на первое время пойдет:) да и с ардуино поразбираюсь заодно.
ну на 4-х метрах разница вполне ощутимая всё таки
возможно, так далеко не проверял. направлял в потолок показывал 255см думаю примерно так и есть. Да и это не первоочередная задача, пока главная цель получить данные в делфи:)
Я говорю не про то что врёт, а про то чтомаксимальный разброс получается в полметра, а в среднем разброс в 11 см, если нанести такие значения на координатную плоскость вряд ли даже сможешь опознать что где стоит)
имхо sprintf() рулит
имхо sprintf() рулит
Я говорю не про то что врёт, а про то чтомаксимальный разброс получается в полметра, а в среднем разброс в 11 см, если нанести такие значения на координатную плоскость вряд ли даже сможешь опознать что где стоит)
не совсем понял:) вы имеете ввиду что угол у датчика есть определенный и чем дальше датчик от поверхности тем больше будет сторона противолежащая углу, и разрешающая способность будет хреновой? если это так то я этого не учел:( а точнее не думал что такой большой угол. но всетаки для начальных експериментов думаю хватит, да и как мне кажется по мере приближения к объету точность будет возрастать, и карта будет более высокого разрешения. да и еще в планах энкодеры на колеса установить отслеживающие перемещения.
я не знаю и не в давался в технические подробности почему так происходит. Но скорее всего да так, то есть с большего сектора может прилететь эхо которое он зарегистрирует при этом погрешность измерения скачет на расстояниях в пределах квартиры просто офигительно. А так по мере приблежения точность повышается и разброс уменьшается.
к этому веселья добавляется если вещь состоит из разных материалов, то тоже вносит погрешность в измерения. Так тканями эхо практически глушиться либо пропускается, мою футболку он упорно игнрировал. Приемлема точность и стабильный разброс в 1-2 см он показал только на расстояниях в районе 10-15см. В итоге отказался от идеи картографирования и хочу сделать предустановленную карту помещений (походить по комнатам с рулеткой) и перевести в удобоваримый вид. О энкодарах я думал, но пока отказался - во первых самое банальное пинов пока нет и шилд мой напоминает проводной ад пока, а во вторых энкодеры фикисруют положение колеса, а оно может пробуксовывать и не знаю как будет с оборотами на разных поверхностях. Думал раскурочить пару мышек с их сенсорами, но пока не понял как они работают.
А так я тоже делаю робота двухколёсного, что арддуинка работает с железом а мозгами будет служить другой комп. Но я планирую взять росбери пай поставить на него линукс и прогу на яве которая все будет обрабатывать и посылать команды ардуинки
http://arduino.ru/forum/proekty/dvukhkolesnyi-robot-s-dvukhkomponentnym-...
я тоже под энкодер думаю мышку курочить:) разобрать сервоприводы и туда поставить энкодеры. А вообще изначально было в планах использовать 2е электроотвертки под привода.
Вот фотки моего добра:
http://modernlife.ucoz.ru/photo/1-0-2-3
http://modernlife.ucoz.ru/photo/1-0-3-3
http://modernlife.ucoz.ru/photo/1-0-4-3
ну я дума из мышки взять не энкодеры а сами оптические датчики, которые бы регистрировали положение и движение относительно пола
мне кажется что этот датчик(вроди как слышал что это подобие камеры) будет давать больше погрешности чем энкодер на колесах, он более требователен к поверхности, а мышкой ведь где угодно не повертишь, да и на стыках и коврах проблемы будут, и датчик нужно прижатым держать к полу, а это проходимость робота ухудшит.
Использоать мышь нужно вместе с електроникой, насколько я помню интерфейс (PS/2.) там не особо сложный, даже пример гдето видел работы с ардуино.
http://robocraft.ru/blog/arduino/101.html
Думал об эом но у мышки сликшом много не нужного...
Думал об эом но у мышки сликшом много не нужного...
не так там уж много и не нужного, а кнопки и енкодер можно выпаять чтоб не мешались.а подключать сам датчик у которого около 20ти ножек помойму задача не из простых.
Походу разобрался как все это делать, переводим в char и отправляем елементы чара в порт по одному с задержкой небольшой по времени. Но есть еще одна проблмка ардуина шлет только ограничное количество координат. например прогонит циклов 10 и останавливается пока по новой не включи монитор порта или перегружу дуину. и заметил особенность в строке dtostrf(dist_cm,9- чем меньше это чесло тем больше циков прогоняет дуина, 6, dist_str); вроди это размер char массива? как исправить этот косяк хочу стобы данные принимались постоянно.
Пример скетча:
понял в чем суть проблемы, функция ultrasonic.Ranging(CM) выдает длинны тыкого вида 12.0, 200.0 то есть числа разной длинны, а в порт я отправляю фиксированое количество символов, вот в конце ему отправить нечего видать вот он и тупит:(
Cделать проверку есть ли символ в ячейке. Проверка проходит шлет вроди какк нормально в монитор порта, но в делфи выходит одни квадраты:(
уже не знаю что делать:( одна проблема решается тут же другая появляется:( может попробовать отправлять массив char с помощью цикла For? только поможет ли это.
а ни кто ни знает других вариантов как делфи связать с ардуино? кроме того как непосредственно через сам делфи принимать данные? может можно через какую нибудь стороннюю прогу.
Вот написал с циклом for но он отправляет всего одну первую длинну и все:(
1. я понять не могу, почему вы посимвольно строку обрабатываете, да еще и задержки между символами ставите? или у вас компьютер медленнее ардуины работает и ему фора нужна? получайте из буфера порта целую строку и работайте с ней как со строкой, тогда и не будет никаких проблем в случаях разной длины
2. что значит "связать дельфи с ардуиной"? дельфи не знает, да и никогда не узнает ничего про ардуину, открывайте последовательный порт и читайте из него данные хоть от ардуины, хоть от электронных весов, хоть от чего угодно, чего в ком-порт втыкается. али оскудел интернет на нужные компоненты? :)
1. я понять не могу, почему вы посимвольно строку обрабатываете, да еще и задержки между символами ставите? или у вас компьютер медленнее ардуины работает и ему фора нужна? получайте из буфера порта целую строку и работайте с ней как со строкой, тогда и не будет никаких проблем в случаях разной длины
Кроме компьютера и Arduino имеется третий участник процесса - UART. И таки да - он работает медленнее и ему фора нужна. При настройках ТС (9600) UART способен перекачивать всего лишь около 1000 символов в секунду, т.е. один символ каждую миллисекунду (5 миллисекунд задержки, конечно, многовато). Будете пихать в него символы быстрее - через конечное (и весьма небольшое время) буфер забьется и программа все равно приостановится в ожидании освобождения части буфера (в лучшем случае) или начнет писать по еще не отправленному (в худшем).
Это насчет задержек.
А насчет посимвольной обработки - ТС, кроме отправки символов, еще и замену ' ' на '0' производит. Что как бы предполагает сравнение каждого символа на равнество пробелу.
А вот что ему действительно надо сделать, так это повнимательнее присмотреться к объявлению массива distr_str и ответить на вопрос, сколько символов он может вместить - 3 или 4.
И уже после этого попытаться ответить на вопрос - куда пишется символ с порядковым номером 3 (при отсчете от нуля)?
1. я понять не могу, почему вы посимвольно строку обрабатываете, да еще и задержки между символами ставите? или у вас компьютер медленнее ардуины работает и ему фора нужна? получайте из буфера порта целую строку и работайте с ней как со строкой, тогда и не будет никаких проблем в случаях разной длины
2. что значит "связать дельфи с ардуиной"? дельфи не знает, да и никогда не узнает ничего про ардуину, открывайте последовательный порт и читайте из него данные хоть от ардуины, хоть от электронных весов, хоть от чего угодно, чего в ком-порт втыкается. али оскудел интернет на нужные компоненты? :)
1.посимвольно обрабытываю, птомучо в делфе когда сразу строку отпраляю приходят иероглифы китайские, и если без здержек по времени тоже в делфе че попало пишет:(
2.А связать я имел ввиду черз ком порт принимать данный какой нибудь другой прогай, а потом через эту прогу делфи отправлять. а порт в делфе я и так открываю. Сначала она все расстояния нормально принимает а пото начинает иероглифы гнать:( надоело уже:(
вот что ему действительно надо сделать, так это повнимательнее присмотреться к объявлению массива distr_str и ответить на вопрос, сколько символов он может вместить - 3 или 4.
И уже после этого попытаться ответить на вопрос - куда пишется символ с порядковым номером 3 (при отсчете от нуля)?
у меня странно получилось, символ [0] пустой а [1]-1 [2]-9 [3]-9 (это число 199см).
а с самой делфи походу какието проблеммы с буфером, после того как общее количество переданых символов которые в memo пишутся он начинает гнать и пишет иероглифы, в основном квадраты.
Кроме компьютера и Arduino имеется третий участник процесса - UART. И таки да - он работает медленнее и ему фора нужна. При настройках ТС (9600) UART способен перекачивать всего лишь около 1000 символов в секунду, т.е. один символ каждую миллисекунду (5 миллисекунд задержки, конечно, многовато). Будете пихать в него символы быстрее - через конечное (и весьма небольшое время) буфер забьется и программа все равно приостановится в ожидании освобождения части буфера (в лучшем случае) или начнет писать по еще не отправленному (в худшем).
Это насчет задержек.
ерунду-ссс, пардон-ссс, пишите..... тут не какой-то идеальный сферический ардуино в вакууме, а вполне конкретный датчик, у которого рекомендованный производителем цикл опроса - 50 мс, т.е в самом идеальном случае датчик успеет за 1 секунду послать результаты 20 измерений. и для 20 чисел ему 9600 не просто за глаза, а с многократным запасом.
Это насчет задержек.
А насчет посимвольной обработки - ТС, кроме отправки символов, еще и замену ' ' на '0' производит. Что как бы предполагает сравнение каждого символа на равнество пробелу.
А вот что ему действительно надо сделать, так это повнимательнее присмотреться к объявлению массива distr_str и ответить на вопрос, сколько символов он может вместить - 3 или 4.
И уже после этого попытаться ответить на вопрос - куда пишется символ с порядковым номером 3 (при отсчете от нуля)?
ТС сам не знает, чего хочет. у него два этапа передачи данных. 1 этап - датчик->ардуино и 2 Этап ардуино -> пк. на первом этапе данные звамечательно в ардуино прилетают, прилетают правильно и разборчиво. но в виде числа. а на пк он это число разобрать не может или не хочет, хз. вместо того, чтобы на ардуине преобразовать число в строку (собсно, так тема и называется, да ведь? ;) и передавать как строку на пк зачем-то стали ломать работающий 1 этап, изобретать трудности типа замены пробелов на 0 и потом героически их преодолевать...
мой настоятельный совет - выключить нахрен датчик на время, завести
float val = 123,45;
const *char str="Hello world";
и научиться их передавать через последовательный порт в компьютер. без всяких разбивок на символы и пр...
а когда получится - тогда и проблемы все отпадут сами собой
мой настоятельный совет - выключить нахрен датчик на время, завести
float val = 123,45;
const *char str="Hello world";
и научиться их передавать через последовательный порт в компьютер. без всяких разбивок на символы и пр...
а когда получится - тогда и проблемы все отпадут сами собой
да пробовал передовать строку сразу, так ток иероглифы получаю в делфи, в дгугих мониторах com порта риходит нормально все. в делфи тока принимает ascii кодировки, например шлю Serial.write(48) в делфе 0 приходит.
А вообще действительно попробую поотправлять как вы сказали.
играйтесь с настройками компонента. если вам годится строка, то пробуйте serial.write и serial.print
у меня странно получилось, символ [0] пустой а [1]-1 [2]-9 [3]-9 (это число 199см).
а с самой делфи походу какието проблеммы с буфером, после того как общее количество переданых символов которые в memo пишутся он начинает гнать и пишет иероглифы, в основном квадраты.
Ну а теперь внимательно перечитайте статейку о массивах (особенно "Доступ к элементам массива") и попробуйте понять, что же у вас здесь не так...
немного поигрался пока результат такой:
Serial.println("9"); - первая цыфра прешедшая в делфи 9ка остальные арабские символы.
Serial.println('9'); - арабские символы.
Serial.print('9'); - все в делфи приходит, по крайней мере стня другая символов.
Serial.print("9"); - тож все нораьно приходит.
Serial.print("99"); - китайские иероглифы
Serial.print(48); - 48 один раз приходять потом китайцы пошли.
Serial.println(48); - полная каша приходит все символы в перемешку.
Serial.write(48);- в делфе нули приходять как и было задумано 48-0 в кодировке ascii.
Serial.write('6'); - все норм приходят 6ки.
Serial.write("7"); - приходят 7ки. все ОК.
Serial.write("48"); - китайцы чередуются с 'S' потом одни ктайцы потом промелькнуло 484848 потом опять китайцы через пару строк промелькнуло 4848484848484848484848484848 опять китайцы птом еще бльше 48.и китайцы.
Serial.write("ARDUINO"); ного китайцев и местами промелькивалт DR и O.
Вот такие пироги блин, когда шлю по одному символу все нормально, а как несколько символов так китайцы идут.
Монитор порта дуины все само собой нормально принимает. прога terminal-1.9b тоже все нормально принимает.
>>Serial.print(48); - 48 один раз приходять потом китайцы пошли.
не понимаю - приходит больше символов, чем отправляете?
>>Serial.print(48); - 48 один раз приходять потом китайцы пошли.
не понимаю - приходит больше символов, чем отправляете?
не. код у меня в void loop() и задержка delay(100) вот он каждые 0.1секунды и отправляет один и тот же символ. а приходит только первый 48 потом китайцы
значит проблема в том, что приходит между символами. возврат каретки перевод строки есть?
В делфи есть и то он отключаем.Вот процедура на прием:
В ардуино перевода строки нет.
Слизано с просторов тырнета:
Тип данных String используется, чтобы хранить последовательность символов (предложения).
По умолчанию String обрабатывается как AnsiString. Он может быть обработан как ShortString, если директива компилятора $LongStringsустановлена в Off (по умолчанию установлена в On).
а может быть вам стоит попробовать символы принимать, а не строку? Что-то все происходящее подозрительно напоминает траблы преобразования ASCII-ANSI
попробовать символы принимать, а не строку? Что-то все происходящее подозрительно напоминает траблы преобразования ASCII-ANSI
а как это реализовать?
А какие еще методы есть в классе BComPort, реализующие чтение из порта?
ReadChar/ReadByte/Read...?
А какие еще методы есть в классе BComPort, реализующие чтение из порта?
ReadChar/ReadByte/Read...?
Read,ReadStr,ReadStrAsync,ReadAsync вроди все что ест.
1) Read что возвращает (ну или буфер какой в эту функцию передается)?
2) в настройках COM-компонента возможность выбора кодировки (ASCII/ANSI/UTF...) присутствует?
3) ссылка на документацию по компоненту (ну или для заливки компонента) имеется?
Возвращаемое значение ф-и Read – количество считанных байт.
2)вроди кодировку нельзя выбирать, хотя толком не знаю.
3)Вот ссылка на компонент в нем есть файл справки на русском - BComPort.chm:
http://yourdevice.net/delphi-comport
кстати более менее разобрался, вся проблема была в делфи.изменил метод приема данных из порта на BComPort1.Read(t, count);
Вот видос работы:
http://www.youtube.com/watch?v=f90VfaNlw-g
пока карту не рисует, пока только выкидывает данные (угол поворота сервы и расстояние) на мемо
мой настоятельный совет - выключить нахрен датчик на время, завести
float val = 123,45;
const *char str="Hello world";
и научиться их передавать через последовательный порт в компьютер. без всяких разбивок на символы и пр...
а когда получится - тогда и проблемы все отпадут сами собой
да пробовал передовать строку сразу, так ток иероглифы получаю в делфи, в дгугих мониторах com порта риходит нормально все. в делфи тока принимает ascii кодировки, например шлю Serial.write(48) в делфе 0 приходит.
А вообще действительно попробую поотправлять как вы сказали.
Нужно проверить на какой скорости подключен порт, мне кажется на разных скоростях в делфи одна а в ардуыну другая.
Нужно проверить на какой скорости подключен порт, мне кажется на разных скоростях в делфи одна а в ардуыну другая.
Проблемма была решена еще давно, дело было не в скоростях, а в том что у меня Delphi 2009 он юникодный от этого все проблемы были,поменял пару строк в коде на прием и все нормально.
Делаю так, проект зависает.
String s =
"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"
+s; //
+s зачем ??Опечатка
http://192.168.0.98
Ответ
Почему модуль уходит в перезагрузку?