Problem mit Com-Port-Komunikation

Status
Nicht offen für weitere Antworten.

Kaladial

Bekanntes Mitglied
moin

also ich muss mein programm irgendwie umstricken und vielleicht könnt ihr mir helfen...

also ich hab nen programm geschrieben welches sich zu z.b. Com1 verbindet an dem ein Scanner angeschlossen ist...

Wenn ich an den Scanner z.b.den befehl: BZ schicke liefert er mir <ACK>BZ=0001<LF><CR> zurück
soweit sogut...

wenn ich jetzt aber
BZ
BZ
BZ
schicke, geht das n bissel durcheinander bzw nicht durcheinander aber meine antwort wird nicht in 3 antworten geteilt sondern alles in eine antwort rein gefriemelt...
<ACK>BZ=0001<LF><CR><ACK>BZ=0001<LF><CR><ACK>BZ=0001<LF><CR> bekomm ich dann als antwort...

das ist für den fall wie oben beschrieben noch nicht so das problem weil ich ja weis was zurück kommt und es entsprechend auseinander nehmen kann...

nun ist es aber so das der scanner eigentlich ne kamera ist und ich nun auch das bild abholen will

Code:
		for(int be=7; be>=0; be--){
			for(int zb=0; zb<(480/20); zb++){
				int zb_aktuell=zb*20;
				setzteWerte("IG1",0);
				
				String zb_str="";
				if(Integer.toHexString(zb_aktuell).length()==4){
					zb_str=Integer.toHexString(zb_aktuell);
				}else{
					for(int i=0; i<(4-Integer.toHexString(zb_aktuell).length()); i++){
						zb_str=zb_str+"0";	
					}
					zb_str=zb_str+Integer.toHexString(zb_aktuell);
				}
				String comand="IG2:0000"+zb_str+"0001000100500014";
				setzteWerte(comand,0);
				String comand2="IG3:0"+be+"00000000";
				setzteWerte(comand2,0);
			}			
		}

das kann ich über diesen code machen,
aber wie ihr set muss ich 3 komandos hintereinander abschicken und
dann auch nur die antwort vom 3. komando in eine datei umleiten....

hier hab ich aber das problem das mein code nicht wirklich wartet, zumindestens sieht das so aus wenn ich mir die COM-Komunikation angucke:

Request: 14.12.2007 14:10:35.46564 (+0.0938 seconds)

49 47 33 3A 30 30 30 30 30 30 30 30 30 30 0A 0D IG3:0000000000..
49 47 31 0A 0D 49 47 32 3A 30 30 30 30 30 30 35 IG1..IG2:0000005
30 30 30 30 31 30 30 30 31 30 30 35 30 30 30 31 0000100010050001
34 0A 0D 49 47 33 3A 30 30 30 30 30 30 30 30 30 4..IG3:000000000
30 0A 0D 49 47 31 0A 0D 0..IG1..

also wie kann ich meinen code so umbauen das er jedes komando einzeln ausführt und auch einzeln zurück gibt und erst dann das nächste komando anfängt?

hier drunter poste ich mal den kompletten code zur komunikation (ist etwas länger)

vielen dank für die hilfe :)

mfg Kala

Code:
		ScannerControl sc = new ScannerControl(comport, baudrate, datenbits, paritaet, stopbits, geraet, threadCounter);
		sc.scannerRead();

Code:
package ScanControl;

import java.net.InetAddress;
import java.util.Vector;

public class ScannerControl {
	
	private Vector<ScannerThread> threads = new Vector<ScannerThread>(); 
	private String comport[]; 
	private int baudrate[]; 
	private int datenbits[]; 
	private String paritaet[]; 
	private int stopbits[]; 
	private String geraet[]; 
	private int threadCount=0;
	
	public ScannerControl(String comport[], int baudrate[], int datenbits[], String paritaet[], int stopbits[], String geraet[] , int threadCount) {
		this.comport=comport;
		this.baudrate=baudrate;
		this.datenbits=datenbits;
		this.paritaet=paritaet;
		this.stopbits=stopbits;
		this.geraet=geraet;
		this.threadCount = threadCount; 
	} 

	synchronized public void scannerRead() { 
		for (int i = 0; i < threadCount; i++) { 
			ScannerThread thread = new ScannerThread(this, comport[i], baudrate[i], datenbits[i], paritaet[i], stopbits[i], geraet[i], i); 
			thread.running = true;
			threads.add(thread); 
			thread.start(); 
		} 
/*		try { 
			this.wait(); // Stoppt bis notify aufgerufen wird 
		} catch (InterruptedException e) { 
			e.printStackTrace(); 
		}*/ 
	} 
    
	public void sendeTest(){
		for(int be=7; be>=0; be--){
			for(int zb=0; zb<(480/20); zb++){
				int zb_aktuell=zb*20;
				setzteWerte("IG1",0);
				
				String zb_str="";
				if(Integer.toHexString(zb_aktuell).length()==4){
					zb_str=Integer.toHexString(zb_aktuell);
				}else{
					for(int i=0; i<(4-Integer.toHexString(zb_aktuell).length()); i++){
						zb_str=zb_str+"0";	
					}
					zb_str=zb_str+Integer.toHexString(zb_aktuell);
				}
				//System.out.println("zb_str:"+zb_str);
				String comand="IG2:0000"+zb_str+"0001000100500014";
				setzteWerte(comand,0);
				String comand2="IG3:0"+be+"00000000";
				setzteWerte(comand2,0);
			}			
		}
		
		/*setzteWerte("BZ",0);
		setzteWerte("BZ",1);
		setzteWerte("VE",0);
		setzteWerte("VE",1);*/
	}
	
	private String setzteWerte(String command, int PortID){
		StringBuffer    rxMsgBuf  = new StringBuffer(5000);  //Empfangspuffer 
		String          rxMsg     = ""; 
		command = command + "\n\r";  
		threads.get(PortID).get(command, rxMsgBuf); 
		rxMsg = rxMsgBuf.toString();
		return rxMsg;
	}	
	
	public boolean initDone(){
		boolean returnwert=true;
		for(int i=0; i<threadCount; i++){
			if(threads.get(i).running==false){
				returnwert=false;
			}
		}
		return returnwert;
	}

	
	public void stopThread(){
		for(int i=0; i<threadCount; i++){
			threads.get(i).running=false;
		}
	}
	
	public synchronized void removeThread(ScannerThread thread) { 
		threads.remove(thread); 
		if (threads.size() == 0) { 
			this.notify(); 
		} 
	} 

}

Code:
package ScanControl;

import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.TooManyListenersException;

public class ScannerThread extends Thread implements SerialPortEventListener{
	int ii = 0;
	ScannerControl scanner;
	private String comport; 
	private int baudrate; 
	private int datenbits; 
	private String paritaet; 
	private int stopbits; 
	private String geraet; 
	int threadid; 
	private CommPortIdentifier portId;
	private SerialPort serialPort;
	private InputStream inputStream;
	private OutputStream outputStream;
	public boolean verbindung = false;
	public boolean running = false;

	String in;

	private StringBuffer inputBuffer = new StringBuffer(1);
	
    public StringBuffer rxMsgBuf;
    public String txMsg;

	public ScannerThread(ScannerControl scanner,String comport, int baudrate, int datenbits, String paritaet, int stopbits, String geraet , int threadid) {
		this.scanner=scanner;
		this.comport=comport;
		this.baudrate=baudrate;
		this.datenbits=datenbits;
		this.paritaet=paritaet;
		this.stopbits=stopbits;
		this.geraet=geraet;
		this.threadid = threadid; 
		
		
    	int parity_int=0;
    	if(paritaet.compareToIgnoreCase("keine")==0){
    		parity_int=SerialPort.PARITY_NONE;
    	}
    	if(paritaet.compareToIgnoreCase("gerade")==0){
    		parity_int=SerialPort.PARITY_EVEN;
    	}
    	if(paritaet.compareToIgnoreCase("ungerade")==0){
    		parity_int=SerialPort.PARITY_ODD;
    	}
		try {
			portId = CommPortIdentifier.getPortIdentifier(comport);
			try {
				serialPort = (SerialPort)portId.open(comport + "_IO", 2000);
				try {
					serialPort.enableReceiveTimeout(25);
					serialPort.setSerialPortParams(baudrate, datenbits, stopbits, parity_int);
					try {
						serialPort.addEventListener(this);
						try {
							inputStream = serialPort.getInputStream();
							try {
								outputStream = serialPort.getOutputStream();
								System.out.println("Start Reader Thread for " + portId.getName());
								serialPort.notifyOnDataAvailable(true);
								verbindung = true;
							} catch (IOException e) {
								System.err.println("SerialIO(6): " + e.toString());
								inputStream.close();
								serialPort.close();
								verbindung = false;
							}
						} catch (IOException e) {
							System.err.println("SerialIO(5): " + e.toString());
							serialPort.close();
							verbindung = false;
						}
					} catch (TooManyListenersException e) {
						System.err.println("SerialIO(4): " + e.toString());
						serialPort.close();
						verbindung = false;
					}
				} catch (UnsupportedCommOperationException e) {
					System.err.println("SerialIO(3): " + e.toString());
					serialPort.close();
					verbindung = false;
				}
			} catch (PortInUseException e) {
				System.err.println("SerialIO(2): " + e.toString());
				verbindung = false;
			}
		} catch (NoSuchPortException e) {
			System.err.println("SerialIO(1): " + e.toString());
			verbindung = false;
		}	
	}

