Преобразование из Float в String

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

Всем привет. Не могу понять как сделать преобразование из из 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.
}

 

sirik
Offline
Зарегистрирован: 10.11.2012

Я использую библиотеку floatToString.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Мне казалось, что для вывода через Serial.print() - не надо преобразовывать типы. А так - есть функция dtostrf().

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

Andrey_Y_Ostanovsky пишет:

Мне казалось, что для вывода через Serial.print() - не надо преобразовывать типы. А так - есть функция dtostrf().

да посути не нужно. но я принимаю данные через порт в делфи, если туда так просто отправлять приходят иероглифы китайские:( так что отправляю вот так : Serial.write(48); (48- код числа в ascii "0") да и отправлять приходится по одному символу с задержкой в несколько миллисекунд:( если кто то знает другой спооб реализации, и расскажет как сделать то буду признателен:)

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

sirik пишет:

Я использую библиотеку floatToString.

вот уж не думал что даже библиотека для этого есть:) попробую поискать и разобраться:)

А ссылки у вас нету на не а то что то в нормальном виде найти не могу:(

А вообще задача такая повесить ультразвуковой дальномер на сервопривод - и отправлять в прогу на делфе данные расстояния и угла поворота, и из этих данных строить подобие карты местности:) может уже кто то делал что то подобное на форуме?

Zizilk
Offline
Зарегистрирован: 30.05.2013

Я планировад, но у уз дальномеров очень хреновая точность на далёких расстояниях.

Проводил эксперемент со своим HC-SR04 - направлял в одну точку и снимал две дельты.

Первая усреднённая между двумя бликими замерами, вторая между максимальным и минимальным временем за сессию

Расстояние до точки составляло около 3,5 4-х метров (точно не мерял так как интересовали дельты, а такое расстояние на глаз соответствовало планируемым рабочим).

первая дельта составляла 11-14 см, вторая до полуметра. что на таких расстояниях весьма ощутимо

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

да он всеравно в пределах квартиры ездить будет, а есди на далеких плохая точность то можно сделать чтоб белее 2ух метров показаня не учитывал( если я конечно правильно вас понял). на первое время пойдет:) да и с ардуино поразбираюсь заодно.

Zizilk
Offline
Зарегистрирован: 30.05.2013

ну на 4-х метрах разница вполне ощутимая всё таки

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

возможно, так далеко не проверял. направлял в потолок показывал 255см думаю примерно так и есть. Да и это не первоочередная задача, пока главная цель получить данные в делфи:)

Zizilk
Offline
Зарегистрирован: 30.05.2013

Я говорю не про то что врёт, а про то чтомаксимальный разброс получается в полметра, а в среднем разброс в 11 см, если нанести такие значения на координатную плоскость вряд ли даже сможешь опознать что где стоит)

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

имхо sprintf() рулит

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

NeiroN пишет:

имхо sprintf() рулит

 Если я правильно понял что  sprintf(); что dtostrf(); они в чар помойму переводят? А как тогда из char в String? 
azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

Zizilk пишет:

Я говорю не про то что врёт, а про то чтомаксимальный разброс получается в полметра, а в среднем разброс в 11 см, если нанести такие значения на координатную плоскость вряд ли даже сможешь опознать что где стоит)

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

Zizilk
Offline
Зарегистрирован: 30.05.2013

я не знаю и не в давался в технические подробности почему так происходит. Но скорее всего да так, то есть с большего сектора может прилететь эхо которое он зарегистрирует при этом погрешность измерения скачет на расстояниях в пределах квартиры просто офигительно. А так по мере приблежения точность повышается и разброс уменьшается.

 к этому веселья добавляется если вещь состоит из разных материалов,  то тоже вносит погрешность в измерения. Так тканями эхо практически глушиться либо пропускается, мою футболку он упорно игнрировал. Приемлема точность и стабильный разброс в 1-2 см он показал только на расстояниях в районе 10-15см. В итоге отказался от идеи картографирования и хочу сделать предустановленную карту помещений (походить по комнатам с рулеткой) и перевести в удобоваримый вид. О энкодарах я думал, но пока отказался - во первых самое банальное пинов пока нет и шилд мой напоминает проводной ад пока, а во вторых энкодеры фикисруют положение колеса, а оно может пробуксовывать и не знаю как будет с оборотами на разных поверхностях. Думал раскурочить пару мышек с их сенсорами, но пока не понял как они работают.

