Arduino <-> Android, USB Serial, Extrem langsam!

S

shavenne

Neues Mitglied
1
Hi!

Ich hab ein Problem.

Ich möchte mir eine eigene App bauen, die mir bestimmte CAN-Messages ins Infotainment-Netz meines Auto schreibt.
Arduino -> Auto klappt auch schon wunderbar. Aber die Schnittstelle zwischen meinem Android Tablet (Nexus 7 2013, Lollipop) und dem Arduino bereitet mir Schwierigkeiten. Zum Testen lasse ich derzeit einfach nur eine LED an oder ausgehen, was auch klappt, ABER: Es ist waaahnsinnig langsam und zwar abhängig von der Länge des Befehls.

Ich sende einfach nur ein 'ToCAN_UP' und der Befehl dauert locker 2-3sek. Wenn gleichzeitig auch noch Nachrichten reinkommen dauert's noch viel länger.

Ich nutze die usb-serial-for-android-Library dafür. Habe auch schon die Physicaloid Library getestet, genau das gleiche Problem.
Das merkwürdige ist nur: Andere Apps im Play Store, bei denen ich bespielsweise eine simple serielle Konsole habe, sind wunderbar schnell!

Ich hoffe irgendwer hat eine Idee :(

Den Code des Arduinos spare ich mir hier einmal, da es bei dem auf jeden Fall nicht hängt.

Hier der Java Quellcode, der noch ziemlich überschaubar ist:
Code:
package de.shavenne.android.youcanlisten;

import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;

import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;

import java.io.IOException;
import java.util.List;


public class MainActivity extends ActionBarActivity {
    private PendingIntent PendingIntent_UsbPermission;
    private static int RQS_USB_PERMISSION = 0;
    private final String ACTION_USB_PERMISSION = "de.shavenne.android.youcanlisten";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);



        List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);

        ImageButton buttonUp = (ImageButton) findViewById(R.id.upButton);
        ImageButton buttonDown = (ImageButton) findViewById(R.id.downButton);

        if (!availableDrivers.isEmpty()) {
            UsbSerialDriver driver = availableDrivers.get(0);
            Intent intent_UsbPermission = new Intent(ACTION_USB_PERMISSION);
            PendingIntent_UsbPermission = PendingIntent.getBroadcast(
                    this,      //context
                    RQS_USB_PERMISSION,  //request code
                    intent_UsbPermission, //intent
                    0);      //flags
            IntentFilter intentFilter_UsbPermission = new IntentFilter(ACTION_USB_PERMISSION);

            UsbDevice device = driver.getDevice();
            TextView textView = (TextView) findViewById(R.id.textView);

            String text = device.getDeviceName();
            manager.requestPermission(device, PendingIntent_UsbPermission);

            if(manager.hasPermission(device)) {
                text += " has permission";
            }
            textView.setText(text);


            final UsbDeviceConnection connection = manager.openDevice(device);
            final List<UsbSerialPort> mEntries = driver.getPorts();
            final UsbSerialPort port = mEntries.get(0);
            try {
                port.open(connection);
                port.setParameters(9600, 8, 1, 0);
                buttonUp.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        try {
                            port.write("ToCAN_UP\n".getBytes(), 500);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });

                buttonDown.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        try {
                            port.write("ToCAN_DOWN\n".getBytes(), 500);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Bin für jeden Tipp dankbar!

Gruß
Sven
 
Hallo Sven,
ich habe auch schon ein paar kleine Projekte mit dem Arduino gemacht - vorweg: machbar sollte dein Vorhaben sein (aber ich glaube das wusstest du bereits).

Ich habe mir deinen Code kurz angesehen und auf die schnelle habe ich keine direkte Idee wo hier das Delay entsteht. Das Handy wird zügig genug sein ;) Da sehe ich eher noch ein Problem beim Speicher des Arduino..
Die Kommunikation (zB zur Senorauswertung) habe ich über ein RC232 Bluetooth Modul geregelt, das ging wirklich super problemlos und auch über ein paar Meter hinweg. Die Module kosten knapp 10-15€ (gibt auch schon welche für 6€, da muss man aber selbst löten :D )
Wie auch immer, wenn du den Fehler weiter einkreisen willst, wäre das vielleicht was für dich:

Code:
deineFunktion(){
long start = System.currentTimeMillis();

// ...

Log.d("KlasseXY", "Funktion ausgeführt nach " + (System.currentTimeMillis() - start) + "ms");

}

Was meiner Meinung nach meist recht sinnvoll ist, ist die onClick-Methode als Interface zu implementieren -> ist leichter lesbar und besser hinsichtlich der Performance.

sprich
Code:
KlasseXY implements View.OnClickListener
und dann Alt+Enter.
 
Hi!

Danke! Ich bin quasi in den Anfängen, sowohl mit dem Arduino als auch mit der App-Programmierung, daher sieht das generell noch sehr chaosmäßig aus. ;)
Java war mir jetzt nicht so neu (hatte ich in meiner Ausbildung 3 Jahre lang), aber allzu gut war ich da nicht. Meine Programme haben zwar immer funktioniert wie sie sollen, aber der Code... oweia :laugh:

Komischerweise funzt nun alles schnell wie es soll (Beweis :D). Ich weiß aber nicht, was jetzt dazu geführt hat, dass es plötzlich wunderbar geht. Vielleicht weiß es ja einer!? :huh:.

Gruß
Sven
 
Hehe, wie der Code aussieht ist ja erstmal nebensächlich :) sieht richtig cool aus, was du da hinbekommen hast ;)
 

Ähnliche Themen

S
  • skywalker22
Antworten
1
Aufrufe
173
swa00
swa00
S
Antworten
17
Aufrufe
554
jogimuc
J
M
Antworten
4
Aufrufe
1.173
swa00
swa00
Zurück
Oben Unten