Прием данных из COM порта (Delphi) в Arduino Due

max_sl
Offline
Зарегистрирован: 15.08.2016

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

Программа на пк реализована на Delphi с библиотекой ComDrv32, считывание производится более-менее корректно, хотя присутствует "мусор" в начале передачи.

Вот кусок кода на Делфи (по нажатию кнопки, в COM порт должна отсылаться условная команда "DO" как сигнал о начале измерений. В ардуино она должна считываться ( я так понимаю посредством Serial.readString()) :

procedure TMainForm.ToolButton2Click(Sender: TObject);
begin
cpDrv.Port:=pnCOM6;
cpDrv.Connect;
cpDrv.SendString('DO');
OutgoingRichEdit.Text:='Measuring';

end;

Вот кусок кода на языке Arduino:

beginizm:

do // ждёт команды с пк
{
  //читаем serial порт ;
  //inChar=Serial.read();
  //inString=inString+inChar;
  inString = Serial.readString();
  //inString = inString1 + inString;
  myGLCD.print("WAITING", 180,100);
  myGLCD.print(inString, 200,120);
  
} while (Serial.available()); //while (inString!="DO");  

if (inString!="DO") 
goto beginizm;

То есть цикл крутится пока не увидит в порту нужной строки.Инициализация переменных произведена в начале программы. 

Проблема в том, что на экране arduino всегда висит WAITING, и даже при отправке строки DO c пк измерения не начинаются, в порт ничего со стороны ардуино не идет.

 

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

ужас а не код =)

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

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

В третих,  inString = Serial.readString(); не сработает почти никогда так как вы хотите, если вы ищите совпадение среди текста то его и ищите, если же с начала строки - так и ищите с начала строки...

char a,b;

while (1){

  if (Serial.avalilable()){

    b = Serial.read();

    if (a!="D"){

      a=b;continue;

    }else{

      if (b=="0"){break;}else{a="-";}

     }

};

дерзайте... если конечно поняли о чем я =)

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

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

Глупые предрассудки  :)