Com port как связь программы на delphi с Arduino

mad_ded
Offline
Зарегистрирован: 03.09.2013

Всем доброго времени суток! Ищу компонент/класс/способ мониторинга com порта из программы написанной на Delphi xe3. Программа должна получать данные от arduino мониторя comport. Цель получать данные, например о температуре. Возможно вы посоветуете какой-нибудь другой язык, для написания такой программы. Подключаю через usb. 

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

Не там ищете. На форумах по Delphi найдете много простых (и навороченных тоже) компонентов для работы с COM-портом.

Я для работы с Ардуино из Delphi использую компонент AfComPort. Там все просто:

AfComPort1.ComNumber := N;
AfComPort1.Open;

...

AfComPort1.WriteString(cmd);

...
ans := AfComPort1.ReadString;

...
AfComPort1.Close;

mad_ded пишет:

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

Самый подходящий тот, который Вы знаете.

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

Я на питоне писал. Python 2.7+PyGTK+pyserial

Можно хоть в MSWord на VisualBasic писать или в Matlab - главное понимать какую задачу надо решить при этом.

SAlexander59
Offline
Зарегистрирован: 21.04.2017

Добрый вечер. Я - новичок в программировании СОМ порта применительно к Arduino + не электронщик (электрохимик+ имею некоторый опыт программирования в Delphi). Не подскажете где можно найти доходчиво изложенную документацию по управлению Arduino из своего Delphi приложения. Компонент AfComPort  я нашел и установил.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Нет такой документации, т.к. нет никакого стандартного способа управления ардуиной из Delphi приложения. Пишется скетч, в котором ардуина читает Serial и парсит полученную информацию. И в зависимости от полученного результата выполняет какие-либо действия. Ардуине всё равно, кто отправляет эту ифнормацию - Delphi приложение или что-то другое. Вам надо читать про работу с Serial, Serial.available() и т.д.

SAlexander59
Offline
Зарегистрирован: 21.04.2017

Спасибо за первый совет Jeka_M. Не можете ли вы пояснить - скетч пишется в среде Arduino или в приложении Delphi? Если в среде Arduino то вопросов нет, но тогда нет программного управления им из приложения Delphi. А если скетч пишется в приложении Delphi, то как его потом загрузить в Arduino - простой загрузкой в СОМ порт в виде набора строк? Не можете хоть 1 пример такого кода привести? И как потом запустить этот скетч в Arduino из приложения Delphi? Был бы вам очень признателен за советы!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

SAlexander59, в Ардуино и в ПК должны одновременно работать две самосогласованные программы, которые обмениваются между собой данными. Одна программа отсылает данные, другая - принимает. При этом каждая программа может выступать и в роли отправителя и в роли получателя (разумеется, если Вам это нужно). Ну либо наоборот - одна программа может только отправлять данные, а другая - только получать. Обмен данными, как Вы справедливо заметили, происходит через COM-порт. Какого вида будут данные - решать Вам. Это могут быть строки, символы, числа, бинарные данные, смесь того или другого - делайте, как Вам удобнее.

 

Для пробы рекомендую попытаться написать следующее:

1. Программа на Делфи имеет две подпрограммы:

1.1. Одна подпрограмма по нажатию на кнопку генерирует случайное число, отображает его в одном месте формы и отправляет в COM-порт.

1.2. Вторая подпрограмма слушает COM-порт и по получении числа оторбражает его в другом месте формы.

2. Скетч на Арпдуино:

2.1. Слушает COM-порт. При послуплении на него числа читает его, умножает на 2 и отправляет обратно. 

SAlexander59
Offline
Зарегистрирован: 21.04.2017

Спасибо за совет andriano!

Я собрал простую схемку и взял из примеров скетч для нее. Схема - простой делитель напряжения. скетч просто читает аналоговое значение, которое формируется на одном из резисторов делителя. оба резистора делителя включены последовательно (между +5 V и GRD), а средняя точка делителя - подключена к аналоговому входу А0 Arduino UNO. Резисторы по 10 ком. Мне не очень понятны следующие вещи:

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