	public String get(String txMsg, StringBuffer rxMsgBuf) {
    	this.txMsg = txMsg;
    	this.rxMsgBuf = rxMsgBuf;
        //System.out.println("Jetzt sende ich");
        send(txMsg);

        doGet();
        return in;
    }

	public synchronized void send(String given){
		int length = given.length();
		byte[] retvalue = new byte[length];
		char[] c = new char[length];
		given.getChars(0, length, c, 0);
		for (int i = 0; i < length; i++) {
			retvalue[i] = (byte)c[i];
 		}
		try {
			send(retvalue);
		}
		catch(Exception e) {
		    System.out.println("SerialIO(send 2): " + e.toString());
		}
	}
	
	private synchronized void send(byte[] temp){
		//System.out.println("send byte");
		try {
			outputStream.write(temp, 0, temp.length);
			outputStream.flush();
		}
		catch(Exception e) {
		    System.out.println("SerialIO(send 1) " + portId.getName() + ": " + e.toString()); //$NON-NLS-1$
		}
	}

    public void doGet(){
		new Thread(){
			public void run(){
			//	System.out.println("Jetzt bin ich in der Runmethode");
				while ( available()==0 ){
/*					try {
						//Thread.sleep(100);
					}
					catch (InterruptedException e) {}*/
				}
				
				try {
					Thread.sleep(75);
				}catch (InterruptedException e) {}
				if ( (ii = available())>0 ){
					if(inputBuffer.toString().startsWith("\u0006"+"IG3")){
						in = receive();
						
						int anzahl = in.getBytes().length;
						if(anzahl>0){
							in = in.substring(0, anzahl - 1);
							rxMsgBuf.replace(0, rxMsgBuf.length(),in);
						}
						
						System.out.println(rxMsgBuf);
					}else{
						receive();
					}
					
					//AVS3.fuelleWerte(rxMsgBuf);
				}else{
					rxMsgBuf.setLength(0);
				}
			}
		}.start();
	}
    
	public int available(){
		return(inputBuffer.length());
	}
    
	public synchronized String receive(){
		String str = inputBuffer.toString();
		inputBuffer.delete(0, inputBuffer.length());
		return(str);
	}
	
	public void run() { 
		try { 
			while (running) { 
				sleep(1000);
			} 
		} catch (Exception e){} 

		try {
    		outputStream.close();
            inputStream.close();
        }catch (IOException e) {
    	    System.err.println("SerialIO(close): " + e.toString());    	
        }
        serialPort.close();
        
        System.out.println("Serial Port " + portId.getName() + " closed!");
		
        scanner.removeThread(this); 
	} 
	
	public void serialEvent(SerialPortEvent event){
    	int newData = 0;
    	//System.out.println("empfange was...");
    	switch(event.getEventType()) 
        {
        case SerialPortEvent.BI:
        case SerialPortEvent.OE:
        case SerialPortEvent.FE:
        case SerialPortEvent.PE:
        case SerialPortEvent.CD:
        case SerialPortEvent.CTS:
        case SerialPortEvent.DSR:
        case SerialPortEvent.RI:
        case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
            break;
   	    case SerialPortEvent.DATA_AVAILABLE:
   		    while ( newData!=-1 ){
   		    	try {
   		    		StringBuffer inputBuffer_old = new StringBuffer(inputBuffer.length());
   		    		inputBuffer_old=inputBuffer;
   		    		inputBuffer = new StringBuffer((inputBuffer_old.length()+1));
   		    		inputBuffer=inputBuffer_old;
   		    		
   		    		newData = inputStream.read();
    			    if (newData == -1)
    			    	break;
   			    	inputBuffer.append((char)newData);
   		    	} 
   		    	catch (IOException ex) {
   		    		System.err.println("SerialEvent(1): " + ex.toString());
    		    	return;
    		    }
   		    }
    		break;
    	default:
    		break;
        }
    }
}
 
T

tuxedo

Gast
Mal ne Frage am Rande:

Was für ne Kamera ist das? Ne Art WebCam per RS232?

Sowas könnt ich nämlich auch gebrauchen...
 

Kaladial

Bekanntes Mitglied
das is ne ODI-MAC344 von omnitron... die wird über rs232 angesteuert ist aber eigentlich als datamatrix scanner für die industrie gedacht
 
T

tuxedo

Gast
Hmm, bei google hab ich jetzt nix gefunden. Hört sich aber nicht billig an ...

hab allgemein nur das hier gefunden: http://www.sander-electronic.de/gm00021.html

Aber rund 75€ ist n bisschen zu viel des guten, dafür dass ich noch ein Gehäuse, Pegelkonverterplatine etc. brauche.

-- Alex
 
T

tuxedo

Gast
Hmm, ist n bisschen viel Code ;-)

Wen ich das Problem richtig verstanden habe, dann sendest du die Anfrage bzgl. des Bildes hin, bekommst aber erst nach der 3. Anfrage (gleicher natur) die Bilddaten zurück?

Ohne den Code im Detail betrachtet durchforstet zu haben:

Wenn du auf den OutputStream der Verbindung drauf schreibst (und mit einem flush() sicher stellst dass das KOmmando auch sofort am Stück weggeht (was du ja tust)), dann sollte dein Programm als nächstes ja auch solange warten bis die Antwort von der Kamera komplett da ist. Wenn dein Programm das nicht tut, dann hast du irgendwas schlecht designed und beispielsweise das sequentielle Frage-Antwort-Spiel mit einem Thread oder so dermaßen entkoppelt, dass nicht auf die Antwort gewartet wird.

Ich empfehle dir ein Minimalbeispiel zu basteln. Eins mit definitiv unter 100 Zeilen Code. In "komplexen" Konstrukten ist das Testen nicht immer empfehlenswert.

- Alex
 

Kaladial

Bekanntes Mitglied
hmmm

die frage ist wie bekomm ich ein minimales programm hin?

ich will an den comport folgendes senden:

Code:
comand="IG1"; 
for(int be=7; be>=0; be--){ 
         for(int zb=0; zb<(480/20); zb++){ 
            int zb_aktuell=zb*20; 
            setzteWerte("IG1",0); 
             
            String zb_str=""; 
            if(Integer.toHexString(zb_aktuell).length()==4){ 
               zb_str=Integer.toHexString(zb_aktuell); 
            }else{ 
               for(int i=0; i<(4-Integer.toHexString(zb_aktuell).length()); i++){ 
                  zb_str=zb_str+"0";    
               } 
               zb_str=zb_str+Integer.toHexString(zb_aktuell); 
            } 
            String comand="IG2:0000"+zb_str+"0001000100500014"; 
            setzteWerte(comand,0); 
            String comand2="IG3:0"+be+"00000000"; 
            setzteWerte(comand2,0); 
         }          
      }

also die befehle:
comand="IG1";
comand="IG2:0000"+zb_str+"0001000100500014";
comand2="IG3:0"+be+"00000000";

und ich will nur die antwort von IG3 auswerten ....
wie soll ich das denn machen?
 

Kaladial

Bekanntes Mitglied
ahja ig3 liefert
<ACK>IG3=0640<1600 Byte an pixel>

diese 1600 byte will ich in ne datei umlenken und beim 2. 3. usw aufruf an die datei anhängen
 
T

tuxedo

Gast
Kommt denn auf IG1 eine Antwort? Bzw. kommt auf jeden Befehl eine Antwort?

Wenn auf jeden Befehl eine Antwort kommt, dann ist das doch ganz einfach...

Verstehe nicht wo das Problem ist:

pseudocode hat gesagt.:
while(!interrupted()){
Befehl senden
Antwort erhalten
Auswerten ob Antwort weiterverarbeitet werden muss, ggf. an Vater-Thread die Antwort weitergeben
}
 

Kaladial

Bekanntes Mitglied
naja was ich für nen problem hab, ist folgende tatsache:

ich schicke z.b. IG1
und bekomme instant die antwort:
<ack>IG1=0001<ln><lf>

wenn ich IG2 (samt parameter) schick
bekomm ich nur
<ack><ln><lf>

wenn ich nun aber IG3 schick (samt parameter)
bekomm ich:
<ack>IG3=0640[Daten]
[Daten]
[Daten]
[Daten]
[Daten]

bis halt die 1600 bytes fertig sind

das problem ist, ist halt wann sind die daten alle übertragen?
es muss ja mehr oder weniger so laufen:
hole ab bis nix mehr kommt...

nur wie definiert ich: "bis nix mehr kommt"
ich hab im mom das problem das ich halt warte bis ne antwort kommt, da der 1600er block aber aufgesplittet wird weil die komm keine 1600 byte auf einmal schickt, das ich den ersten teil der antwort mitbekomm und der rest dann wild durcheinander geht,....
 
T

tuxedo

Gast
Aha, und wird ig3 auch mit <ln><lf> (new line, form-feed??) abgeschlossen?

Wenn du weißt dass das Bild als 1600 Bytes besteht:

Wo ist das Problem fix "<ack>IG3=0640" zu lesen, und danach ein read(byte[]) zu machen, und zwar mit einem Array das exakt 1600 groß ist?

Deine Aussage "wild durcheinander" versteh ich nicht. Das ganze basiert doch auf einem Stream. Da kommt nix wild durcheinander, sondern schön nacheinander.


- Alex

- Alex
 

Kaladial

Bekanntes Mitglied
also ich geb nur die daten aus die ich bekomm und es kommt halt auch vor (warum auch immer) das ich sowas bekomm:


IG3:064
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
 
T

tuxedo

Gast
Na 3 mal darfst du raten warum das so aussieht... Das Bild wird dir als Binary geliefert. D.h. du kannst das nicht auf der Console ausgeben, sonst kommt halt sowas dabei raus (lauter nicht darstellbare Sonderzeichen etc...). Sieh zu dass du "<ack>IG3=0640" erkennst, und dann speichere die kommenden 1600 Bytes in ein Byte-Array, welches du dann per neuen OutputStream in eine Datei schreibst. Fertig.

- Alex
 

Kaladial

Bekanntes Mitglied
nein das is mir klar...
das problem "IG3:064 "

^^ das hat er mir geschickt und hat irgendwie die 0 verschluckt... und das weis ich nicht wieso er das einfach macht...
 
T

tuxedo

Gast
Woher weißt du dass er die 0 verschluckt hat? Hast du das allei mit der Console geprüft?

Hat die Kamera denn ein Handbuch oder sowas wo deren Protokoll beschrieben ist? Gibts das vielleicht irgendwo im Netz?

- Alex
 
T

tuxedo

Gast
Woher weißt du dass er die 0 verschluckt hat? Hast du das allei mit der Console geprüft?

Hat die Kamera denn ein Handbuch oder sowas wo deren Protokoll beschrieben ist? Gibts das vielleicht irgendwo im Netz?

- Alex
 

Kaladial

Bekanntes Mitglied
Code:
Pseudocode um Bilddaten vom MAC340/344 anzufordern
Fehlerbildzähler abfragen: EI
Fehlerbild auswählen: EI1 oder EI2 oder EI3 oder EI4 oder EI5 oder EI6
//Schleife um Daten anzufordern:
für alle Bitebenen (7,6,5,4,3,2,1,0)
{
für alle 20er Zeilenblöcke (0, 20, 40, ... ,440, 460)
{
sende seriell: "IG1"
ignoriere Antwort
sende seriell: "IG2:0000" + aktueller Zeilenblock (4stellig, führende Nullen, in hex) + "0001000100500014"
ignoriere Antwort
sende seriell: "IG3:" + aktuelle Bitebene (2stellig, führende Nullen, in hex) + "00000000"
akkumuliere Antwortbytes: 9 Bytes header + 1600 Bytes Bilddaten,
entferne die 9 Bytes vom Anfang und schreibe die restlichen 1600 Bytes in Datei,
falls Datei schon vorhanden, hänge Daten an.
}
}
// Datei besteht aus 192 Blöcken (8 Bitebenen x 24 Zeilenblöcke mit je 20 Zeilen) mit jeweils 1600 Bytes
// Der Dateiname ist ein Aufrufparameter für die compose.exe, der zweite Aufrufparameter
// ist der Dateiname der neu zu generierenden Datei (Typ: Bitmap, BMP).
^^ das is die beschreibung zum auslesen des bildes...
 
T

tuxedo

Gast
Na also.. Ist doch "kein Problem". Lesen tust du dann mit einem primitiven "InputStream". Da liest du nach dem senden von "IG3" erst ein 9 Byte großes byte[], und danach ein 1600byte großes byte[] ...

Steht auch noch irgendwo was man alles aus den 9 Byte Headerdaten interpretieren kann?

- Alex
 

Kaladial

Bekanntes Mitglied
nein...

aber sorry ich bin trotzdem etwas verwirrt... ich bastel jetzt schon seit 3 tagen dran rum und bekomms net gebacken noch dazu bin ich erkältet und kann nich richtig denken *ggg*

also nen netter beispielcode wäre nett :)
 
T

tuxedo

Gast
Solltest mal ein wenig frische Luft schnappen gehen ;-)

Code:
// Meine Dummy-Streams. Musst du dir halt aus der seriellen Verbindung holen...
		OutputStream outputStream = null;
		InputStream inputStream = null;
		
		// lesean mit read(byte[]) KANN vorher abbrechen so 
		// dass nicht das ganze byte[] gefüllt wurde. Deshalb verwende ich gern
		// die readFully() Methode aus dem DataInputStream. Die garantiert das komplette
		// füllen des byte[] (sofern so viele Daten überhaupt ankommen)
		DataInputStream dataInputStream = new DataInputStream(inputStream);
		
		// aktuelle Bitebene (2stellig, führende Nullen, in hex)
		String aktuelleBitebene = "0000"; 
		
		// String für die Bildanfrage
		String bildAnfrage = "IG3:" + aktuelleBitebene + "00000000";
		
		// Bildanfrage senden
		outputStream.write(bildAnfrage.getBytes());
		
		// Container für den Bildheader und das Bild
		byte[] bildHeader = new byte[9];
		byte[] bild = new byte[1600];
		
		dataInputStream.readFully(bildHeader);
		dataInputStream.readFully(bild);
		
		// Bild in File schreiben. 
		FileOutputStream fileOutputStream = new FileOutputStream(new File("meinBild.bmp"));
		fileOutputStream.write(bild);
		fileOutputStream.close();

Habs nicht getestet (kann ich hier ja auch gar nicht). Aber so in etwa sollte es funktionieren. Was mir noch unklar ist, ist das "überspringen" der Antworten aus IG1 und IG2. Gelesen werden MÜSSEN diese bytes. Nur kannst du sie eben ggf. wieder verwerfen. Aber RAUS müssen sie aus dem Puffer.

Deshalb hab ichs hier mal weggelassen. Das bisschen Doku sagt ja leider nicht wie die Ende der Antwort jeweils signalisiert wird. Wenn es ein "normaler" Zeilenumbruch ist, dann kannst du für diese Antworten einen BufferedReader nehmen der "readLine()" kennt. Oder du liest solange byte-weise bis du selbst den Zeilenumbruch gefunden hast.

Kommt denn (auch) ein Zeilenumbruch nach den Bilddaten? bzw. kommt nach jeder Antwort ein Zeilenumbruch?

- Alex
 

Kaladial

Bekanntes Mitglied
das weis ich leider nicht, da es in der doku nicht drin steht ... aber ich werd das mal versuchen raus zu bekommen :)

dank dir dann erstmal und werd ma versuchen das einzubauen
 
T

tuxedo

Gast
Kaladial hat gesagt.:
das weis ich leider nicht, da es in der doku nicht drin steht ... aber ich werd das mal versuchen raus zu bekommen :)

Sollte im Handbuch stehen. Wenn du da ein Link zu einer PDF oder so hast wär's klasse wenn ich auch ein Blick reinwerfen dürfte. So ne Kamera interessiert mich nämlich auch ....
 

Kaladial

Bekanntes Mitglied
jo also ich hab jetzt was programmiert was so ziehmlich funktionieren müsste..
nur dein file-write überschreibt jedesmal die datei...

wie war das mit anhängen an eine datei?
 
T

tuxedo

Gast
Dann mach doch einfach die File nach den 192 Blöcken zu und nicht nach jedem ....192 mal File öffnen und Daten anhängen ist alles andere als performant.

