Witajcie.

Na początku zaznaczę, że bardzo zależy mi na czasie, ponieważ ten projekt powinien być jak najszybciej skończony, a jest ledwo zaczęty(w zasadzie już powinien być gotowy), dlatego też proszę o pomoc, bo nie mam pomysłu jak rozwiązać ten problem.

Piszę aplikację w Javie do diagnostyki aut. Do połączenia bluetooth używam Bluecove. Aplikacja łączy się z wtyczką ELM327, wysyła do niej komendy, wtyczka odpowiada, ale mam problem z obróbką tych danych. Komendy składają się z liter i cyfer. Wtyczka odpowiada również ciągiem znaków, jednak nie zawsze odpowiedzi otrzymuję wtedy, kiedy oczekuję. Poniżej wklejam kod i odp programu.

public class Bluetooth implements DiscoveryListener{

    //object used for waiting
    private static Object lock=new Object();

    //vector containing the devices discovered
    private static Vector vecDevices=new Vector();

    private static String connectionURL=null;

    public static void main(String[] args) throws IOException {

        Bluetooth client=new Bluetooth();

        //display local device address and name
        LocalDevice localDevice = LocalDevice.getLocalDevice();
        System.out.println("Address: "+localDevice.getBluetoothAddress());
        System.out.println("Name: "+localDevice.getFriendlyName());
/*
        //find devices
        DiscoveryAgent agent = localDevice.getDiscoveryAgent();

        System.out.println("Starting device inquiry...");
        agent.startInquiry(DiscoveryAgent.GIAC, client);

        try {
            synchronized(lock){
                lock.wait();
            }
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }


        System.out.println("Device Inquiry Completed. ");

        //print all devices in vecDevices
        int deviceCount=vecDevices.size();

        if(deviceCount <= 0){
            System.out.println("No Devices Found .");
            System.exit(0);
        }
        else{
            //print bluetooth device addresses and names in the format [ No. address (name) ]
            System.out.println("Bluetooth Devices: ");
            for (int i = 0; i <deviceCount; i++) {
                RemoteDevice remoteDevice=(RemoteDevice)vecDevices.elementAt(i);
                System.out.println((i+1)+". "+remoteDevice.getBluetoothAddress()+" ("+remoteDevice.getFriendlyName(true)+")");
            }
        }

        System.out.print("Choose Device index: ");
        BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in));

        String chosenIndex=bReader.readLine();
        int index=Integer.parseInt(chosenIndex.trim());

        //check for spp service
        RemoteDevice remoteDevice=(RemoteDevice)vecDevices.elementAt(index-1);
        UUID[] uuidSet = new UUID[1];
        uuidSet[0]=new UUID("0000110100001000800000805F9B34FB",false);

        System.out.println("\nSearching for service...");
        agent.searchServices(null,uuidSet,remoteDevice,client);

        try {
            synchronized(lock){
                lock.wait();
            }
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }

        if(connectionURL==null){
            System.out.println("Device does not support Simple SPP Service.");
            System.exit(0);
        }
*/
        //connect to the server and send a line of text
//ZROBIONE, BY ZA KAŻDYM RAZEM NIE WYSZUKIWAĆ URZĄDZEŃ
        StreamConnection streamConnection=(StreamConnection)Connector.open("btspp://000D18000001:16;authenticate=false;encrypt=false;master=false");
//        StreamConnection streamConnection=(StreamConnection)Connector.open(connectionURL);

        System.out.println("conn url" + connectionURL + "\n\n");
        
        //send string
        OutputStream outStream=streamConnection.openOutputStream();
        PrintWriter pWriter=new PrintWriter(new OutputStreamWriter(outStream));
        //read response
        InputStream inStream=streamConnection.openInputStream();
        BufferedReader bReader2=new BufferedReader(new InputStreamReader(inStream));
        String lineRead;
        

//W CELU TESTOW
        for (int i=0;i<20;i++)
        {
        Scanner skaner = new Scanner(System.in);
        String komenda;
        komenda = skaner.next()+"\r";
        System.out.println("komenda: "+komenda);
        pWriter.write(komenda);
        pWriter.flush();

        
        lineRead = bReader2.readLine();
        System.out.println("odpowiedz o dlugosci" + lineRead.length() + ":  " + lineRead);
        }
inStream.close();
        bReader2.close();
        outStream.close();
        pWriter.close();
        streamConnection.close();


    }
    //methods of DiscoveryListener
    public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
        //add the device to the vector
        if(!vecDevices.contains(btDevice)){
            vecDevices.addElement(btDevice);
        }
    }

    //implement this method since services are not being discovered
    public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
        if(servRecord!=null && servRecord.length>0){
            connectionURL=servRecord[0].getConnectionURL(0,false);
        }
        synchronized(lock){
            lock.notify();
        }
    }

    //implement this method since services are not being discovered
    public void serviceSearchCompleted(int transID, int respCode) {
        synchronized(lock){
            lock.notify();
        }
    }


    public void inquiryCompleted(int discType) {
        synchronized(lock){
            lock.notify();
        }

    }//end method



}
BlueCove version 2.1.1-SNAPSHOT on winsock
Address: 50B7C3D47C51
Name: ULTRABOOK

komenda: ate0
odpowiedz o dlugosci2:  OK

komenda: ati
odpowiedz o dlugosci0:  

komenda: ati
odpowiedz o dlugosci12:  >ELM327 v1.5

komenda: atz
odpowiedz o dlugosci0:  

komenda: atrv
odpowiedz o dlugosci12:  >ELM327 v1.5

komenda: atrv
odpowiedz o dlugosci0:  

komenda: atrv
odpowiedz o dlugosci1:  >

komenda: atrv
odpowiedz o dlugosci0:  

komenda: atrv
odpowiedz o dlugosci11:  ELM327 v1.5

komenda: atrv
odpowiedz o dlugosci0:  

komenda: atrv
odpowiedz o dlugosci5:  >atrv

komenda: atrv
odpowiedz o dlugosci5:  12.0V

komenda: atrv
odpowiedz o dlugosci0:  

komenda: atrv
odpowiedz o dlugosci5:  >atrv

komenda: atrv
odpowiedz o dlugosci5:  12.0V 

Z tego, co czytałem po wysłaniu komendy powinienem dostać odpowiedź. Próbowałem usunać te puste linie i wyświetlać napis tylko wtedy, kiedy w zmiennej lineRead jest coś różnego od "" i długość większa od 0, ale to nie pomogło. Czasami puste linie nadal występowały. Kolejny problem jest w tym, że czasami wyświetla znak > i powtarza komendę, a czasami nie.

Dla testów probowałem po wysłaniu komendy kilka razy zczytać zawartość bufora bReader2, ale wtedy aplikacja czasami przestawała działać, a czasem wyświetlała różną ilość odpowiedzi z różną ilością pustych linii.

Być może problem leży w "synchronizacji" działania tak, aby wyświetlało dopiero, gdy otrzymam pełną odpowiedź. Nie mam pomysłu jak to naprawić i dlatego proszę o pomoc.