А так я тоже делаю робота двухколёсного, что арддуинка работает с железом а мозгами будет служить другой комп. Но я планирую взять росбери пай поставить на него линукс и прогу на яве которая все будет обрабатывать и посылать команды ардуинки

http://arduino.ru/forum/proekty/dvukhkolesnyi-robot-s-dvukhkomponentnym-...

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

я тоже под энкодер думаю мышку курочить:) разобрать сервоприводы и туда поставить энкодеры. А вообще изначально было в планах использовать 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

Zizilk
Offline
Зарегистрирован: 30.05.2013

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

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

мне кажется что этот датчик(вроди как слышал что это подобие камеры) будет давать больше погрешности чем энкодер на колесах, он более требователен к поверхности, а мышкой ведь где угодно не повертишь, да и на стыках и коврах проблемы будут, и датчик нужно прижатым держать к полу, а это проходимость робота ухудшит.

Использоать мышь нужно вместе с електроникой, насколько я помню интерфейс (PS/2.) там не особо сложный, даже пример гдето видел работы с ардуино.

http://robocraft.ru/blog/arduino/101.html

Zizilk
Offline
Зарегистрирован: 30.05.2013

Думал об эом но у мышки сликшом много не нужного...

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

Zizilk пишет:

Думал об эом но у мышки сликшом много не нужного...

не так там уж много и не нужного, а кнопки и енкодер можно выпаять чтоб не мешались.а подключать сам датчик у которого около 20ти ножек помойму задача не из простых.

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

Походу разобрался как все это делать, переводим в char и отправляем елементы чара в порт по одному с задержкой небольшой по времени. Но есть еще одна проблмка ардуина шлет только ограничное количество координат. например прогонит циклов 10 и останавливается пока по новой не включи монитор порта или перегружу дуину. и заметил особенность в строке  dtostrf(dist_cm,9- чем меньше это чесло тем больше циков прогоняет дуина, 6, dist_str); вроди это размер char массива? как исправить этот косяк хочу стобы данные принимались постоянно.

Пример скетча:

#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()
{
  char dist_str[6];
  float dist_cm = ultrasonic.Ranging(CM); 	// get distance
  
  dtostrf(dist_cm,9, 6, dist_str);

 Serial.write(dist_str[1]);
   delay(10);
 Serial.write(dist_str[2]); 
  delay(10);
 Serial.write(dist_str[3]); 
  delay(10);
 Serial.write(dist_str[4]);
  delay(10);
 Serial.write(dist_str[5]); 			// print the distance 
  delay(10); 					// arbitary wait time.
}

 

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

понял в чем суть проблемы, функция ultrasonic.Ranging(CM) выдает длинны тыкого вида 12.0, 200.0 то есть числа разной длинны, а в порт я отправляю фиксированое количество символов, вот в конце ему отправить нечего видать вот он и тупит:(

Cделать проверку есть ли символ в ячейке. Проверка проходит шлет вроди какк нормально в монитор порта, но в делфи выходит одни квадраты:(

#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()
{
  char dist_str[3];
  float dist_cm = ultrasonic.Ranging(CM); 	// get distance
  
  dtostrf(dist_cm,9, 4, dist_str);

 Serial.write(35);
  delay(20);
 Serial.write(dist_str[0]); 
  delay(20);
  if (dist_str[1]!=' '){
 Serial.write(dist_str[1]); 
  delay(20);
  }
  if (dist_str[2]!=' '){
 Serial.write(dist_str[2]);
  delay(20);
  }
  if (dist_str[3]!=' '){
 Serial.write(dist_str[3]); 			// print the distance 
  delay(20);
  }					// arbitary wait time.
}

уже не знаю что делать:( одна проблема решается тут же другая появляется:( может попробовать отправлять массив char с помощью цикла For? только поможет ли это.

 

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

а ни кто ни знает других вариантов как делфи связать с ардуино? кроме того как непосредственно через сам делфи принимать данные? может можно через какую нибудь стороннюю прогу.

Вот написал с циклом for но он отправляет всего одну первую длинну и все:(

#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()
{
  char dist_str[3];
  float dist_cm = ultrasonic.Ranging(CM); 	// get distance
  dtostrf(dist_cm,9, 4, dist_str);
 
  Serial.write(35);
  delay(5);
  
  for (int i=0; i <= 3; i++){
  if (dist_str[i]!=' ')
  {  
  Serial.write(dist_str[i]);
  delay(5);
  }
  else
  {
  Serial.write(48);
  delay(5);
  }
  }
 					// arbitary wait time.
}

 

com
Offline
Зарегистрирован: 06.09.2013

1. я понять не могу, почему вы посимвольно строку обрабатываете, да еще и задержки между символами ставите? или у вас компьютер медленнее ардуины работает и ему фора нужна? получайте из буфера порта целую строку и работайте с ней как со строкой, тогда и не будет никаких проблем в случаях разной длины

2. что значит "связать дельфи с ардуиной"? дельфи не знает, да и никогда не узнает ничего про ардуину, открывайте последовательный порт и читайте из него данные хоть от ардуины, хоть от электронных весов, хоть от чего угодно, чего в ком-порт втыкается. али оскудел интернет на нужные компоненты? :)

step962
Offline
Зарегистрирован: 23.05.2011

com пишет:

1. я понять не могу, почему вы посимвольно строку обрабатываете, да еще и задержки между символами ставите? или у вас компьютер медленнее ардуины работает и ему фора нужна? получайте из буфера порта целую строку и работайте с ней как со строкой, тогда и не будет никаких проблем в случаях разной длины

Кроме компьютера и Arduino имеется третий участник процесса - UART. И таки да - он работает медленнее и ему фора нужна. При настройках ТС (9600) UART способен перекачивать всего лишь около 1000 символов в секунду, т.е. один символ каждую миллисекунду (5 миллисекунд задержки, конечно, многовато). Будете пихать в него символы быстрее - через конечное (и весьма небольшое время) буфер забьется и программа все равно приостановится в ожидании освобождения части буфера (в лучшем случае) или начнет писать по еще не отправленному (в худшем).

Это насчет задержек.

А насчет посимвольной обработки - ТС, кроме отправки символов, еще и замену ' ' на '0' производит. Что как бы предполагает сравнение каждого символа на равнество пробелу.

 

А вот что ему действительно надо сделать, так это повнимательнее присмотреться к объявлению массива distr_str и ответить на вопрос, сколько символов он может вместить - 3 или 4.

И уже после этого попытаться ответить на вопрос - куда пишется символ с порядковым номером 3 (при отсчете от нуля)?

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

com пишет:

1. я понять не могу, почему вы посимвольно строку обрабатываете, да еще и задержки между символами ставите? или у вас компьютер медленнее ардуины работает и ему фора нужна? получайте из буфера порта целую строку и работайте с ней как со строкой, тогда и не будет никаких проблем в случаях разной длины

2. что значит "связать дельфи с ардуиной"? дельфи не знает, да и никогда не узнает ничего про ардуину, открывайте последовательный порт и читайте из него данные хоть от ардуины, хоть от электронных весов, хоть от чего угодно, чего в ком-порт втыкается. али оскудел интернет на нужные компоненты? :)

1.посимвольно обрабытываю, птомучо в делфе когда сразу строку отпраляю приходят иероглифы китайские, и если без здержек по времени тоже в делфе че попало пишет:(

2.А связать я имел ввиду черз ком порт принимать данный какой нибудь другой прогай, а потом через эту прогу делфи отправлять. а порт в делфе я и так открываю. Сначала она все расстояния нормально принимает а пото начинает иероглифы гнать:( надоело уже:(

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

step962]</p> <p>[quote=com пишет:

 вот что ему действительно надо сделать, так это повнимательнее присмотреться к объявлению массива distr_str и ответить на вопрос, сколько символов он может вместить - 3 или 4.

И уже после этого попытаться ответить на вопрос - куда пишется символ с порядковым номером 3 (при отсчете от нуля)?

у меня странно получилось, символ [0] пустой а [1]-1 [2]-9 [3]-9 (это число 199см).

а с самой делфи походу какието проблеммы с буфером, после того как общее количество переданых символов которые в memo пишутся он начинает гнать и пишет иероглифы, в основном квадраты.

com
Offline
Зарегистрирован: 06.09.2013

step962 пишет:

Кроме компьютера и Arduino имеется третий участник процесса - UART. И таки да - он работает медленнее и ему фора нужна. При настройках ТС (9600) UART способен перекачивать всего лишь около 1000 символов в секунду, т.е. один символ каждую миллисекунду (5 миллисекунд задержки, конечно, многовато). Будете пихать в него символы быстрее - через конечное (и весьма небольшое время) буфер забьется и программа все равно приостановится в ожидании освобождения части буфера (в лучшем случае) или начнет писать по еще не отправленному (в худшем).

Это насчет задержек.

ерунду-ссс, пардон-ссс, пишите..... тут не какой-то идеальный сферический ардуино в вакууме, а вполне конкретный датчик, у которого рекомендованный производителем цикл опроса - 50 мс, т.е в самом идеальном случае датчик успеет за 1 секунду послать результаты 20 измерений. и для 20 чисел ему 9600 не просто за глаза, а с многократным запасом.

Это насчет задержек.

step962 пишет:

А насчет посимвольной обработки - ТС, кроме отправки символов, еще и замену ' ' на '0' производит. Что как бы предполагает сравнение каждого символа на равнество пробелу.

 

А вот что ему действительно надо сделать, так это повнимательнее присмотреться к объявлению массива distr_str и ответить на вопрос, сколько символов он может вместить - 3 или 4.

И уже после этого попытаться ответить на вопрос - куда пишется символ с порядковым номером 3 (при отсчете от нуля)?

ТС сам не знает, чего хочет. у него два этапа передачи данных. 1 этап - датчик->ардуино и 2 Этап ардуино -> пк. на первом этапе данные звамечательно в ардуино прилетают, прилетают правильно и разборчиво. но в виде числа. а на пк он это число разобрать не может или не хочет, хз. вместо того, чтобы на ардуине преобразовать число в строку (собсно, так тема и называется, да ведь? ;) и передавать как строку на пк зачем-то стали ломать работающий 1 этап, изобретать трудности типа замены пробелов на 0 и потом героически их преодолевать...

мой настоятельный совет - выключить нахрен датчик на время, завести

float val = 123,45;

const *char str="Hello world";

и научиться их передавать через последовательный порт в компьютер. без всяких разбивок на символы и пр...

а когда получится - тогда и проблемы все отпадут сами собой

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

com пишет:

мой настоятельный совет - выключить нахрен датчик на время, завести

float val = 123,45;

const *char str="Hello world";

и научиться их передавать через последовательный порт в компьютер. без всяких разбивок на символы и пр...

а когда получится - тогда и проблемы все отпадут сами собой

да пробовал передовать строку сразу, так ток иероглифы получаю в делфи, в дгугих мониторах com порта риходит нормально все. в делфи тока принимает ascii кодировки, например шлю  Serial.write(48) в делфе 0 приходит. 

А вообще действительно попробую поотправлять как вы сказали.

com
Offline
Зарегистрирован: 06.09.2013

играйтесь с настройками компонента. если вам годится строка, то пробуйте serial.write и serial.print

step962
Offline
Зарегистрирован: 23.05.2011

azzzazzzelDEAN пишет:

у меня странно получилось, символ [0] пустой а [1]-1 [2]-9 [3]-9 (это число 199см).

а с самой делфи походу какието проблеммы с буфером, после того как общее количество переданых символов которые в memo пишутся он начинает гнать и пишет иероглифы, в основном квадраты.

Ну а теперь внимательно перечитайте статейку о массивах (особенно "Доступ к элементам массива") и попробуйте понять, что же у вас здесь не так...

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

немного поигрался пока результат такой:

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 тоже все нормально принимает.

 

com
Offline
Зарегистрирован: 06.09.2013

>>Serial.print(48); - 48 один раз приходять потом китайцы пошли.

не понимаю - приходит больше символов, чем отправляете?

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

com пишет:

>>Serial.print(48); - 48 один раз приходять потом китайцы пошли.

не понимаю - приходит больше символов, чем отправляете?

не. код у меня в void loop() и задержка delay(100) вот он каждые 0.1секунды и отправляет один и тот же символ. а приходит только первый 48 потом китайцы

com
Offline
Зарегистрирован: 06.09.2013

значит проблема в том, что приходит между символами. возврат каретки перевод строки есть?

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

В делфи есть и то он отключаем.Вот процедура на прием:

procedure TMainForm.BComPort1RxChar(Sender: TObject; Count: Integer);
var
  S: String;
begin
  BComPort1.ReadStr(S, Count);
  if cbCRLF.Checked and (S[Length(S)] = #13) then // Добавление перевода строки
    S := S + #10;
  memo1.Text := memo1.Text + S;
end;

В ардуино перевода строки нет.

step962
Offline
Зарегистрирован: 23.05.2011

Слизано с просторов тырнета:

Тип данных String используется, чтобы хранить последовательность символов (предложения). 



По умолчанию String обрабатывается как AnsiString. Он может быть обработан как ShortString, если директива компилятора $LongStringsустановлена в Off (по умолчанию установлена в On).

а может быть вам стоит попробовать символы принимать, а не строку? Что-то все происходящее подозрительно напоминает траблы преобразования ASCII-ANSI

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

step962 пишет:

попробовать символы принимать, а не строку? Что-то все происходящее подозрительно напоминает траблы преобразования ASCII-ANSI

а как это реализовать?

step962
Offline
Зарегистрирован: 23.05.2011

А какие еще методы есть в классе BComPort, реализующие чтение из порта?

ReadChar/ReadByte/Read...?

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

step962 пишет:

А какие еще методы есть в классе BComPort, реализующие чтение из порта?

ReadChar/ReadByte/Read...?

Read,ReadStr,ReadStrAsync,ReadAsync вроди все что ест.

step962
Offline
Зарегистрирован: 23.05.2011

1) Read что возвращает (ну или буфер какой в эту функцию передается)?

2) в настройках COM-компонента возможность выбора кодировки (ASCII/ANSI/UTF...) присутствует?

3) ссылка на документацию по компоненту (ну или для заливки компонента) имеется?

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013
1)
function TBComPort.Read(var Buffer; Count: Integer): Integer;
var
  AsyncPtr: PAsync;
begin
  InitAsync(AsyncPtr);
  try
    ReadAsync(Buffer, Count, AsyncPtr);
    Result := WaitForAsync(AsyncPtr);
  finally
    DoneAsync(AsyncPtr);
  end;
end;

Возвращаемое значение ф-и Read – количество считанных байт.

2)вроди кодировку нельзя выбирать, хотя толком не знаю.

3)Вот ссылка на компонент в нем есть файл справки на русском - BComPort.chm:

http://yourdevice.net/delphi-comport

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

кстати более менее разобрался, вся проблема была в делфи.изменил метод приема данных из порта на BComPort1.Read(t, count);

Вот видос работы:

http://www.youtube.com/watch?v=f90VfaNlw-g

пока карту не рисует, пока только выкидывает данные (угол поворота сервы и расстояние) на мемо

krovickiy
Offline
Зарегистрирован: 30.07.2014

azzzazzzelDEAN пишет:

com пишет:

мой настоятельный совет - выключить нахрен датчик на время, завести

float val = 123,45;

const *char str="Hello world";

и научиться их передавать через последовательный порт в компьютер. без всяких разбивок на символы и пр...

а когда получится - тогда и проблемы все отпадут сами собой

да пробовал передовать строку сразу, так ток иероглифы получаю в делфи, в дгугих мониторах com порта риходит нормально все. в делфи тока принимает ascii кодировки, например шлю  Serial.write(48) в делфе 0 приходит. 

А вообще действительно попробую поотправлять как вы сказали.

 

Нужно проверить на какой скорости подключен порт, мне кажется на разных скоростях в делфи одна  а в ардуыну другая.

 

azzzazzzelDEAN
Offline
Зарегистрирован: 19.10.2013

krovickiy пишет:

Нужно проверить на какой скорости подключен порт, мне кажется на разных скоростях в делфи одна  а в ардуыну другая.

Проблемма была решена еще давно, дело было не в скоростях, а в том что у меня Delphi 2009 он юникодный от этого все проблемы были,поменял пару строк в коде на прием и все нормально.

barada
Offline
Зарегистрирован: 25.11.2013
void setup() {
  Serial.begin(9600);
}

void loop() {
long a=12312351;
String d;
d=(String)a;
  Serial.println("start\n");
  Serial.println(d);

  for (int i=0;i<d.length();i++)
  {
  Serial.println(d.charAt(i));
  }
delay(10000);
}

 

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

float h = dht.readHumidity();
float t = dht.readTemperature();
String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
s +=h+"\r\n\";
s +=t+"\r\n\";

Как из float сделать String
Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
char* tem;
char* vla;

float h=dht.readHumidity();
 float t=dht.readTemperature();
 sprintf(vla, "S0_%d", h);
 sprintf(tem, "S0_%d", t);

  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+s;
s +=String(tem)+"\r\n";
s +=String(vla)+"\r\n";

Делаю так, проект зависает.

Araris
Offline
Зарегистрирован: 09.11.2012

String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+s; // +s зачем ??

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Опечатка

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
/*
 *  This sketch demonstrates how to set up a simple HTTP-like server.
 *  The server will set a GPIO pin depending on the request
 *    http://server_ip/gpio/0 will set the GPIO2 low,
 *    http://server_ip/gpio/1 will set the GPIO2 high
 *  server_ip is the IP address of the ESP8266 module, will be 
 *  printed to Serial when the module is connected.
 */
#include "DHT.h"
#define DHTPIN 4
DHT dht(DHTPIN, DHT22);
#include <ESP8266WiFi.h>

const char* ssid = "Halava";
const char* password = "99998888";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);
char* tem;
char* vla;
void setup() {
  Serial.begin(115200);
  dht.begin();
  delay(10);

  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
  
  // Match the request
  int val;
  if (req.indexOf("/gpio/0") != -1){
 float h=dht.readHumidity();
 float t=dht.readTemperature();
 sprintf(vla, "S0_%d", h);
 sprintf(tem, "S0_%d", t);
    }
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(2, val);
  
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
s +=String(tem)+"\r\n";
s +=String(vla)+"\r\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected");

  // The client will actually be disconnected 
  // when the function returns and 'client' object is detroyed
}

http://192.168.0.98

Ответ

GET / HTTP/1.1
invalid request
 
Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Почему модуль уходит в перезагрузку?