Zum FileWriter: Die API-Doc hilft da ungemein: http://java.sun.com/javase/6/docs/api/java/io/FileWriter.html#FileWriter(java.io.File,%20boolean)

- Alex
 

Kaladial

Bekanntes Mitglied
ok so wie ich es mir gedacht hab funktioniert es net...

aber hab schon ne neue idee ...
allerdings:
wie bekomm ich den kompletten stream aus dataInputStream?
 
T

tuxedo

Gast
Streams haben eigentlich keinen Anfang und Ende ... D.h. du kannst die größe des Streams nicht bestimmen. Das ist wie wenn du den Anfang und das Ende des Rhein bestimmen wolltest.. Wo fängst du an den Anfang zu definieren? An der Quelle? Und was ist mit der Quelle? Wo fängt die an? Und wo hört der Rhein auf? Klar, der fließt ins Meer. Aber wo hört das auf? Und wo fließt das Meer hin?

Du siehst: Ganz so einfach ist das nicht. Und Streams sind da nicht wirklich besser. Die hören auf wenn nix mehr kommt. Aber wann nix mehr kommt, weiß der Stream nicht. Das weiß nur der, der die Quelle der Daten darstellt. Und der müsste diese Information auch als Daten über den Stream übertragen.

Aber wieso stellst du dich so an?

Mach die File einfach VOR dem ersten Block der 192 auf und mach das .close() des Streams NACH den 192 Blöcken. Dann hast du doch was du willst, oder nicht?

- Alex
 

Kaladial

Bekanntes Mitglied
du hast mein programm noch nich so richtig verstanden...
also ich hab das im moment so, das jedesmal wenn was auf der COM ankommt, er in ne funktion geht die den ankommenden datenstream auswertet...

wenn also 3 zeichen ankommen dann geht er da rein und wenn 50000 ankommen geht er auch nur einmal da rein ,...

das problem:
es kommt zwar alles nacheinander, aber nicht befehl für befehl sondern irgend ne größe die der COM grad für richtig hält...

und da zu dem zeitpunkt wo der COM die daten abschneidet net unbedingt die komunikation fertig sein muss muss ich halt alles ankommende überprüfen und zusammen packen um es dann wieder auseinander zu nehmen...

sagen wir es so: es is einfach grausam...


gibt es net so ne möglichkeit ala:
while(solange wie noch nen zeichen da is)
überprüfe das zeichen auf i
überprüfe das nächste zeichen auf g
überprüfe das nächste zeichen auf 3
überprüfe das nächste zeichen auf :

dann lass die nächsten 4 zeichen weg
und nun schreibe 1600 zeichen (zeichen für zeichen) in die datei

wenn der stream kürzer is merk dir den rest und warte auf den nächsten input

wenn nun die 1600 zeichen fertig sind
suche wieder nach i g 3 :
 
T

tuxedo

Gast
Doch, ich hab das schon verstanden...Aber du hast mich nicht verstanden ;-)

a) Du solltest heraus finden wann eine Antwort von der Kamera "fertig" ist. Kommt da ein extra Zeichen? Zeilenumbruch? Oder ist die Länge der Antwort (speziall bei den IG1 und IG2 Antworten) irgendwie spezifiziert?
b) mit readFully() liest du exakt die Menge an Bytes die dein übergebenes byte[] groß ist. Aber das hab ich ja schonmal geschrieben und sogar mit Beispielcode aufgezeigt. Wenn du das ignorierst oder nicht ausprobierst, dann kann ich dir nicht helfen.

Wenn du genau weißt dass die Antwort mit igX: (x kann 1-3 sein) anfängt, dann weißt du doch: Die Antwort beginnt mit 4 Zeichen. Also machst du ein 4 Zeichen großes Byte[] und liest das mit readFully(). Daraus kannst du einen String basteln und den mit equals() auf ig1, ig2 oder ig3 oder igX vergleichen und dann entsprechend weiterlesen oder aufhören.

btw: die Com-API schneidet nix ab. Sowas nennt sich Sender und Empfangspuffer. Und damit kann man ohne Probleme umgehen wenn man weiß DASS ES so ist.

- Alex
 

Kaladial

Bekanntes Mitglied
das was ich gesucht hab ist : dataInputStream.available()
das liefert zurück wie groß der stream ist ...

readFully()is ja toll nu was bringt es mit wenn ich nicht weiß was full heist?

ich habe hier stringts die ma 5 zeichen und ma 5000 zeichen gro0 sind (die werden so von der com übermittelt)
daher kann ich auch nicht einfach sagen lies ma 1600 zeichen... ich weis ja gar nicht ob die com mit grad eben soviel geliefert hat ...

noch dazu kann ich net einfach 4 zeichen einlesen, dann es kann auch passieren das mit die com 3 zeichen im 1. stream schickt und das 4. im 2. stream ...

oder das er mir
20 zeichen vom letzten bild danach den nächsten ig befehl 1 dann ig befel 2 und dann ig befehl3 davon dann aber wirder nur die hälfte des befehls oder den ganzen befehl und nur die hälfte der daten oder 3/4 der daten oder die ganzen daten schickt ...

das ist das was ich mein mit: die größe der übergegeben streams variiert ...
 
T

tuxedo

Gast
Du bist auf dem Holzweg... available liefert dir nur "etwa" zurück wieviel gerade "lesbar" ist. Und keinesfalls wie groß der Stream überhaupt ist. Insgesamt ist es mehr ein Schätzeisen auf das man sich nicht verlassen sollte:

JavaAPI hat gesagt.:
available

public int available()
throws IOException

Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream. The next invocation might be the same thread or another thread. A single read or skip of this many bytes will not block, but may read or skip fewer bytes.

Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream.


- Alex
 
T

tuxedo

Gast
Ach ja:

Noch was zu deinem:

>> wenn ich nicht weiß was full heist?

DU Held. Ich schreibst jetzt zum dritten und letzten mal:

readFully liest exakt so viel aus dem Stream wie dein übergebenes byte[] groß ist. Aber auch das steht in der JavaApiDoc ...

readFully

void readFully(byte[] b)
throws IOException

Reads some bytes from an input stream and stores them into the buffer array b. The number of bytes read is equal to the length of b.

This method blocks until one of the following conditions occurs:

* b.length bytes of input data are available, in which case a normal return is made.
* End of file is detected, in which case an EOFException is thrown.
* An I/O error occurs, in which case an IOException other than EOFException is thrown.

If b is null, a NullPointerException is thrown. If b.length is zero, then no bytes are read. Otherwise, the first byte read is stored into element b[0], the next one into b[1], and so on. If an exception is thrown from this method, then it may be that some but not all bytes of b have been updated with data from the input stream.

man man man... ich sags ungern, aber manchmal hilft es wenn man versucht das gelesene zu verstehen.
 

Kaladial

Bekanntes Mitglied
ja und du verstehst mich trotzdem nicht...

readFully liest alles bis mein byte-feld voll ist...
^^ das bringt mir aber NIX...
dazu müsste ich vorher mein BYTE-Feld so groß machen wie mein Stream ist ... und woher wenn nicht durch available soll ich wissen wie groß mein Stream ist damit ich mein bytefeld so definieren kann und dann mit readFully diesen komplett auslesen kann?
 
T

tuxedo

Gast
Du weißt doch aber das 192mal 9 Bytes Header und 1600 Bytes Bilddaten kommen, oder etwa nicht?

Keiner spricht davon mit readFully "alles" auf einmal zu lesen. Halte dich doch an die Doku der Kamera und lese wie dort vorgeschlagen das ganze Blockweise "am stück". Soll heissen: die 1600Bytes immer jeweils auf einmal und nicht in kleinen Häppchen die man dann erst wieder zu ganzen 1600 bytes zusammenbauen muss.

- Alex
 

Kaladial

Bekanntes Mitglied
ja und genau das funktioniert nicht ...
da die daten nicht zusammenhängend in einer übertragung kommen bzw nicht kommen müssen...

ich hab daten die so aussehn:
<ack>IG3:064

das wars...

und ich hab daten da passen die 1600 5 mal rein ...

oder ich hab daten da kommt erst der rest vom letzten bild dann kommt ig1 ig2 und ig3 der anfang...

aber ich glaub ich hab keine lust mehr ...
ich lass den mist einfach weg... ist eh viel zu langsam...
und man braucht das nicht unbedingt ...
 
T

tuxedo

Gast
In keiner Stream-Verbindung kannst du _alles_ auf einmal lesen. So sind Streams nunmal.


> ich hab daten die so aussehn:
> <ack>IG3:064
> das wars...

