Считывание данных с Arduino Mega в Delphi
- Войдите на сайт для отправки комментариев
Втр, 10/12/2013 - 16:23
Здравствуйте.
Возникла такая проблемка, не могу разобраться, как мне в Делфи считывать данные с Ардуинки.
Задача состоит в том, у меня на Ардуино собран датчик температуры на базе DS18b20, их 8 штук.
С них считывается температура и мне нужно в Делфи, закидывать эти значения в таблицу. Главное хотябы сделать с одним датчиком, с остальными разберусь как.
http://www.delphimaster.ru/articles/comport2/
Я когда то за основу брал AsyncFree. Ищите по имени.
В Delphi получаю 8-мизначное число от Ардуино через com port, но при выводе cтрингом число разбивается на несколько частей. Если выводить в Memo выводит в столбик частями. Хотя в терминале выводит в одну строку. Пробовал несколько компонентов для работы с com port, везде одно и то же. На скрины разделены блоки, которые должны быть в одну строку. Не подскажите как победить?
P.S. Я так полагаю, из порта прихдит порционно.
По таймауту - так и будет. Нужно чтобы разделителем строк был символ - например новой строки "\n".
Зчем разделитель? Не надо разделитель. На скрине 6 раз отправлены данные. Должно быть 6 строк. Показаны разной длины строки до переноса. Задача устранить перенос в рамках одного 8-мизначного блока, который уходит с Arduino одной строкой.
Вам шашечки или ехать ? Отправляете данные serial.println принимайте что то типа readstring или readline ... не знаю какой там у вас крмпонент или может пользуетесь winapi...
А теперь чуть чуть бреда... по вашему, бреда.. Если вы ответите - каким образом происходит синхронизация пакетов передачи, а вы передаете пакетами по 8 символов, то я вам сразу отвечу как сделать обмен без /n.
Без синхронизации. Serial.print от Arduino. Readstr от клиента. Получил - вывел.... частями
Что без синхронизации ? Readstr читает строку до байта со значением 0 или символа возврата каретки и перевода строки , в си это /n. Вы из ардуино этого не отправляете. Поэтому получаете ерунду. Так что раз не понимаете для чего синхронизация, a самое смешное, что не хотите понять, то и решить проблему не сможете. И никто вам не поможет, поскольку бесполезно.
По сути вы пытаетесь синхронизироваться неявной задержкой, неявной потому что она возникает между отправками ардуин из за невысокого быстродействия последнего. А поскольку механизма отлова этой задержки в дельфи коде нет вы и получаете бред. Попробуйте после каждой отправки ардуиной вставлять задержку примерно в секунду, типа delay(1000). Но только не покзывайте никому это решение, а то смеяться будут.
Кстати это же дерьморешение пофиксит ваше непонимание того, что ваш код может работать быстрее чем происходит отправка 8 байт.
Тоже разбираюсь с этим вопросом, для работы в делфи пока использую библиотеку bc_port, данные с ардуины посылаю через write, а не print, тогда корректно отображает. Опрашиваю датчики - посылаю данные с каждого датчика отдельно.
Val Rubis, скажи пожалуйста, чем ты пользуешься для получения данных с ардуины? В delphi испробовал разные компоненты, данные отправляются, обрабатываются прошивкой правильно, а вот данные с ардуины прочитать ну никак не получается через свои программы на delphi. Монитор порта в IDE Arduina и Putty данные принимают, а в моей программе даже в событие приема данных дебагер не заходит( Или есть какие-то специфические настройки компонентов чтобы данные получать? использовал Comport Library и Asynс Pro. В Comport Lib даже светодиод на TX не моргает. В Async моргает, но OnTriggerAvail все равно не срабатывает.
C ком портом работал и раньше по modbas протоколу, данные замечательно отлавливаются этими же компонентами, а с ардуиной чет никак(
P.S. Arduino Leonardo. Delphi 7 + Async Pro (win32) и Delphi XE5 + ComPortLibrary (win64)
Тоже бился с разными компонентами. Перешел на Visual Studio 2013. Там все сразу завелось без бубна и барабана.
В Delphi получаю 8-мизначное число от Ардуино через com port, но при выводе cтрингом число разбивается на несколько частей. Если выводить в Memo выводит в столбик частями. Хотя в терминале выводит в одну строку. Пробовал несколько компонентов для работы с com port, везде одно и то же. На скрины разделены блоки, которые должны быть в одну строку. Не подскажите как победить?
P.S. Я так полагаю, из порта прихдит порционно.
А этого ты все же какими средствами добился? у меня проблема в разбиении не стоит. Проблема в получении в принципе. Тоже бы перешел на студию, но мне нужно будет использовать много наработок из предыдущего проекта, а он на delphi. Переписывать бы не хотелось. Да и нет у меня любви к visual studio(
Это я получал через пример ComExample из библиотеки ComPort.