2. я просто запускал скетч и он выдавал значения в диапазоне от 506 до 509. мне не очень понятно что это за параметр - падение напряжения или что? в каких он еденицах? Как программно получать эти же данные без потери их целостности в своем Delphi приложении? Я просто создал простой обработчик нажатия кнопки:

procedure TForm1.Button4Click(Sender: TObject);
var
s:string;
begin
  s := AfComPort1.ReadString;
    Memo2.Lines.Add(s);
end;

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

SAlexander59
Offline
Зарегистрирован: 21.04.2017

или при организации цикла исходить из скорости обмена данных с портом - я так понимаю это величина - AfComPort1.BaudRate. что оан подразумевает - сколько значений (или бит) в секунду?

Logik
Offline
Зарегистрирован: 05.08.2014

1. У ардуины есть буфер куда складывается все принятое, пока не переполнится - потерь не будет. Чтоб не переполнился из лупа достаточно часто надо выгребать данные.

2. 506..509 - это значение с АЦП. Оно в единицах. На одну единицу приходится +5В/1024 вольта, т.е. 506..509 - около 2,5В. Оно похоже на правду. Скачет из за шумов, наводок, ошибок и пр.. Не акцентруйте на том внимание.

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

В ардуину в луп зашейте типа static byte i; i++; Serial.println(i); delay(100); Это для тестирования удобней.

Logik
Offline
Зарегистрирован: 05.08.2014

SAlexander59 пишет:

или при организации цикла исходить из скорости обмена данных с портом - я так понимаю это величина - AfComPort1.BaudRate. что оан подразумевает - сколько значений (или бит) в секунду?

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

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

SAlexander59 пишет:

Я просто создал простой обработчик нажатия кнопки:

procedure TForm1.Button4Click(Sender: TObject);
var
s:string;
begin
  s := AfComPort1.ReadString;
    Memo2.Lines.Add(s);
end;

при каждом нажатии он выдает серию из разного числа занчений.

Лучше повесьте в AfComPort1 обработчик события DataRecived(Sender: TObject; Count: Integer);

Ну что-то типа такого :

procedure TForm1.AfComPort1DataRecived(Sender: TObject;  Count: Integer);

var s:string;

begin
try
  s := AfComPort1.ReadString;
  Memo2.Lines.Add(s);
except
end;
end;
 
SAlexander59
Offline
Зарегистрирован: 21.04.2017

я попробовал сделать так как вы посоветовали Araris. считка данных пошла. НО.... в поле Мемо2 данные выводились не совсем правильно. во в такой форме:

50

8

50

8

50

9

......

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

SAlexander59
Offline
Зарегистрирован: 21.04.2017

то есть отображаемый в Ардуино сигнал - это напряжение в еденицах, рассчитываемых так как вы сказали?  теперь понятно. Вы рекомендуете делать считку данных по таймеру. Но какой интервал времени ставить в таймере? как его рассчитать? Вы говорите, что надо выбирать данные из буфера достаточно часто. а нельзя ли просто программно из своего приложения рассчитать (или определить) время поступления в буфер очередного показания и считывать их таким образом? я так понимаю - каждое показание имеет определенный фиксированный размер и как только объем буфера достиг этого размера - считать очередное значение.

SAlexander59
Offline
Зарегистрирован: 21.04.2017

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

procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
var
u:real;
s:string;
begin
  try
    s := AfComPort1.ReadString;
    u:=(5/1024)*StrToInt(s);
    Memo2.Lines.Add(FloatToStr(u));
  except
  end;
end;

но когда попытался запустить программу и получить результаты выскочила ошибка, где говорилось, что StrToInt(s) не может быть рассчитано, так как оно не целочисленное. я поменял StrToInt(s) на StrToFloat(s) - в рассчете на то, что величина действительного формата. и опять выскочила ошибка где говорилось, что эта величина StrToFloat(s) - не действительного формата??? Встает закономерный вопрос - какого формата величина получаемая с порта??? Или я чего то не учел?

afen
Offline
Зарегистрирован: 24.04.2017

может быть както так:

для ардуино

void setup() {
  Serial.begin(9600);

}

void loop() {
  float volt = 5.0 /1024 * analogRead(A0);
  Serial.println(volt);
}

Delphi

.....................
AfComPort1.baudRate = 9600;
......................

procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
var  s:string;
begin
  try
    s := AfComPort1.ReadString;
    if s<>'' then  Memo2.Lines.Add(s);
  except
  end;
end;

 

SAlexander59
Offline
Зарегистрирован: 21.04.2017

Спасибо за подсказку afen я попробовал сделать, то что вы предложили. Почти получилось. Но....

в поле Мемо2 полученные значения частенько разбиты на 2 части. Так

2.48

2

.48

2.4

8

как с этим бороьтся не пойму

T.Rook
Offline
Зарегистрирован: 05.03.2016

SAlexander59 пишет:

но когда попытался запустить программу и получить результаты выскочила ошибка, где говорилось, что StrToInt(s) не может быть рассчитано, так как оно не целочисленное. я поменял StrToInt(s) на StrToFloat(s) - в рассчете на то, что величина действительного формата. и опять выскочила ошибка где говорилось, что эта величина StrToFloat(s) - не действительного формата??? Встает закономерный вопрос - какого формата величина получаемая с порта??? Или я чего то не учел?

StrToInt  ругается, потому что приходит float (это видно по строкам , которые появляются в memo), а StrToFloat ругается,  - наверное дело в десятичном разделителе (например с порта приходит ".", а в региональных настройках у Вас стоит ",") - тогда попробуте покопать в сторону DecimalSeparator.

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

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

Попробуйте в AfComPort1DataRecived() поставить задержку небольшую ( Sleep(200); Application.ProcessMessages; ) перед AfComPort1.ReadString;

Ну и в скетч, отправляющий данные, тоже желательно

void loop() {
  float volt = 5.0 /1024 * analogRead(A0);
  Serial.println(volt);
  delay(500);
}

Хотя совет от T.Rook мне больше по душе.

SAlexander59
Offline
Зарегистрирован: 21.04.2017

Получил в итоге следующий работающий код Delphi приложения:

sval - глобальная строковая переменная программы

procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
var
u:real;
s:string;
begin
  try
    s := AfComPort1.ReadString;
    if s<>'' then
    begin
      if (Pos(#13#10,s)<>0) then
      begin
        if (sval='') then
        begin
          if s<>#13#10 then Memo2.Lines.Add(s)
        end
        else
        begin
          if (sval<>'') then
          begin
            if s<>#13#10 then Memo2.Lines.Add(sval+s);
            sval:='';
          end
        end;
      end
      else sval:=sval+s;
    end;
  except
  end;
end;

все работает, но выдача идет в Мемо2 через 1 строчку. где то небольшая ошибка в логике

negavoid
Offline
Зарегистрирован: 09.07.2016

Memo2.Lines.Add(Trim(s))   ?

SAlexander59
Offline
Зарегистрирован: 21.04.2017

Спасибо за подсказку negavoid - не знал об этой функции, убирающей пустые пробелы в строке.

Получил в итоге следующий работающий код Delphi приложения:

sval - глобальная строковая переменная программы

procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
var
u:real;
s:string;
begin
  try
    s := AfComPort1.ReadString;
    if s<>'' then
    begin
      if (Pos(#13#10,s)<>0) then
      begin
        if (sval='') then
        begin
          if s<>#13#10 then Memo2.Lines.Add(Trim(s));
        end
        else
        begin
          if (sval<>'') then
          begin
            if s<>#13#10 then Memo2.Lines.Add(Trim(sval+s));
            sval:='';
          end
        end;
      end
      else sval:=sval+s;
    end;
  except
  end;
end;

все работает, выдача идет в каждую строку Мемо2

SAlexander59
Offline
Зарегистрирован: 21.04.2017

Соответствующий скетч таков:

void setup() {
  analogReference(DEFAULT);
  Serial.begin(9600);
}

void loop() {
float volt=5.0/1024*analogRead(A0);  
Serial.println(volt);
delay(500);
}

afen
Offline
Зарегистрирован: 24.04.2017

SAlexander59 пишет:

Спасибо за подсказку afen я попробовал сделать, то что вы предложили. Почти получилось. Но....

в поле Мемо2 полученные значения частенько разбиты на 2 части. Так

2.48

2

.48

2.4

8

как с этим бороьтся не пойму

Это потому что ты успеваеш читать буфер быстрее чем приходят данные. Надо поставить признак конца пакета и если данные надо передавать раз в 0,5 сек то сделать так.

#define _500ms 500
unsigned long Timer1PreviousMillis = 0;

void loop() {
unsigned long TimerCurrentMillis = millis();
  if(TimerCurrentMillis - Timer1PreviousMillis > _500ms) 
  {
     float volt=5.0/1024*analogRead(A0);  
     Serial.println(String(volt)+ "#");
     Timer1PreviousMillis = TimerCurrentMillis;
  }
}
Delphi
var rcvStr : string;   //глобальная переменная

procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
var  s: string;
begin
  try
    rcvStr := rcvStr + AfComPort1.ReadString;
      if pos('#',rcvStr)<>0  then  
          begin
            s:=copy(rcvStr,0,pos('#',rcvStr)-1);   
            Memo2.Lines.Add(s);
            Delete(rcvStr ,0,pos('#',rcvStr)); 
          end;  
  except
  end;
end;

SAlexander59
Offline
Зарегистрирован: 21.04.2017

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

afen
Offline
Зарегистрирован: 24.04.2017

SAlexander59 пишет:

afen эта проблема уже решена - посмотрите мое предыдущее сообщение.

 Понял, не сразу просек что что символы перевода строки как раз и есть маркер конца пакета

SAlexander59 пишет:

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

Зачем тебе это ? У тебя и так все работает в практически в реальном времени и потом ардуине все равно принял кто пакет или нет, то есть после Serial.print ардуина "подергала" ножки Rx, Tx и забыла про твой пакет данных. Если комп принял данные можеш быть уверен что АЦП их получила несколько миллисекунда назад (время преобразования + врема передачи)

SAlexander59
Offline
Зарегистрирован: 21.04.2017

afen пишет:

Зачем тебе это ? У тебя и так все работает в практически в реальном времени и потом ардуине все равно принял кто пакет или нет, то есть после Serial.print ардуина "подергала" ножки Rx, Tx и забыла про твой пакет данных. Если комп принял данные можеш быть уверен что АЦП их получила несколько миллисекунда назад (время преобразования + врема передачи)

Мне это надо для точной приявязки значений полученного напряжения ко времени проведения эксперимента.

afen
Offline
Зарегистрирован: 24.04.2017

SAlexander59 пишет:

Мне это надо для точной приявязки значений полученного напряжения ко времени проведения эксперимента.

Так и получай время измерения в delphi. Я ж тебе и говорю что реальное время будет отличаться на несколько миллисекунд (время выполнения analogRead + время выполнения Serial.println + время обработки в delphi) врядли выйдеш за пределы 1-2 mc.

Если формировать время измерения в ардуино то надо синхронизировать комп и ардуино как ты будеш это делать ? Программно ? опять же собьешься на несколько мс которые уйдут на обмен данными. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

SAlexander59 пишет:

Мне это надо для точной приявязки значений полученного напряжения ко времени проведения эксперимента.

Тогда Вам нужно озаботиться еще и источником точного времени: RTC дают лишь секунды, а millis() работает нерегулярно - приращения по 1 мс чередуются с приращениями по 2 мс.

djtorian
Offline
Зарегистрирован: 14.05.2017

Здравствуйте. Можете помочь? Посмотрел вашу тему, использовал ваш код, но у меня ничего не происходит. Может кините исходник. Если что вот моя почта djtorian@gmal.com. Буду очень, ну очень благодарным!!!

SAlexander59
Offline
Зарегистрирован: 21.04.2017

djtorian пишет:

Здравствуйте. Можете помочь? Посмотрел вашу тему, использовал ваш код, но у меня ничего не происходит. Может кините исходник. Если что вот моя почта djtorian@gmal.com. Буду очень, ну очень благодарным!!!

Если Вы обращались ко мне djtorian, то я отправил вам исходник программы и соответствующий скетч Arduino

После отправки вам исходника пришло сообщение, что письмо не было доставлено. Вы не ошиблись с указанием вашей почты djtorian?

В случае чего и исходник программы и скетч и мой комментарий ко всему этому можно скачать по адресу:

https://yadi.sk/d/GMZ11JCL3J9Rcz

SAlexander59
Offline
Зарегистрирован: 21.04.2017

andriano пишет:

SAlexander59 пишет:

Мне это надо для точной приявязки значений полученного напряжения ко времени проведения эксперимента.

Тогда Вам нужно озаботиться еще и источником точного времени: RTC дают лишь секунды, а millis() работает нерегулярно - приращения по 1 мс чередуются с приращениями по 2 мс.

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

SAlexander59 пишет:

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

Ну, вообще-то в ПК с измерением времени существенно хуже, чем в Ардуино. Да и появляется дополнительная задержка на передачу/прием, причем, неконтролируемая из-за того, что Windows не является ОС реального времени.

SAlexander59
Offline
Зарегистрирован: 21.04.2017

andriano пишет:

Ну, вообще-то в ПК с измерением времени существенно хуже, чем в Ардуино. Да и появляется дополнительная задержка на передачу/прием, причем, неконтролируемая из-за того, что Windows не является ОС реального времени.

но ведь в ПК есть встроеные часы, которые вроде бы показывают реальное время, которое отображает тот же самый Windows и его приложения. А в Arduino насколько знаю существуют только функции расчета интервала времени, прошедшего после запуска скетча - насколько я понимаю. Или я не прав и ошибаюсь? я еще очень слабо знаю возможности Arduino

negavoid
Offline
Зарегистрирован: 09.07.2016

SAlexander59 пишет:

но ведь в ПК есть встроеные часы, которые вроде бы показывают реальное время, которое отображает тот же самый Windows и его приложения

А ещё в ПК есть вытесняющая многозадачность, и та же Windows может отнять у вашей программы управление, а вернуть его, через, скажем 20 или 50 мсек, что составляет весьма дофига и не очень положительно сказывается на измерении временных интервалов (вы же не планировали пользовать мультимедийный высокоточный таймер).

SAlexander59
Offline
Зарегистрирован: 21.04.2017

negavoid пишет:

А ещё в ПК есть вытесняющая многозадачность, и та же Windows может отнять у вашей программы управление, а вернуть его, через, скажем 20 или 50 мсек, что составляет весьма дофига и не очень положительно сказывается на измерении временных интервалов (вы же не планировали пользовать мультимедийный высокоточный таймер).

Говоря 20 или 50 мсек вы имели в виду милли или микросекунды negavoid? Хотя думаю это все равно не страшно если считка данных идет с интервалом например 15 секунд и более. Или я ошибаюсь и чего то не учитываю?

Возник другой более серьезный вопрос - можно ли программным путем составлять, компилировать и загружать скетч из своего delphi приложения в Arduino? То что составить нужный скетч в Delphi приложении можно вроде бы сомнения не вызывает. Вопрос в том как скомпилировать и загрузить его в Arduino используя например его стандартное программное обеспечение. Есть ли режим командной строки в программном обеспечении Arduino, который можно было бы использовать для этого? Или есть какая либо другая возможность компиляции и загрузки скетча в Arduino? Кто то пробовал делать нечто подобное?

И еще один серьезный для меня вопрос - кто подскажет - каков ток потребляемый Arduino при его работе от автономного источника питания (батареи "Крона" например) - насколько он велик? Хочется прикинуть - какое время проработает Arduino как просто микроконтроллер, питаемый от стандартной батареи типа Крона?

negavoid
Offline
Зарегистрирован: 09.07.2016

SAlexander59 пишет:
Говоря 20 или 50 мсек вы имели в виду милли или микросекунды

Мсек - это миллисекунды, 20 мсек = 1/100 секунды. Для микросекунд я бы написал мксек, как принято стандартами.

SAlexander59 пишет:
Хотя думаю это все равно не страшно если считка данных идет с интервалом например 15 секунд и более

Это зависит от поставленной задачи. Может быть не страшно, а может оказаться очень критичным.

SAlexander59 пишет:
Или я ошибаюсь и чего то не учитываю?

Полагаю, что довольно многого вы не учитываете. 15 секунд на ПК может оказаться 14.9850001232 секунды, а на следующий раз 15.267543490347, а на следующий 15.0324327641, а если цпу сильно загружены, то и вообще, например, 19.4375683464 секунды. Для борьбы с этим в user-mode существуют такие мультимедийные точные HPET-таймеры, которые таки-обеспечат более-менее приемлемую точность отсчётов. В kernel-mode можно использовать и прерывания. Могут вылезти и другие подводные камни.

SAlexander59 пишет:
можно ли программным путем составлять, компилировать и загружать скетч из своего delphi приложения в Arduino? То что составить нужный скетч в Delphi приложении можно вроде бы сомнения не вызывает.

Возможно всё, вопрос лишь времени-цены-качества работы. Есть такая поговорка: "Быстро/Дёшево/Качественно - но одновременно только два пункта из трёх" :)

SAlexander59 пишет:
Вопрос в том как скомпилировать и загрузить его в Arduino используя например его стандартное программное обеспечение.

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

SAlexander59 пишет:
Есть ли режим командной строки в программном обеспечении Arduino, который можно было бы использовать для этого? Или есть какая либо другая возможность компиляции и загрузки скетча в Arduino?

"режим командной строки", как вы его обозвали, заключается в том, чтобы вызвать самому подсмотренные на предыдущем этапе команды и грамотно обработать их вывод. Так, как это делает сама arduino ide.

// компиляция
CreateProcess('gcc.exe -IArduino blablabla');
if (ExitCode = 0) then
  CreateProcess('ld.exe', blablabla);
// заливка
if (ExitCode = 0) then
  CreateProcess('avrdude.exe', blablabla);

SAlexander59 пишет:
Кто то пробовал делать нечто подобное?

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

SAlexander59 пишет:
каков ток потребляемый Arduino при его работе от автономного источника питания

Зависит от типа ардуины. Сам чип ATMega потребляет не очень много, а вот его обвязка и ваша присоединённая к ней схема... Самый простой способ - взять тестер и измерить в разрыве потребление получившегося устройства, а затем разделить крону (600 мАч) на получившееся значение и получить часы. Здесь тоже есть подводные камни, так как потребление устройством вовсе не обязано быть равномерным, например, иногда устройство включает двигатель или вайфай и ток на какое-то время возрастает с 10 мА до 300.
tryinfinity
Offline
Зарегистрирован: 24.04.2017

Подскажите, как заставить скрипт верно реагировать на команды из терминала.

void loop()
{
  int val = Serial.read() ;
  if (gsm.available()){
    Serial.write(gsm.read());   
  }
  if (Serial.available()){
   if (val  == 1) {gsm.write(Serial.read());} 
  }

}

По идеи команда от терминала должна выполняться только, если это будет 1, а она выполняет все равно все команды.

SAlexander59
Offline
Зарегистрирован: 21.04.2017

Есть хорошая новость Embarcodero выпустила полностью бесплатную версию своего продукта - Delphi Started Edition, которая доступна для бесплатного скачивания по адресу https://www.embarcadero.com/products/delphi/starter

Аналогичный продукт предоставляется для разработчиков на С++

Как указывается на данной страничке (даю упрощенный вариант перевода на русский):

"Приступая к реализации концепции вашего продукта или получения вашего стартапа с земли может быть сложно без начального капитала или дохода от продаж. Экипировка разработчиков с инструментами профессионального уровня может быть дорогостоящей, прежде чем вы будете продавать продукт. Таким образом, версия Delphi Starter Edition разработана и рассчитана на то, чтобы позволить отдельным лицам и стартапам загружать свое видение, пока соответствующие доходы не достигнут 1000 долларов, и в этот момент можно приобрести специальную лицензию Professional Edition.

Итак, если вы являетесь человеком, вы можете использовать Starter Edition для создания приложений для собственного использования и приложений, которые вы можете продать, пока ваши доходы не достигнут 1000 долларов в год. Если вы небольшая компания или организация без дохода (или до 1000 долларов в год), вы также можете использовать версию для начинающих. Когда общий доход вашей компании достигнет 1000 долларов США, или ваша команда расширится до более чем 5 разработчиков, вы можете перейти на неограниченную коммерческую лицензию со специальной лицензией Professional Edition. Дополнительные сведения см. В разделе Часто задаваемые вопросы о версиях для начинающих."

Таким образом появилась возможность легального использования данного программного продукта. Я там зарегистрирован и скачал и установил данную версию продукта. Конечно у нее есть определенные ограничения (см на сайте компании), но в обще то это уже хорошая новость. Проблемка в том, что у нее все таки хотя и большой, но огрниченный список компонентов. и я не нашел там компонентов для работы с СОМ портом. Попробовал использовать подключение модулей для работы с СОМ портом. Пока только немного стало получаться с bcomport, чей модуть (BCPort.pas) я подключил к своему проекту. В итоге получаю перечень СОМ портов ПК в ComboBox. Пока только разбираюсь с этой проблемкой. Может у кого то есть идеи по подключению доп компонентов для работы с СОМ портом на данном IDE? Если есть таковые - поделитесь. Думаю это в наших общих интересах. Вызывают так же интерес слова приведенные выше в информации о данном продукте - "Когда общий доход вашей компании достигнет 1000 долларов США, или ваша команда расширится до более чем 5 разработчиков, вы можете перейти на неограниченную коммерческую лицензию со специальной лицензией Professional Edition. " - таким образом получается, что можно сгруппироватьться в небольшие коллективы (более 5 человек) и получить в свое пользование неограниченную коммерческую лицензию со специальной лицензией Professional Edition. По крайней мере я так понимаю. Что скажете друзья?

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

SAlexander59 пишет:

Проблемка в том, что у нее все таки хотя и большой, но огрниченный список компонентов. и я не нашел там компонентов для работы с СОМ портом. Попробовал использовать подключение модулей для работы с СОМ портом. Пока только немного стало получаться с bcomport, чей модуть (BCPort.pas) я подключил к своему проекту. В итоге получаю перечень СОМ портов ПК в ComboBox. Пока только разбираюсь с этой проблемкой. Может у кого то есть идеи по подключению доп компонентов для работы с СОМ портом на данном IDE? Если есть таковые - поделитесь.

А своих компонентов для COM порта в Дельфи никогда и не было. Всегда сторонние использовали. Компонентов для работы с ком-портом много разных, надо пробовать

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

И кстати компоненты не обязательны, можно через API. Компоненты, как правило зависимы от версии виндавса, да и не все на них можно сделать. Некоторые функции у компонентов вообще криво работают. Лет 8 назад искал такие которые хорошо работали бы - не нашел. Работал с портами через апи. Не думаю, что с тех пор в в мертвой среде появились новые компоненты.

kalapanga
Offline
Зарегистрирован: 23.10.2016

SAlexander59 пишет:

Вызывают так же интерес слова приведенные выше в информации о данном продукте - "Когда общий доход вашей компании достигнет 1000 долларов США, или ваша команда расширится до более чем 5 разработчиков, вы можете перейти на неограниченную коммерческую лицензию со специальной лицензией Professional Edition. " - таким образом получается, что можно сгруппироватьться в небольшие коллективы (более 5 человек) и получить в свое пользование неограниченную коммерческую лицензию со специальной лицензией Professional Edition. По крайней мере я так понимаю.

Вы не совсем правильно понимаете. Если ваш доход больше штуки баксов или в вашем коллективе более 5 разработчиков, то вы должны приобрести лицензию professional. Как владельцу Startera вам ее продадут со скидкой. Теперь смотрите в деньгах:

10.2 Professional на одного пользователя стоит 83000 (на 5 пользователей 383000), апгрейд со стартера равен стоимости версии на которую апгрейдишся минус 60% стоимости стартера. Стартер сейчас предлагают бесплатно, а вообще-то он стоил 17000. Можете сами посчитать много ли вам скинут. (цифры с ibase.ru)

negavoid
Offline
Зарегистрирован: 09.07.2016

Я бы вообще не рекомендовал использовать дельфи для новых проектов, если жестко точно не знать, почему вы хотите именно этого. Как отписавший на нём более 20 лет это говорю. Есть бесплатный Visual Studio Express - си, с# с компонентами, которые точно так же можно радостно накликать мышкой. Всякие эклипсы для джавы. Да хоть Go. Но не дельфи, да ещё и сворованный у Idera. Для меня до сих пор большая загадка, отчего, даже сейчас, в 2017 году, в большинстве школ и вузов экс-СССР (в болгарии ещё) обучают именно на паскале, причём даже ведь и не на дельфи, а старый добрый борланд турбо компилятор там стоит! Ну не тупые ученики, они поймут начала алгоритмов на любом языке. Ну что это за свой, особый такой путь, ну а?

SAlexander59
Offline
Зарегистрирован: 21.04.2017

kalapanga пишет:

А своих компонентов для COM порта в Дельфи никогда и не было. Всегда сторонние использовали. Компонентов для работы с ком-портом много разных, надо пробовать

Я этим сейчас и занимаюсь. Убил кучу времени, а результата пока ноль. Пробовал, по совету, приведенному на сайте Embarcodero (https://www.embarcadero.com/images/dm/technical-papers/installing-asyncpro-into-delphi-xe-and-c++builder-xe.pdf) установить ASYNCPRO 4.0.7RC4 FOR DELPHI XE, но пока не получается

SAlexander59
Offline
Зарегистрирован: 21.04.2017

kalapanga пишет:

Вы не совсем правильно понимаете. Если ваш доход больше штуки баксов или в вашем коллективе более 5 разработчиков, то вы должны приобрести лицензию professional. Как владельцу Startera вам ее продадут со скидкой. Теперь смотрите в деньгах:

10.2 Professional на одного пользователя стоит 83000 (на 5 пользователей 383000), апгрейд со стартера равен стоимости версии на которую апгрейдишся минус 60% стоимости стартера. Стартер сейчас предлагают бесплатно, а вообще-то он стоил 17000. Можете сами посчитать много ли вам скинут. (цифры с ibase.ru)

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

SAlexander59
Offline
Зарегистрирован: 21.04.2017

brokly пишет:

И кстати компоненты не обязательны, можно через API. Компоненты, как правило зависимы от версии виндавса, да и не все на них можно сделать. Некоторые функции у компонентов вообще криво работают. Лет 8 назад искал такие которые хорошо работали бы - не нашел. Работал с портами через апи. Не думаю, что с тех пор в в мертвой среде появились новые компоненты.

Я знаю про возможность работы с портами через API. Но к сожалению мои познания в этом слишком скромные. Можете ли вы посоветовать что то (со ссылками) из доходчивого объяснения такого метода работы с СОМ портами на Delphi. Желательно очень подробное доходчивое объяснение с примерами. Если получится, то почему бы и не попробовать?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Да я уже нюансов не помню :(

kalapanga
Offline
Зарегистрирован: 23.10.2016

SAlexander59 пишет:

Я этим сейчас и занимаюсь. Убил кучу времени, а результата пока ноль. Пробовал, по совету, приведенному на сайте Embarcodero (https://www.embarcadero.com/images/dm/technical-papers/installing-asyncpro-into-delphi-xe-and-c++builder-xe.pdf) установить ASYNCPRO 4.0.7RC4 FOR DELPHI XE, но пока не получается

Вот в этой теме arduino usb delphi в последнем сообщении я ссылку на архив с компонентом и примером давал. Посмотрите, может подойдёт

SAlexander59
Offline
Зарегистрирован: 21.04.2017

brokly пишет:

Да я уже нюансов не помню :(

Так Вы этим больше не занимаетесь?

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

я тоже использовал этот компонент на делфи, все просто и удобно, работал как с ардуинкой так и с SIM800.

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

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Дельфой ? А зачем ? Она же померла :( Там обращение к апи от сишных не отличается, ну разве что структуры описать нужно с соответствующими типами данных. Но это все очень просто. Я же к чему в тему влез, что бы вы с компонентами не мучались, а сразу правильным путем пошли. Я помню еще например, что некоторые компоненты не умеют работать с портами больше COM4, некоторые просто перечислением портов не занимаются , какие то не все сигналы корректно отрабатывают, какие то натыкаются на пермишны и не могут с портом работать. В общем я, нормальных компонентов найти не смог, а работать нужно было с двумя стоп-битами.