Hmm, was ist "<ack>" für ein Zeichen? Aus deinem bisschen Doku das du gepostet hast geht das nicht hervor.
Kommen nach "IG3:064" überhaupt noch welche Zeichen? Was sagt available() wenn du soweit schon gelesen hast?
Wenn available "0" liefert, dann stimmt was mit der Kamera nicht. Dann scheint die nicht weiter Daten zu senden.

> und ich hab daten da passen die 1600 5 mal rein ...

Ein Bild besteht doch auch aus 192 x 1600Byte?

> oder ich hab daten da kommt erst der rest vom letzten bild dann kommt ig1 ig2 und ig3 der anfang...

Das sieht mir stark danach aus, als ob der lese-zyklus durcheinander gerät und nicht wirklich am Ende des Bildes aufhört, sondern zu früh. Das würde erklären warum im nächsten Durchlauf noch Reste der Bilddaten kommen, bevor du wieder die Antwort von IG1 und IG2 ließt.

> aber ich glaub ich hab keine lust mehr ...

Das heisst du gibtst dich geschlagen? Jetzt wo's anfängt interessant zu werden ;-) *g*
 

Kaladial

Bekanntes Mitglied
<ack> = das normal bestätigungszeichen... "\u0006"

also wie gesagt es ist nicht wirklich reproduzierbar...
die daten kommen in ziehmlich willkürlicher länge an meinem com an ... daher kann ich nicht sagen los liess 9 zeichen und sag: du bist der header...

da es sein kann das es eigentlich daten vom letzten bild / daten von den anderen beiden befehlen sind oder nen abgeschnittener ig3 befehl....

"IG3:064": available sagt das sind sei 7 zeichen lang

aber meist kommt ja nicht "IG3:064" alleine sondern das sieht dann eher so aus:

"<restdaten>

<ack>IG1=0001

<ack>

IG3:064"


>Ein Bild besteht doch auch aus 192 x 1600Byte?

ja ich mein ja das sehr oft daten in der größe von 4096 byte oder so ankommen... aber das halt auch net immer...

hmmm und ich weiß nicht ... ich habs schon versucht einfach nur
in einerschritten auszulesen aber selbst da bringt er mir diese daten so...

>Das heisst du gibtst dich geschlagen? Jetzt wo's anfängt interessant zu werden *g*

:) naja wir können ja gern noch weiter versuchen das hinzubekommen :)
 
T

tuxedo

Gast
Die größe von 4096 ist erklärbar. Das wird die Puffergröße sein.

Hast du mal mit Hyperterminal probiert so ein Bild anzufordern?

Kannst du mir da mal einen Mitschnitt von IG1 2 und 3 (nicht alle 192 blöcke) posten?

Die Reihenfolge der Daten scheint ja zu stimmen, nur sind sich beide Seiten (Kamera und Programm) nicht wirklich einig wo was anfängt und wo es aufhört. Läuft quasi nicht wirklich synchron.

- Alex
 

Kaladial

Bekanntes Mitglied
antwort auf (im Hyperterm):
IG1
IG2:000000200001000100500014
IG3:00100000000

=

IG1=0001

IG3:0640upÕwUUÉfKE<UTEEUwQÑô“]t55}TuDWEÇUMmT[~…ð}Ñ•ÅÅWÃe¥\WDNÛqQEUuU\W5U^ùU
UTUÔGGPÔVTYwUWWÄ2qQ×U]Ô]à×”“DvÐ]`ÉWDÑtô5DUÝ×]]]´UuÝ"ÍUTUEU±q†ÝUUm¼Sõ]
ÔõÑuÕEÕwd5=DUÑTÕUFWeSᑃ5\^}×cA”qETU]GUUW}gUeWWEGUuUUU9]…Y·QUUWQ^ÕU×Õ
^YU…uWUguUUEUQuSUqÜugDÕEEYUQYmTCÑÆVUiUEET}]uuW—]5Á}PoØU×|DUU5ö]}wuUuÕu
QQ\÷ÍUÑeEUUTWßùÐUÕDWtQUMmQUUEU·atUM×UÕUUÄUWU—UUUsW”UÓ}ÜugúH¶yö]çUAñE
ÂUU0eåwtRU5UustµGÀŒÔ`ÑÞ5YóDÕDEUÕ_U5ÕEÝUEyPUuÓ¼Ûu_wEßÕ×M•Ôñß”EEÕUQDÕu
Ñs]]VÔýOCÖô\BUUUVÐUÄQÙe0ÑÔaÓuuÝEQÍÑuRÔÇU]UÝ©tW×ÕÕÕÒ]—ÙOWWÓÕyÕU ÌUÜuEV^Ç
”DW×Ww]]}'UTGÖUu]Uõ}EAEUUUUÅ5UåUUUÝÕt]ýuU×í]ÇTÝ}|ÕEUýÅÙuuÕUÕTUYÝ÷FÖ
QU UUW~}µ×T$UEMÔdETt”UUÍ@]Q×ÐAQôõÑ]TœéuuuÅUQµUUÕwÕÕWQWÕW ]W]ÓÕþ}GU•üuQUÞç
Q^ÕÕoEñUq•U]%UUe0UV-TÅvWAUUGWUW]W•TQDQÑTS'ØÇÑDUTP_ÔUUÑOÖUT\VÍd|}QU;U
UAG§ÄQ™WÀUÕUQWÉUQPHQØUUHÕ\yÕÝuÅUÕ]Õ%UEUWñU×WUWÕA}y·äQOEU__Q\]UÔ\%KC]ÄUaÃ
UUÇ÷ÓŒPUTDX•W4UÀÖ±WAÕÕE×WuQøE5^\õµ:ÕTUUÝDuWUWyña5qetMG\UTOÕ]Õ|\wÇÑ×
Åå[D_DdQåWÕ
UQUUUUEÕQxUwTÕ‘U‘bTÔEQGUUW]ÜU'üõQõE_e\²%EUÕwUUœåÕTR@ñlUTÍW
ÇO6ÕEÞƒÕåOÖÕST˜Q<YUQ‚uEYTÕ]•UUARTVT@&6W]QGEw×U]CWuU“ÅE=UUU!µ'GÜÅÝuU
Ô AS@;ØÕEÕómWuUÑFUqUgUUQØUEW
MõuTQHÑEUUx/GvÕÔGAUdUVQé6u
$QÑTýRGU$õUWUuVqÕõY|qU]Ä'ÕGUUÔqQUWU\E‘üÅu
S]E@}\ÕU}\QCRGLEPUEUEA EÉU[]UuEoPEÕM


-> hier macht der hyperterm aber ne neue seite (also ka ob das nun ne neue antwort oder ob hyperterm einfach nur die vorherige eingabe löscht weil zuviel drin steht)

MõuTQHÑEUUx/GvÕÔGAUdUVQé6u
$QÑTýRGU$õUWUuVqÕõY|qU]Ä'ÕGUUÔqQUWU\E‘üÅu
S]E@}\ÕU}\QCRGLEPUEUEA EÉU[]UuEoPEÕM
 

Kaladial

Bekanntes Mitglied
-> hab die aufzeichnungsoption vom hyperterm gefunden :)

hab hier diese befehle hintereinander eingegeben (paste and copy):

IG1
IG2:000000000001000100500014
IG3:00000000000
IG1
IG2:000000200001000100500014
IG3:00100000000
IG1
IG2:000000400001000100500014
IG3:00200000000

ergebnis:

IG1=0001

