Input/Output Arduino input.

DanielsLPecke

Mitglied
Hallo.
Ich möchte zum Arduino sowas wie "status1password" senden und dann entweder "true" oder "false" zurückbekommen.
Der Arduino Code ist schon fertig.
Ich habe schon angefangen. Mein Versuch:
Java:
refresh.addActionListener(e->{
                Thread t = new Thread(){
                    private Scanner s;

                    @Override
                    public void run(){
                        for(int i = 0; i<10;i++){
                            System.out.println("Okay i: "+i);
                            InputStream iS = chosenPort.getInputStream();
                            s = new Scanner(iS);
                            sendToArduino("stts"+i+pw.getText(), chosenPort);
                            while(!s.hasNextLine()){}

                            if(s.nextLine() == "true")
                                Log("Relai",i+" ist an");
                            if(s.nextLine() == "false")
                                Log("Relai",i+" ist aus");
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e1) {    }
                        }
                    }

                 
                };
                t.start();
        });

Also der Arduino bekommt schonmal was. Er erkennt das auch. Ich muss nur den Java Code schreiben zum empfangen .
 
HABE ES SELBST GELÖST 😀

Code:
refresh.addActionListener(e->{
                Thread t = new Thread(){
                    private Scanner s;

                    @Override
                    public void run(){
                        for(int i = 0; i<10;i++){
                            System.out.println("Okay i: "+i);
                            InputStream iS = chosenPort.getInputStream();
                            s = new Scanner(iS);
                            sendToArduino("stts"+i+pw.getText(), chosenPort);
                            //while(!s.hasNextLine()){}
                            String msg = s.nextLine();
                            System.out.println(msg);
                            //Log("DEBUG",s.nextLine());
                            if(msg == "true")
                                Log("Relai",i+" ist an");
                            if(msg == "false")
                                Log("Relai",i+" ist aus");
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e1) {    }
                        }
                    }

                   
                };
                t.start();
        });
 
Schön, aber ich hätte da noch ein paar Verbesserungsvorschläge, die ich dir noch mitgeben möchte:
- Concurrent API nutzen (keine Threads mehr selbst starten)
- Scanner API richtig nutzen und boolean rausparsen lassen
- Nie String mit "==", sondern mit "equals" vergleichen
- Nie einen catch-Block leer lassen

Dann kann es unter Umständen so aussehen:
Java:
refresh.addActionListener(e -> {
    ExecutorService exec = Executors.newSingleThreadExecutor();
    exec.execute(() -> {
        Scanner s = new Scanner(chosenPort.getInputStream());
        for (int i = 0; i < 10; i++) {
            System.out.println("Okay i: " + i);
            sendToArduino("stts" + i + pw.getText(), chosenPort);
            boolean msg = s.nextBoolean();
            Log("Relai", i + " ist " + (msg ? "an" : "aus"));
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    });
    exec.shutdown();
 

Neue Themen


Zurück
Oben