Hallo,
ich habe ein fieses kleines Problem.
Ich sende Daten über die serielle Schnittstelle unter Verwendung des Printwriter des Paketes javax.comm.
Das Datenpaket setzt sich wie folgt zusammen: Startflag, Länge, Command, CRC, Endflag (Alles vom Typ short)
Der CRC bildet sich aus dem Command.
Das Problem ist, dass manche Commands funktionieren und bei anderen liefert der u-Controller einen Checksum-Error zurück.
Ich glaube, sobald die Checksumme über 127 (der Byte-Grenze in Java) liegt wird falsch gesendet, weil der PrintWriter intern nur Bytes senden kann.
Auf C++-Seite habe ich keine Probleme damit, nur bei Java weil hier BYTE nur von -127 bis 127 oder so geht und nicht von 0 bis 255. Deshalb bin ich in Java überall auf short gegangen.
Wie kann ich den PrintWriter dazu zwingen in short zu senden oder das Problem irgendwie anders lösen.
Beispiel:
short tabelle = 0x04; ergibt eine Checksumme von 97 und der Befehl wird fehlerfrei von Controller ausgeführt.
short R_start = 0x22; ergibt eine Checksumme von 159 und ich bekomme ein CRC-Fehler-Frame vom Controller, vermutlich weil nicht 159 sondern irgendetwas anderes gesendet wird.
Ich poste hier mal die wichtigsten Ausschnitte aus dem Quellcode.
Sagt bitte bescheid, wenn ihr mehr braucht dann post ich das noch.
Das Senden mit dem PrintWriter steht ganz unten.
ich habe ein fieses kleines Problem.
Ich sende Daten über die serielle Schnittstelle unter Verwendung des Printwriter des Paketes javax.comm.
Das Datenpaket setzt sich wie folgt zusammen: Startflag, Länge, Command, CRC, Endflag (Alles vom Typ short)
Der CRC bildet sich aus dem Command.
Das Problem ist, dass manche Commands funktionieren und bei anderen liefert der u-Controller einen Checksum-Error zurück.
Ich glaube, sobald die Checksumme über 127 (der Byte-Grenze in Java) liegt wird falsch gesendet, weil der PrintWriter intern nur Bytes senden kann.
Auf C++-Seite habe ich keine Probleme damit, nur bei Java weil hier BYTE nur von -127 bis 127 oder so geht und nicht von 0 bis 255. Deshalb bin ich in Java überall auf short gegangen.
Wie kann ich den PrintWriter dazu zwingen in short zu senden oder das Problem irgendwie anders lösen.
Beispiel:
short tabelle = 0x04; ergibt eine Checksumme von 97 und der Befehl wird fehlerfrei von Controller ausgeführt.
short R_start = 0x22; ergibt eine Checksumme von 159 und ich bekomme ein CRC-Fehler-Frame vom Controller, vermutlich weil nicht 159 sondern irgendetwas anderes gesendet wird.
Ich poste hier mal die wichtigsten Ausschnitte aus dem Quellcode.
Sagt bitte bescheid, wenn ihr mehr braucht dann post ich das noch.
Das Senden mit dem PrintWriter steht ganz unten.
Code:
//das Paket für den Aufbau serieller Verbindungen
import javax.comm.*;
...
short STX = 0x02; //StartFlag
short length = 0x01; //Länge
short ETX = 0x03; //EndFlag
//Auszug aus den Kommandos
short R_start = 0x22;
short tabelle = 0x04;
...
//Parameter für den Verbindungsaufbau
static CommPortIdentifier portID;
InputStream in;
OutputStream out;
static SerialPort SP;
...
//CRC Methoden
public short CRC_update(short crc,short data) {
crc = (short) (crc ^ data);
for (int i = 0; i < 8; i++) {
if ((crc&0x01)==0x01) crc = (short) ((crc >> 1) ^ 0x8C);
else crc >>= 1;
}
return crc;
}
public short CRC_calculate(short p_Buffer[],short length) {
short checksum = 0x00;
for (int i=0; i<length; i++) {
checksum=CRC_update(checksum,p_Buffer[i]);
}
System.out.println("Checksumme = "+checksum);
return checksum;
}
...
//Auszug aus dem ActionListener für den Aufbau der seriellen Verbindung
if(command.equals("Verbindung aufbauen")){
String PortNr = Gruppe.getSelection().getActionCommand();
try{portID = CommPortIdentifier.getPortIdentifier(PortNr);
SP = (SerialPort) portID.open("Framesend",2000);
ausgabe.append("\nPort "+PortNr+" geöffnet");
}
catch(Exception exc){
System.out.println("Fehler :"+exc);
ausgabe.append("\nFehler: ungültige Portauswahl!");
}
try {in = SP.getInputStream();
out = SP.getOutputStream();
SP.addEventListener(new commListener());
}
catch (Exception e1) { System.out.println("Fehler: "+e1);}
SP.notifyOnDataAvailable(true);
int Baud = Integer.valueOf(Baudrate.getSelectedItem()).intValue();
try {SP.setSerialPortParams(Baud,//57600 oder 19200
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1 ,
SerialPort.PARITY_NONE);}
catch (UnsupportedCommOperationException e1) {}
}
...
//Auszug aus dem ActionListener für das Senden eines Pakets
if(command.equals("Router Start")){
short p_Buffer[] = new short[] {R_start};
short check = CRC_calculate(p_Buffer, length);
short senden[] = new short[] {STX,length,R_start,check,ETX};
PrintWriter Sendepuffer = new PrintWriter(out);
for (int i=0;i<senden.length;i++) Sendepuffer.write(senden[i]);
Sendepuffer.flush();
Sendepuffer.close();
}