IG3:0640Õ 7Murwý×uUÝw
3]QHWU5}ÀWE3Ä.¥5ÑUUU@uUvYAL]T…QUqDÁ7ewöTEmQu”AÓÖEwq]ËÑ1ÝÅUO]uD×4$ßE¤5Å7Q•UUNcDɨƒÍáDMQQQUI]½U_åEo6MDVU￾@Õ\d•uUUTQzDTÅ]TU•EÓ|uswWUUuÅOÐQE÷Fy÷uUQCG\¿4´UqQFEUueUÝ\µõ7QÁAqU$w\]UÜT]QUUBSÔÿÕUU]UtåeEPÐW]UUÕŸI=õU@QYoUTVõ·cÝQu(lA2PW\]SL•u8UÕÓ÷õ]UUUOYUUmwGUEtÖTQuU]MMtq}ÕíöY￾UUtåtÕUÕSY×5GYÕ]UuQ4￾UÜ$Vó&WUD]u_Tq||¥ÔEÓ'UUEUÉe_QÔÕtMUUUu—UequE[ÖT’ÕÿÙ]}×ôåôuGÝUÝÚuwÄõ_TýQU_•Å%E mDETW1Ññ—ÙïÔyç}³X—€U—UERU=y}7ÅQUEUUQ]eUÕR=_”}G
]5ÇÅEU￾wUU[õ}½õYUÍ]P1ÃLHEWU\_qÉèUUU]ûóÑEWXUU•ÄíwYÕEUDÑQWP6]EÑÅ•WÜ’U1QTUßSÒÙÄuUWSD0%EEUeMU_QWÕ}ÔEBÓAUÕW“Yu\UuUuDUUUdEÕUÑÝT7Ý·‘õgU|UWí=5ÝÑÔpUWÉ×E{×yý͇QdíÑ5QQoW￾u]VtwnèZ7ÐtGÿÝSF×eÑMŽtQUÕUTWPtQ]ZÓ^YUÙ…ºM…\RUT￾ñÄd¥TTUq\U5}T|UTÁÈuV]UÕÅ_YU·q”qQU“aEVUDOuSÝ•￾ßmUuSUWQATUWUu]××ÖpçÑUMñÇ]QFU5MVqUE\UUÕå@Q&^EQ-Ño\uÜW÷üÑoVÕ]Uv}±e,UGÑTQÝTuy@ß]UUTL•ÍTÁUݵUGÕÃ×_EUåUEEeC\P9uùBED%V=ÔTUUPÅWÖsë–qDuuUYUÕÇRTÄu[qEPOTTemTU•]uT×Tž¥—UUöÔAW5÷ñ]E)U]uutžÕÅe%õTÃSôMQÝUTu_…ÐÓE]TUõ•u\ÕUM×T÷ÝQq¤WõeuME]•]UMwUüõWýQU^™aTW××ÅWUEQUuSUÕEDÀ’*UUUU]uUýÝuVÛ￾ßUusEvQ￾S…[ÅÕUÞÝÚWW UUXUi]Õõ]uQUQMQ’UÕAW×WwCWeUq cGa]åUUP“ÍÔ}ÞUçgEFÐáUR÷DÔq½ÛU]e}Yž
UUPVT7@×wEGP”UVUçT]áñ\|•pÝUUÅ=EÐÔÓCGpÕEpE}E_UUWÿþ§QF5›ÑáREö?aQS[UŒUwÄWuPA@pu￾QQEYU=\Õ÷¤ÁåU6L]u}wÝW]TWŠ]Ptu}R}Uõ}U Øç—]W5Ÿ}pÕw}”WŸPmÍu;ÑÕWxñ•Ae9DeœLc}UTQÁ]UI7%¡@<U•Õ±EW_]×Í1`UóžO AÍÑUE4TuvµÅòÕR￾™Ð´LÌEÝ{µ9qÅ|}EÝÍTEU5UTWWU_½ðUU,yAu^õE’õBUX¡Uu}v@–W•XÐÝEUuWß]w5Õp_ÅWGUÒu†ÚtÕUwUKvÅ´ §É|ÅÅÒq<]ÕyÑ%7Ý5UWq￾ù…DTT]ý\o´XPuWüOPA_0½eDÐtÁ•ÕÇuVÕQQ×T|u]ÑvUGUÕTÔ5Õ××YuUU1V]
IG1=0001

IG3:0640upÕwUUÉfKE<UTEEUwQÑô“]t55}TuDWEÇUMmT[~…ð}Ñ•ÅÅWÃe¥\WDNÛqQEUuU\W5U^ùUUTUÔGGPÔVTYwUWWÄ2qQ×U]Ô]à×”“DvÐ]`ÉWDÑtô5DUÝ×]]]´UuÝ"ÍUTUEU±q†￾ÝUUm¼Sõ]ÔõÑuÕEÕwd5=D￾UÑTÕUFWeSᑃ5\^}￾×cA￾”qETU]GUUW}gUeWWEGUuUUU9]…Y·QUUWQ^ÕU×Õ^YU…uWUguUUEUQuSUqÜugDÕEEYUQYmTCÑÆVUiUEET}]uuW—]5Á}PoØU×|DUU5ö]}wuUuÕu]uGÕUSÔ
QQ\÷ÍUÑeEUUTWßùÐUÕ￾DWtQUMmQUUEU·atUM×UÕUUÄUWU—UUUsW”UÓ}ÜugúH¶yö]çUAñEÂUU0eåwtRU5UustµGÀŒÔ`ÑÞ5YóDÕDEUÕ_U5ÕEÝUEyPUuÓ¼Ûu_wEßÕ×M•Ôñß”EEÕU￾QDÕuÑs]]VÔýOCÖô\BUUUVÐUÄQÙe0ÑÔaÓuuÝEQÍÑuRÔÇU]UÝ©tW×ÕÕÕÒ]—ÙOWWÓÕyÕUÿÌUÜuEV^Ç”DW×Ww]]}'uUTGÖUu]Uõ}EAEUUUUÅ5UåUUUÝÕt]ýuU×í]ÇTÝ}|ÕEUýÅÙuuÕUÕTUYÝ÷FÖe…UQTUQUÕUÓŸ˜UUauFMUŸEu7ÔTTEtÕUý5Á×EYUÕwW]EBuU]×TUÕuyoYV_aå
A QU UUW~}µ×T$UEMÔdETt”UUÍ@]Q×ÐAQôõÑ]TœéuuuÅUQµUUÕwÕÕWQWÕWÿ]W]ÓÕþ}GU•üuQUÞçURVÜWE—U=Ue@UUUe
™UA]p ]UUEETTØåUU]ÛUWqÕUD^M]Wå‘W7ÕUõWmWÔw_ÒÜV0EVteýUUUUwdxpÕUTUQU
Q^ÕÕoEñUq•U]%UUe0UV-TÅvWAUUGWUW]W•TQDQÑTS'￾ØÇÑDUTP_ÔUUÑOÖUT\VÍd|}QU;UUAG §ÄQ™WÀUÕUQWÉUQPHQØUUHÕ\yÕÝuÅUÕ]Õ%UEUWñU×WUWÕA}y·äQOEU__Q\]U￾Ô\%KC]ÄUaÃUUÇ÷ÓŒPUTDX•W4UÀÖ±WAÕÕE×WuQøE5^￾\õµ:ÕTUUÝDuWUWyña5qetMG\UTOÕ]Õ|\wÇÑ×qå[D_DM]T@ 
Å dQåWÕ
UQUUUUEÕQxUwTÕ‘U‘bTÔÔEQGUUW]ÜU'üõQõE_e\²%EUÕwUUœåÕTR@ñlUTÍWÇO6ÕEÞƒÕåOÖÕST˜Q<YUQ‚uEYTÕ]•UUARTVT@&6W]QGEw×U]CWuU“ÅE=UUU!µ'GÜÅÝuUÔÿAS@;ØÕEÕómWuUÑFUqUgUUQØUEWAÕÑMrÿCÕõU×UUõÑPEtUIQUô^uuQVGˆÇmeÇlEUÆOUUVeTU”DeÅ4EY_wßqeWU5ÕÕQÔÕAUuõ]WÕUýUõUu÷LWô@U]uýwÝœÎÖv=•uQÝ×ru@Q MõuTQHÑEUUx /GvÕÔG AUdUVQé6u $QÑTýRGU$õUWUuVqÕõY|qU]Ä'ÕGUUÔqQUWU\E‘üÅuÔT5QFÇWD]'RGLEPUEUEA EÉU[]UuEo PEÕM
S]E@}\ÕU}\QC
IG1=0001

IG3:0640P\QE ￾PTYUÕ]T}fATøUX^pU׌\ŒAUqÝHLW5WQS`AA5@p€QTtTðESWqUU O5ôÑTTYÕÔô}TQ••‘ tETU‰DP
@ …T”UU¼1†U#•MPUqU5UâQpŽ]TtT'URÖW}µW—ðTWPÕUNUÜ]UEÑ ÅÕ]5G]‚u¹ÅIAP`UT@HõMU`UDPUuQUpMSDˆ2uVwWYTuQEÔs߆p×DÕU+·9t?UAÝUe•Ç!CUx@DFÁeU]YÕ@I¥yVµVeE–QyYE5TUdddpEtQQ9ÅEÇ…]TUUU￾µ—ùÿ|aPUMøFUT@T￾ÅuÕµW•q￾@ BTXÐX•LE@c@À„EÐW´ PT‘T? QTõQÕE`UôFôTFuDWuYÕuU5Q}ßT?áDYA•p\WQ—T@ G1FbEQaQUuMUÖUTU•Á`F½É@\EPMSÕEUyQQ5VU]]TäñWUsT×ñAq}•ÔWeeA\¨5àÇ
ÑMXUET4mG]]<Lu”HD@1SU]ÑTPUzA\UY_UPQ4W‹ÝdUT@ÕesWWpEtuPQÄUáUIe/ÔU 1UA}eQUUU uPDeAM 7ÕEÔUDBUQUÅU\wU]
Õß\]ôhíE€U•QTÅUOÇÕVwXAAUôyPN_Ä UrBíÁšUAEQPT8%SâIeQç–￾PAI• AsGZA˜MsÅUWTUyLWßUU¼FCQd_‹T^WÕ5TAQAðDQ@EAL•ÑUSÔQ]UÀgQ=Í\`@TmQAaUUNÄIT…Uþ4UÉPÝUVUÀETFUõ• F ÔQE7ÐD ø õõEEP…ÕÔ 7 B•\XHuÔDDRQõTM]ÔüR! ]ýÝM!Qt@]QUÄgpUÕqYTX_tVePQJ1FEiUÄPÜTÐUHAZÄASå•pbL`FUC}TAEUÕÕQEAÕcÌmvUDYÄ}UE
ÝVQTM×ãÀD”µ4Õ|€DE
@5WuÅpmT5DÂP„U…EÂt=TDEÌĉE!e×ÕU 8EPUD|ÅE]]uTGÆsMߥ•UõUu…Ö1P@ˆEÓÄW€E7T0ô€" ￾EAudRQP0@ôL VPô@Þ1Q@]Ua&DˆÄuT2u\TQeUUUWEGV\|%ÐLgEóAQu_@T „D%Qv) ”AMAd‘fXP€ Õ\ ”TY…DãEEU ×ÒU\DqáŽuÅU¿]•UUUTUßHÌUÔäUESgiEÖvóUs)ao5“ ç4QdÔUPBC*IHTÖTYQR]Á¥……QPW]5pW11õeD]ÔU
UUz¼uh_tTETuA2AdW–
ÑED:'AB
 
