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
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
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;
}
}
}