Arduino, Delphi, COMPort

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

Здравствуйте участники форума!

Пишу программу, которая управляет ардуино с компьютера (Вкл/Выкл реле, управляет шим сигналом).

Вопрос такой:

Мне надо отправлять условно говоря символ "0" чтобы вкл. реле1

если "1" то выл. реле1, управляю шим так: если выбрана скорость 85 то отправляю с Delphi "9", если 170 то "8" и тд.

проблема такая: могу отправлять только 0..9 после этого порт видет только последний символ, например "10" увидет как "0" подскажите как это исправить?

Общение делфи с ардуино происходит по средствам компонента comdrv32

Отправляю с Delphi так:

if RadioGroup1.ItemIndex=1 then
begin
CommPortDriver1.Sendstring('9');
end;

принемаю на Arduino так:

void loop() 
{
  if (Serial.available()>0)
 //{byte in_data=Serial.parseInt();
 { int in_data=Serial.read()-'0';

if (in_data ==0)
{
Serial.println("Pin8 ON");
digitalWrite (pin8, HIGH);
Serial.println("Pin10 ON");
digitalWrite (pin10, HIGH);
}
if (in_data ==1)
{
  
digitalWrite(DV_VKL, 0);
Serial.println("Pin8 OFF");
digitalWrite (pin8, LOW);
Serial.println("Pin10 OFF");
digitalWrite (pin10, LOW);
}

 

 

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

наверное проблема с типом данных, в ардуино разобрался как менять данные с int на char а в делфи не пойму как?

qbit
Offline
Зарегистрирован: 18.03.2019

nurgazin_d@mail.ru пишет:

Отправляю с Delphi так:

Отправь через обычный терминал.

void loop() {
  if( Serial.available() ) {
    int in_data = Serial.read();
    switch( in_data ) {
      case '0':
        Serial.println("Pin8 ON");
        digitalWrite (pin8, HIGH);
        Serial.println("Pin10 ON");
        digitalWrite (pin10, HIGH);
        break;

      case '1':
        digitalWrite(DV_VKL, 0);
        Serial.println("Pin8 OFF");
        digitalWrite (pin8, LOW);
        Serial.println("Pin10 OFF");
        digitalWrite (pin10, LOW);
        break;

      default:
        Serial.print("ERROR! Unknown byte: " );
        Serial.println( in_data );
    }
  }
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Дельфи через ком порт выдаёт ascii char. Запусти вот это кусочек и посмотри что прилетает из компорта. 

  if (Serial.available() > 0) {
   int i = Serial.read();
    Serial.print(i);
    Serial.print("  ");
    Serial.print(i, HEX);
    Serial.println(" ");
  }

 

VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

Проблема в том, что Serial.read считывает очередной (один!) байт из буфера последовательного порта. А вы, отправляя с компьютера строку из двух байт, рассчитываете получить их на Ардуино в виде числа.

Если вам для управления Ардуино хватит 256 значений, то отправляйте их таким способом:
CommPortDriver1.Sendstring(chr(ваше_значение));
А в скетче уберите - '0' в пятой строке.

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

VladimirTsibrov

ОГРОМНОЕ ВАМ СПАСИБО!СПАСИБО!СПАСИБО!СПАСИБО!СПАСИБО!СПАСИБО!

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

ВСЕМ ВАМ БОЛЬШОЕ СПАСИБО!!!! ОЧЕНЬ ПОМОГЛИ!!!