T

tuxedo

Gast
Hm, das sieht doch schon recht "sauber" aus.

Auf IG1 gibts eine Antwort mit "IG1=0001", gefolgt von einem offensichtlichen Zeilenumbruch
Auf IG2 gibts scheinbar eine "leere" Antwort, sprich eine Leerzeile
und auf IG3 kommen die Daten. Und auch IG3 scheint mit einem Zeilenumbruch abgeschlossen zu werden.

Da liegt es fast nahe einen BufferedReader zu benutzen, und ein "readLine()" zu machen.
Wobei ich nicht weiß wie sich Binärdaten (Bild) in einem String verhalten.
Ergo würde ich bei den DataInputStream bleiben.

Deine Anfragen an die Kamera formulierst du als String "IG1\n", machst ein Byte[] daraus, und sendest das ganze in den Ausgabestrom. Gefolgt von einem "flush()".

Danach musst du lesen. Da wir wissen dass die Anwort auf IG1 "IG1=0001" ist, wissen wir dass es mindestens 8 Zeichen zzgl. Zeilenumbruch sind. Der Zeilenumbruch kann entweder nur ein "\n" sein, oder auch ein "\n\r". Das solltest du versuchen rauszufinden. Einfach mal die ersten 8 Bytes nach dem IG1-Befehl lesen und die kommenden 2 Zeichen jeweils einzeln auf \n und \r vergleichen. Dann weißt du wie der Zeilenumbruch aussieht und kannst dann erkennen wann die nächste antwort anfängt.

Wenn du das hast, sollte es nicht schwer sein den Rest auch zu lesen. Bei IG2 kommt ja nix, nur der Zeilenumbruch.

Die Antwort von IG3 fängt ja immer mit "IG3:0640" an. Dummerweise sind das nur 8 Zeichen. In der Doku stand aber was von 9 Bytes Header.

.. Hmm... Wo taucht denn das "<ack> = das normal bestätigungszeichen... "\u0006" " auf?
Ich vermute mal das kommt noch VOR dem "IG3:0640" und kann nicht angezeigt werden? Wenn ja, dann muss das bei der Antwort von IG1 und 2 natürlich noch berücksichtigt werden und aus dem Strom rausgelesen werden.

Wichtig: Zeichen im Strom überspringen heisst: Trotzdem lesen, aber das gelesene verwerfen. Alternativ kann man in den meisten Streams auch die skip() Methode benutzen. Aber trotzdem auslesen und das ausgelesene verwerfen tut's auch.

Wenn das mit dem <ack> dann geklärt ist, kannst du den Header der IG3 Antwort lesen und ggf. wegwerfen. DANN liest du die 1600Bytes Bilddaten:

Code:
byte[] bild_teil = new byte[1600];
readfully(bild_teil);

Nicht vergessen: Auch hier den Zeilenumbruch wieder lesen und erkennen. Ohne einen korrekt erkanntes Ende der Antwort gerät dir alles durcheinander und es kommt das dabei raus was du vorhin beschrieben hast. Wichtig ist vor allem ob das Ende aus 1 oder 2 Zeichen besteht (also \n oder \n\r).

- Alex
 

Kaladial

Bekanntes Mitglied
also das <ack> wird in dem gepostet fall als viereck dargestellt () und bei IG2 kommt ebenfals ein <ack> + zeilenumbruch

und auf IG1<CR> antwortet der scanner mit:
06 49 47 31 3D 30 30 30 31 0A 0D .IG1=0001..

<ACK> I G 1 = 0 0 0 1 <LF> <CR>

auf IG2:000000000001000100500014<CR>:

06 0A 0D ...

<ACK> <LF> <CR>

auf IG3:00000000000<CR>:

06 49 47 33 3A 30 36 34 30 D5 20 37 4D 75 72 77 .IG3:0640Õ 7Murw ... rest daten ...
59 75 55 55 31 56 5D 1D 1D 0A 0D YuUU1V]....

<ACK> I G 3 : 0 6 4 0 DATEN <LF> <CR>
 
T

tuxedo

Gast
Na das wird immer besser.

Wenn du jetzt nirgendwo ein Zeichen vergisst zu lesen, so müsste das ganze doch recht prima klappen?!

Wie gesagt: Durcheinander kanns nur kommen, wenn der Zeilenumbruch nicht korrekt berücksichtigt wird, oder du ein einfaches read() benutzt und nicht berücksichtigst, dass vielleicht nicht das ganze byte[] zu diesem zeitpunkt gefüllt werden konnte. Am besten alles mit readFully machen und das übergebene byte[] in die korrekte größe (wissen wir ja schon vorher anhand deinen eben geposteten aufzeichnungen) bringen.

- Alex

- Alex
 

Kaladial

Bekanntes Mitglied
hmmm also ich find nicht wirklich das mich die letzten posts irgendwie weiter gebracht haben ...

wenn ich in meinem programm die befehle schicke kommen die ja nicht einfach so zurück sondern ich hab zum einen nen zeitversatz drin ...

also ich bin mir nicht ganz sicher aber viellicht muss ich meinen thread nochmal umbauen ... hmmm *arg* nur das is so nervig ...
 
T

tuxedo

Gast
Vielleicht solltest du dir ein minimales beispiel basteln, ohne thread, in dem du nur die kamera mit befehlen fütterst und alles was ankommt in die console, oder besser in eine Datei schreibst.

Und dran denken:
Wenn du das Programm neu startest, solltest du auch die Kamera neu starten. Denn die hat unter umständen noch irgendwelche Daten die gerade unterwegs sind und beim letzten mal nicht abgeholt wurden. Sicher ist sicher -> beides jeweils neu starten.

- Alex
 
T

tuxedo

Gast
Naja, ich kanns nicht ausprobieren da ich die Kamera nicht hab, abe rich würds mal so versuchen:

Code:
String portName = "COM1";
		
		CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
		
		if (portIdentifier.isCurrentlyOwned()) {
			
			System.out.println("Error: Port is currently in use");
			
		} else {
			
			CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000);

			if (commPort instanceof SerialPort) {
				SerialPort serialPort = (SerialPort) commPort;
				serialPort.setSerialPortParams(57600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
		
				InputStream in = serialPort.getInputStream();
				OutputStream out = serialPort.getOutputStream();
		
				// für's readFully()
				DataInputStream dis = new DataInputStream(in);
				
				
				// für den zeilenumbruch
				byte[] umbruch_gelesen = new byte[2];
				byte[] umbruch_vergleich = new String("\n\r").getBytes();
				
				
				// Die 3 Befehle definieren
				String befehl1 = "IG1\n";
				String befehl2 = "IG2:000000000001000100500014\n";
				String befehl3 = "IG3:00000000000\n";
				
				
				
				// Sende Befehl 1
				out.write(befehl1.getBytes());
				out.flush();
				
				// Lese Antwort 1
				byte[] antwort1 = new byte[9]; 
				
				dis.readFully(antwort1);
				dis.readFully(umbruch_gelesen);
				if (umbruch_gelesen!=umbruch_vergleich) {
					System.err.println("Umbruch von Antwort 1 nicht gefunden");
					System.exit(1);
				}
				System.out.println(new String(antwort1)); // Auf der Console ausgeben
				
				// ----------
				
				// Sende Befehl 2
				out.write(befehl2.getBytes());
				out.flush();
				
				// Lese Antwort 2
				byte[] antwort2 = new byte[1]; 
				
				dis.readFully(antwort2);
				dis.readFully(umbruch_gelesen);
				if (umbruch_gelesen!=umbruch_vergleich) {
					System.err.println("Umbruch von Antwort 2 nicht gefunden");
					System.exit(1);
				}
				System.out.println(new String(antwort2)); // Auf der Console ausgeben
				
				// ----------
				
				// Sende Befehl 3
				out.write(befehl2.getBytes());
				out.flush();
				
				// Lese Antwort 3
				byte[] antwort3 = new byte[9];
				byte[] antwort3_bilddaten = new byte[1600];
				
				dis.readFully(antwort3);
				dis.readFully(antwort3_bilddaten);
				dis.readFully(umbruch_gelesen);
				if (umbruch_gelesen!=umbruch_vergleich) {
					System.err.println("Umbruch von Antwort 3 nicht gefunden");
					System.exit(1);
				}
				System.out.println(new String(antwort3)); // Auf der Console ausgeben
				System.out.println(new String(antwort3_bilddaten)); // Auf der Console ausgeben

		
			} 
		}

Wenn das Programm vor der ausgabe des antwort3_bilddaten Arrays hängt, dann dürfte was mit der kamera nicht stimmen oder du musst\n\r in \r\n umdrehen.

- Alex
 

Kaladial

Bekanntes Mitglied
hmmm der meine byte-arrays net miteinander vergleichen ...
umbruch_vergleich und umbruch_gelesen verweisen ja nur auf ne speicheradresse ... ich glaub net das man die so einfach miteinander vergleichen kann
 

Kaladial

Bekanntes Mitglied
also nachdem ich den vergleich angepasst hab muss ich sagen das es geht :)

ich werd das jetzt mal versuchen bei mir einzubauen :) dank dir :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
ABstraCT Telnet port Zugriff problem (public IP) Netzwerkprogrammierung 12
R Problem mit mehreren Anfragen auf demselben Port Netzwerkprogrammierung 2
I Socket Problem mit den WebSocket Antworten der Discord API Netzwerkprogrammierung 0
K Java Websocketserver Problem | Android to Pi Netzwerkprogrammierung 1
C RMI Produzent-Verbraucher-Problem - Code review Netzwerkprogrammierung 12
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
S Problem bei dem Bluetoothverbindungsaufbau Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
M Netty - TCP Problem Netzwerkprogrammierung 4
L Socket Problem mit Server Netzwerkprogrammierung 1
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
M Socket CDI, Websocket reference Problem ! Netzwerkprogrammierung 2
Shams Problem mit Eventbus in Verbindung mit Server Netzwerkprogrammierung 0
G apache httpClient Problem. Netzwerkprogrammierung 5
H Problem mit ObjectStreams Netzwerkprogrammierung 3
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
D Socket BufferedWriter/Reader Problem Netzwerkprogrammierung 1
Maxim6394 Problem mit Socks5 Implementierung Netzwerkprogrammierung 0
C Handle Connection Problem Netzwerkprogrammierung 3
E HttpUrlConnection Cookie Problem Netzwerkprogrammierung 0
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
O 4Gewinnt Multiplayer - Netzwerk Problem (TCP) Netzwerkprogrammierung 1
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
E einfaches Problem: Session-Handling bei Servlets Netzwerkprogrammierung 5
G Problem mit einem FileWatcher Netzwerkprogrammierung 7
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
B Client/Server Connection Problem Netzwerkprogrammierung 2
G Problem mit STATIC-Verständnis Netzwerkprogrammierung 8
S Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten Netzwerkprogrammierung 2
J Facelets Include Rendered Problem Netzwerkprogrammierung 2
J Socket Problem mit C++/Java Netzwerkprogrammierung 20
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
G Socket NIO2 Problem mit AsynchronousSocketChannel beim Schließen Netzwerkprogrammierung 3
G Cookie Verwaltungs Problem nach Login auf InetSeite (Wo utma-Cookie?) Netzwerkprogrammierung 18
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 7
B Socket Problem mit Netzwerkchat Netzwerkprogrammierung 21
D RMI Problem beim shutdown von verteilter CORBA-Anwendung Netzwerkprogrammierung 6
Maxim6394 ipv6 Problem Netzwerkprogrammierung 2
Maxim6394 Proxyserver Performance Problem Netzwerkprogrammierung 11
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 5
B RMI und Problem mit rmic-Tool Netzwerkprogrammierung 3
C FTP storeFileStream Problem Netzwerkprogrammierung 3
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
D JavaMail - Mailsabrufen Problem (imap) Netzwerkprogrammierung 12
J HTTP Übersetzung yahoo babelfish - Zeichensatz-Problem Netzwerkprogrammierung 6
D Apache CXF, JAX-WS Problem bei Arrays - einfacher Server Netzwerkprogrammierung 2
M Problem beim Datenempfang Netzwerkprogrammierung 2
X Problem mit Server-Client-Kommunikation Netzwerkprogrammierung 14
M Problem mit Socket-Verbindung Netzwerkprogrammierung 2
N NIO Problem beim speziellen Behandeln von einzelnen Benutzern Netzwerkprogrammierung 13
D Thread problem Netzwerkprogrammierung 3
T Servlets JSP: Tomcat Problem Netzwerkprogrammierung 4
K Client - Server Problem Netzwerkprogrammierung 16
T RMI Problem Client-Server Netzwerkprogrammierung 2
P RMI Stub Problem Netzwerkprogrammierung 3
D Socket UDP Übertragungs Problem Netzwerkprogrammierung 7
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 2
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 6
D Problem mit ObjectInputStreams Netzwerkprogrammierung 10
D Socket Problem mit InputStreamReader Netzwerkprogrammierung 3
N CRC32 CheckSum Problem bei UDP Netzwerkprogrammierung 2
V Java Mail Api - IMAP Problem Netzwerkprogrammierung 6
P RMI Problem Netzwerkprogrammierung 4
I Problem bei Outputstreamerzeugung in anderer Klasse als Socket Netzwerkprogrammierung 5
S Socket Problem mit Objektübertragung Netzwerkprogrammierung 16
Shoox Reader / Writer Problem Netzwerkprogrammierung 2
S Problem mit 2 Serversockets unter Win XP Netzwerkprogrammierung 7
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
M RMI - Connection Problem Netzwerkprogrammierung 7
J Socket Client - Server Problem Netzwerkprogrammierung 4
M Socket Chat-Client-Problem Netzwerkprogrammierung 8
D Client Server Problem, Methode readline() löst SocketException "Connection reset" aus Netzwerkprogrammierung 8
E HTTP Problem beim Auslesen von Websiten Netzwerkprogrammierung 6
T Problem bei Findung der richtigen Architektur Netzwerkprogrammierung 3
AlexSpritze Authentication Problem bei WebServices Netzwerkprogrammierung 4
J Socket Problem -Proxies Netzwerkprogrammierung 2
R HTTP Problem bei Authentifizierung über (Http)UrlConnection Netzwerkprogrammierung 2
F Konzept Problem Netzwerkprogrammierung 12
G NIO Sockets Architektur Problem Netzwerkprogrammierung 2
H Neues NIO problem nachricht an alle clients Netzwerkprogrammierung 3
J Client server problem Netzwerkprogrammierung 3
S Problem bzgl. Sockets / Server-Client-Struktur Netzwerkprogrammierung 3
W RMI Problem Netzwerkprogrammierung 4
M Problem mit Server Netzwerkprogrammierung 5
N Socket Java server c# client problem Netzwerkprogrammierung 7
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
R RMI Hibernate Problem Netzwerkprogrammierung 4
Z RMI Problem Netzwerkprogrammierung 11
F RMI problem mit RMI Netzwerkprogrammierung 3
H Object Cast Problem nach Übertragung mit Log4j Netzwerkprogrammierung 5
H Log4j SocketAppender Problem Netzwerkprogrammierung 2
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
P Problem mit JOscarLib Netzwerkprogrammierung 6
0din SMTP Client - readline problem Netzwerkprogrammierung 4
C komisches Problem / ObjectInputStream erstellt sich nicht Netzwerkprogrammierung 5
W vista / win server 2003 netzlaufwerk problem Netzwerkprogrammierung 4
W Problem mit HTTP-Dateiübertragung Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben