Вопрос по отправке информации в компьютер.

imv14
Offline
Зарегистрирован: 02.04.2014

Добрый день, потихоньку разбираюсь с ардуино. Может кто сталкивался связь Ардуино и Делфи. Возник вопрос как правильно отправлять данные в компьютер, при условии что их дальнейщая обработка идет в Делфи. Что лучше использовать print или write, при использование print данные отображаются не корректно, с write все работает, но проблема в том что датчики которые у меня стоят цифровые и температура может быть отрицательной и при использование write возникает проблема передачи (-). Еще хотелось бы узнать как разом передать массив из байт. Попробовал так write(array,5), где 5-кол-во элементов, но компилятор ругается.

Vlad_J
Offline
Зарегистрирован: 28.04.2013

imv14 пишет:

Добрый день, потихоньку разбираюсь с ардуино. Может кто сталкивался связь Ардуино и Делфи. Возник вопрос как правильно отправлять данные в компьютер, при условии что их дальнейщая обработка идет в Делфи. Что лучше использовать print или write, при использование print данные отображаются не корректно, с write все работает, но проблема в том что датчики которые у меня стоят цифровые и температура может быть отрицательной и при использование write возникает проблема передачи (-). Еще хотелось бы узнать как разом передать массив из байт. Попробовал так write(array,5), где 5-кол-во элементов, но компилятор ругается.

Большое, человеческое спасибо! Сам без году неделя, как дуину увидел, а тут, благодаря Вашему посту, сразу почувствовал себя профессионалом! По крайней мере, с отправкой на комп вопросов почти не возникает...)))

Код есть?

imv14
Offline
Зарегистрирован: 02.04.2014

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

Задумка у меня следующая, ардуино опрашивает кучу дачтиков по дому, и постоянно шлет данные в комп, далее делфи их обрабатывает и посылает ардуино команду на включение или выключение какого-нибудь реле. Пока, данные посылаю через write.

Vlad_J
Offline
Зарегистрирован: 28.04.2013

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

imv14
Offline
Зарегистрирован: 02.04.2014

Код сейчас выложить не могу, нет с собой, но я просто опрашиваю датчики затем результат каждого отдельно посылаю write(result). Почитал и понял, что знак надо отправлять в старшем байте, при отправке таким вариантом.

xorkrus
Offline
Зарегистрирован: 22.09.2013

VUSB, AVR-CDC. Первый, имхо, вам подойдет. Используйте как HID-устройство. Там и примеры софта есть. Плюс в ненадобности установки драйверов.

Но из ваших постов я так понимаю вы отправляете данные через переходник USB-UART? Тогда так и гуглите - Delphi com-порт. Также на не русском форуме ардуины есть много веток по типу "serial.print pr serial.write?" - рекомендую к прочтению.

По поводу вашего проекта - я бы отдал управление включением\отключением релюшками самой ардуине, а софт на компе только  вносит изменение в настройки порогов срабатывания ардуины и выводит считанные показания на экран. Это для того, чтобы девайс продолжал работать в случае отключения софта\компа.

imv14
Offline
Зарегистрирован: 02.04.2014

Спасибо, поищу на форуме serial.print и serial.write.

leshak
Offline
Зарегистрирован: 29.09.2011

>Попробовал так write(array,5), где 5-кол-во элементов, но компилятор ругается.

Так попробуйте:

write(&array,sizeof(array))

И поиск по форуму пошерстите. Отправку прием данных из сериал обсасывали не раз и не два. Если память не изменяет - и с дельфи тоже. Но, по большому счету - "кто на другом конце провода" (Дельфи, Процессинг, другая ардуина, радио-передатчик) - не важно. Принципы абсолютно одинаковы (более того, ардуино даже отличить не сможет кто там "на другом конце" подключен в данный момент. для нее это просто "набор байт" которые посылаем/принимаем).

 

imv14
Offline
Зарегистрирован: 02.04.2014

Спасибо большое, попробую ваш вариант.

imv14
Offline
Зарегистрирован: 02.04.2014

leshak Попробывал ваш способ, но почему то все равно ругается write(&array,sizeof(array)).

int array[8]; объявляю массив
​......

//  Посылаем байты в порт
  array[1]= val;         // выводим полученное значение
  array[2]= relayState;  // состояние реле десятично
  
  array[3]= Pressure1;    // барометр BM085 /133.3  
  array[4]= Temperature1; // термометр BM085 * 0.1
   
  array[5]= humidity11;
  array[6]= temperature11;

  array[7]= humidity22;
  array[8]= temperature22;

  Serial.write(&array,sizeof(array));
  Serial.flush();

 

leshak
Offline
Зарегистрирован: 29.09.2011

Ну, во первых "ругань" это же не плохого характера компилятора. Его "ругань" - это ваш первый помошник. В 50% случаев, по тому как ругнулся можно понять "что ему не нравится" и подгнать напильником без необходимости смотреть в документацию или примеры.

Если самому понять не удалось,то на форум говорить не "ой ЧТО_ТО не рабоатет". А сказать "как именно ругнулось".

Ладно, теперь по тому что я вижу:

"; объявляю массив" - боюсь это очень странная синтаксическая конструкция. Ни один компилятор ее не поймет. Что-то вы тут упустили (а вот дальше - вы про это уже не забывали).

array[8]= temperature22;

Вообщем запомните, во всех остальных "не учебных языках" (Pascal, Basic) , нумерация массивов - всегда с нуля. Поэтому val вы должны пихать в array[0], а temperature22 у вас, в итоге попасть в array[7].
Только не пытайтесь исправить объявление массива. на "int array[7]". Так не нужно. При объявлении мы указываем именно "количество". А при обращении - считаем от нуля. Нулевой - это первый элемент массива.

Во вторых. На словах вы сказали "отправить массив байт", а отправить пытаетесь "массив int-тов". То есть понятно, что в итоге вам массив байт слабо подходят (если честно то и int-ты могут не устроить). Но начните, все-таки с массива байтов.

И, что-бы не отладить передачу-прием, не пихайте туда свои датчики. Положите просто "тестовые цифры". Скажем 1,2,3,4,5,6... когда примете нормально в дельфи их - тогда дальше поедите с разными типами разбиратся.

Ну вот. Когда перейдете на "byte array[8]", вот тут уже начнет ругатся на "мою строчку". Ее поправить можно так:

 Serial.write(&array[0],sizeof(array));

Или так:

Serial.write(array,sizeof(array));

Вообщем-то после перехода на byte, даже ваш изначальный вариант 

 Serial.write(array,5);

Будет работать без ругани. Только отправлять, само собой, он будет не весь массив целиком, а только первые пять элементов.

Так что

 Serial.write(array,8);

Тоже покатит (только если массив потом изменит размер - нужно не забывать поправить. поэтому я препочитаю sizeof - пусть сам смотрит на разрмер массива).

А потом, мы попробуем отправить, все-таки массив int[]-тов.
А потом, с большой долей вероятности, мы захотите отправлять массив double[].

А потом мы почухаем затылок. И решим что "в данном случае массив не самое удобное решение и лучше будет использоваться struct" (struct - это аналог Record-End из паскаля/дельфи).

imv14
Offline
Зарегистрирован: 02.04.2014

Спасибо, очень пояснительно. Буду пробовать. Заодно пробую с отправкой символов.