Bizerba Waage ansprechen

Werner_66

Mitglied
Hallo zusammen
Nachdem ich nun seit geraumer Zeit weder bei Google noch anderen Quellen fündig geworden bin und auch Bizerba nicht in der Lage oder besser nicht gewillt ist mit passender Antwort zu helfen, versuche ich es mal hier.

Zum Problem:
Ich habe eine Bizerba CS300 Wägezelle über einen Profilec USB Adapter auf COM 3 und würde diese gerne in Chromis Pos JAVA einbinden.
Ich habe einen passenden und funktionierenen Windows Treiber BDD6.dll über die App dazu kann ich der Waage auch Daten senden und lesen.
Desweiteren habe ich eine Delphi Schnittstelle aber keine Ahnung von Delphi :)

C:
// Hier stehen die Funktionen, die die Dll bereitstellt

/*
*  author        Gerd Alber
*  version        1.0
*  date        01.09.2005
*  bug            -keine-
*  warning        -keine-
*  todo        -keine-
*  
*    Kurzbeschreibung:
*
*    In dieser Header-Datei sind die Funktionen beschrieben, die der Treiber BDD6 zu verfügung stellt.
*                      
*/

#ifndef __bdd6_c__
#define __bdd6_c__

#ifdef __cplusplus
extern "C" {
#endif

#define MYCONST                const

typedef unsigned int        MYUINT;
typedef unsigned long        MYDWORD;
typedef bool                MYBOOL;

#ifdef _UNICODE
    typedef unsigned short            MYTCHAR;
    typedef const unsigned short    *MYLPCTSTR;
#else
    typedef char            MYTCHAR;
    typedef const char        *MYLPCTSTR;
#endif



// Offnet einen ComPort über den der Datenaustausch mit der Waage statt findet
// Sollte als erstes von der Anwendung aufgerfufen werden
// 1. Parameter:    Portnummer
// Return:            Errorcode
#if _USRDLL
MYDWORD __declspec(dllexport)OpenComPort(MYUINT);
#else
MYDWORD __declspec(dllimport)OpenComPort(MYUINT);
#endif

// Schliesst den ComPort
// Sollte bevor sich die Anwendung schliesst, aufgerufen werden
// Return:            Errorcode  
#if _USRDLL
MYDWORD __declspec(dllexport)CloseComPort();
#else
MYDWORD __declspec(dllimport)CloseComPort();
#endif

// Sendet Daten an die Waage (Grundpreis, Tara, Text)
// Ein Grundpreis muss immer angegeben werden. Die anderen Parameter sind optional
// 1. Parameter:    Grundpreis
// 2. Parameter:    Tara-Wert
// 3. Parameter:    Text
// Retrun:            Errorcode
#if _USRDLL
MYDWORD __declspec(dllexport)SendData(MYCONST MYTCHAR*, MYCONST MYTCHAR*, MYCONST MYTCHAR*);
#else
MYDWORD __declspec(dllimport)SendData(MYCONST MYTCHAR*, MYCONST MYTCHAR*, MYCONST MYTCHAR*);
#endif

// Ruft Daten von der Waage ab (Gewichtswert, Grundpreis, Verkaufspreis)
// 1. Parameter:    Grundpreis
// 2. Parameter:    Tara-Wert
// 3. Parameter:    Text
// Retrun:            Errorcode
#if _USRDLL
MYDWORD __declspec(dllexport)ReceiveData(MYTCHAR*, MYTCHAR*, MYTCHAR*);
#else
MYDWORD __declspec(dllimport)ReceiveData(MYTCHAR*, MYTCHAR*, MYTCHAR*);
#endif

// Schaltet die Logische Versionsnummer der Waage an oder aus
// Wenn TRUE als Übergabeparameter wird die Logische Versionsnummer angeschaltet und bleibt solange
// aktiv bis die Funktion mit dem Übergabeparameter FALSE aufgerufen wird
// 1. Parameter:    TRUE = On; FALSE = Off
// Retrun:            Errorcode
#if _USRDLL
MYDWORD __declspec(dllexport)LogicalVersN(MYBOOL);
#else
MYDWORD __declspec(dllimport)LogicalVersN(MYBOOL);
#endif

// Setzt die Checksumme und den Korrekturwert der Anwendung im Treiber
// Diese Funktion sollte zyklisch aufgerufen werden, so dass immer eine sinvolle Checksummenprüfung gewährleistet ist
// 1. Parameter:    Checksumme
// 2. Parameter:    Korrekturwert
// Retrun:            Errorcode
#if _USRDLL
void __declspec(dllexport)SetCSKW(MYDWORD, MYDWORD);
#else
void __declspec(dllimport)SetCSKW(MYDWORD, MYDWORD);
#endif

// Die Funktion kann zur Checksummenbildung über eine Datei benutzt werden.
// 1. Parameter:    Vollständiger Pfad der Datei über die die Checksumme gebildet werden soll
// Return:            Checksumme
#if _USRDLL
MYDWORD __declspec(dllexport)CalcCS(MYTCHAR*);
#else
MYDWORD __declspec(dllimport)CalcCS(MYTCHAR*);
#endif

// Gibt den Korrekturwert zurück
// Der Korrekturwert (Hexwert z.B. F83G) wird in eine mit Zufallszahlen generierte Datei mit einem Byteoffset geschrieben.
// Der KW wird dann mit Hilfe dieser Funktion wieder aus dieser Datei ausgelesen. Wichtig ist hierbei die richtige Angabe
// des ByteOffsets, damit der KW gefunden werden kann
// 1. Parameter        Vollständiger Name der Datei, die den KW beinhaltet
// 2. Parameter        Gibt an nach wievielen Bytes der KW zu lesen ist, gesehen vom Anfang der Datei
// Return:            Gelesener Korrekturwert
#if _USRDLL
MYDWORD __declspec(dllexport)GetKW(MYTCHAR*, MYUINT);
#else
MYDWORD __declspec(dllimport)GetKW(MYTCHAR*, MYUINT);
#endif

// Mit Hilfe dieser Funktion kann ein Fehlercode im Klartext beschrieben werden
// 1. Parameter:    Errorcode
// Return:            Constanter Zeiger auf Fehlernachricht
#if _USRDLL
MYLPCTSTR __declspec(dllexport)GetErrorString(MYDWORD);
#else
MYLPCTSTR __declspec(dllimport)GetErrorString(MYDWORD);
#endif


#ifdef __cplusplus
}
#endif

#endif

Ich würde gerne dazu gerne folgenden Code umarbeiten bzw. ergänzen
Java:
package uk.chromis.pos.scale;

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 ScaleComm implements Scale, SerialPortEventListener {
   
    private String m_sPortScale;
    private CommPortIdentifier m_PortIdPrinter;
    private SerialPort m_CommPortPrinter;    
    private OutputStream m_out;
    private InputStream m_in;

    private static final int SCALE_READY = 0;
    private static final int SCALE_READING = 1;
   
    private double m_dWeightBuffer;
    private int m_iStatusScale;
       
    /** Creates a new instance of ScaleComm
     * @param sPortPrinter */
    public ScaleComm(String sPortPrinter) {
        m_sPortScale = sPortPrinter;
        m_out = null;
        m_in = null;
       
        m_iStatusScale = SCALE_READY;
        m_dWeightBuffer = 0.0;
    }
   
    /**
     *
     * @return
     */
    @Override
    public Double readWeight() {
       
        synchronized(this) {

            if (m_iStatusScale != SCALE_READY) {
                try {
                    wait(1000);
                } catch (InterruptedException e) {
                }
                if (m_iStatusScale != SCALE_READY) {
                    // bascula tonta.
                    m_iStatusScale = SCALE_READY;
                }
            }
           
            // Ya estamos en SCALE_READY
            m_dWeightBuffer = 0.0;
            write(new byte[] {0x05});
            flush();            
           
            // Esperamos un ratito
            try {
                wait(1000);
            } catch (InterruptedException e) {
            }
           
            if (m_iStatusScale == SCALE_READY) {
                // a value as been readed.
                double dWeight = m_dWeightBuffer / 1000.0;
                m_dWeightBuffer = 0.0;
                return new Double(dWeight);
            } else {
                m_iStatusScale = SCALE_READY;
                m_dWeightBuffer = 0.0;
                return new Double(0.0);
            }
        }
    }
   
    private void flush() {
        try {
            m_out.flush();
        } catch (IOException e) {
        }      
    }
   
    private void write(byte[] data) {
        try {
            if (m_out == null) {
                m_PortIdPrinter = CommPortIdentifier.getPortIdentifier(m_sPortScale); // Tomamos el puerto                  
                m_CommPortPrinter = (SerialPort) m_PortIdPrinter.open("PORTID", 2000); // Abrimos el puerto      

                m_out = m_CommPortPrinter.getOutputStream(); // Tomamos el chorro de escritura  
                m_in = m_CommPortPrinter.getInputStream();
               
                m_CommPortPrinter.addEventListener(this);
                m_CommPortPrinter.notifyOnDataAvailable(true);
               
                m_CommPortPrinter.setSerialPortParams(4800, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_ODD); // Configuramos el puerto
            }
            m_out.write(data);
        } catch (NoSuchPortException | PortInUseException | UnsupportedCommOperationException | TooManyListenersException | IOException e) {
        }      
    }
   
    /**
     *
     * @param e
     */
    @Override
    public void serialEvent(SerialPortEvent e) {

    // Determine type of event.
    switch (e.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:
                try {
                    while (m_in.available() > 0) {
                        int b = m_in.read();

                        if (b == 0x001E) { // RS ASCII
                            // Fin de lectura
                            synchronized (this) {
                                m_iStatusScale = SCALE_READY;
                                notifyAll();
                            }
                        } else if (b > 0x002F && b < 0x003A){
                            synchronized(this) {
                                if (m_iStatusScale == SCALE_READY) {
                                    m_dWeightBuffer = 0.0; // se supone que esto debe estar ya garantizado
                                    m_iStatusScale = SCALE_READING;
                                }
                                m_dWeightBuffer = m_dWeightBuffer * 10.0 + b - 0x0030;
                            }
                        } else {
                            // caracteres invalidos, reseteamos.
                            m_dWeightBuffer = 0.0; // se supone que esto debe estar ya garantizado
                            m_iStatusScale = SCALE_READY;
                        }
                    }

                } catch (IOException eIO) {}
                break;
        }

    }      
}

Nur wo fange ich da an bzw. wie kombiniere ich den Treiber mit dem Scriptteil

Danke für alle Hilfestellungen
 

Werner_66

Mitglied
Ich glaube am schnellsten ist es sich die Grundlagen von Delphy anzueigenen und eben winen Wrapper zu schreiben...
Fein und wie bekomme ich dann den Wrapper (keine Ahnung was du damit gerade meinst) in die Java Kasse eingebunden?

fertigen Delphi Quellcode dazu hätte ich sogar schon

Code:
unit unt_scale;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons;

type
  TFrm_Scale = class(TForm)
    Panel1: TPanel;
    Label2: TLabel;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    GroupBox4: TGroupBox;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    SpeedButton1: TSpeedButton;
    Button1: TButton;
    Button2: TButton;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Button3: TButton;
    Button4: TButton;
    Edit5: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure SpeedButton1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

    Comport_Number:integer;
    Artikel_Name:String;
    Tara:String;
    VK_Preis:String;
  end;

var
  Frm_Scale: TFrm_Scale;

implementation

Function OpenComPort(x:integer):integer; cdecl; external 'BDD6.dll'
function CloseComPort:integer;  cdecl; external 'BDD6.dll'
function SendData(Grund_Preis:Pchar; Tara_Wert :Pchar; Artikel_Name:pchar) :     LongInt;   cdecl; external  'BDD6.dll'

function LogicalVersN(x:boolean):cardinal; cdecl; external 'BDD6.dll'

function ReceiveData(xx1:string; xx2:string; xx3:string):LongInt;   external 'BDD6.dll'

function GetErrorString(x:longint):pchar;cdecl; external 'BDD6.dll'

{$R *.dfm}

procedure TFrm_Scale.SpeedButton1Click(Sender: TObject);
begin
  Close;
   CloseComPort;
end;

procedure TFrm_Scale.FormShow(Sender: TObject);
begin
  if Comport_Number > 0 then
  begin
      if OpenComPort(Comport_Number) = 0 then
      begin
        
      end
      else
        Label2.Caption := GetErrorString(OpenComPort(Comport_Number));
  end
  else
    showmessage('Comport nummer ist ungültig...');
end;

procedure TFrm_Scale.FormCreate(Sender: TObject);
begin
  Comport_Number := 1;
end;

procedure TFrm_Scale.Button1Click(Sender: TObject);
begin
{  Artikel_Name := pchar(trim(Edit3.Text));
  Tara:= Pchar(trim(Edit2.Text));
  VK_Preis := pchar(trim(Edit1.Text));

  SendData(    pchar(trim(Edit3.Text)) ,Pchar(trim(Edit2.Text)), pchar(trim(Edit1.Text))   );

  //Label2.Caption := GetErrorString(   SendData(    pchar(trim(Edit3.Text)) ,Pchar(trim(Edit2.Text)), pchar(trim(Edit1.Text))   )    );
}

  SendData(Pchar(trim(Edit3.Text)),'0',Pchar(Trim(Edit5.Text)));

end;

procedure TFrm_Scale.Button3Click(Sender: TObject);
begin
 LogicalVersN(True);

end;

procedure TFrm_Scale.Button4Click(Sender: TObject);
begin
 LogicalVersN(False);

end;

end.

Aber ich denke es ist einfacher einfach den Funktionierenden Windows Treiber zu integrieren, nur die Frage wo anfangen
 

mihe7

Top Contributor
Aber ich denke es ist einfacher einfach den Funktionierenden Windows Treiber zu integrieren, nur die Frage wo anfangen
Das ginge via JNI bzw. einfacher via JNA.

Aber ich glaube, Deine Waage spricht https://www.sbzsystems.com/download/pdf/Check-D-06-eng.pdf - das scheint so das Standardprotokoll zu sein und wird hier https://www.pos-kassensysteme.de/co...ew=download&id=50bb9c1f107659a05b875754f013ad auch im Zusammenhang mit Deiner Waage genannt.
 

Werner_66

Mitglied
Das ginge via JNI bzw. einfacher via JNA.

Aber ich glaube, Deine Waage spricht https://www.sbzsystems.com/download/pdf/Check-D-06-eng.pdf - das scheint so das Standardprotokoll zu sein und wird hier https://www.pos-kassensysteme.de/co...ew=download&id=50bb9c1f107659a05b875754f013ad auch im Zusammenhang mit Deiner Waage genannt.

Ja es ist Dialog 6, daher ja auch der Windowstreiber BDD6 nur jetzt halt meine Frage das ganze einbinden JNA ist glaube ich auch der beste Weg, lese mir das nachher noch in Ruhe durch.

Habe einfach viel zu lange nicht mehr mit Java gearbeitet (so 15 Jahre sind das locker her) und muss mich mühsam wieder da rein denken
 

Werner_66

Mitglied
Ich würde den Spaß (Dialog 6) einfach ohne JNA in den Java-Treiber einbauen.
Wenn du mir einen kleinen Schubs in die richtige Richtung geben könntest wäre das lieb.
Ich habe die ganze Treiber Datei gezippt und in das lib Verzeichnis gestellt und in die Bibliothek eingelesen, mit folgender Strucktur:

BDD6.zip
- <Standartpaket>
-- BDD6.dll
--BDD6.h
--BDD6.lib
--Dialog6App.exe

Hier sollte es wohl reichen die BDD6.dll zu importieren oder nur die Zip Datei?

Code:
import lib.BDD6;

nur was benötige ich alles zum senden und empfangen, die Dokumente dazu sind gut versteckt ich habe zwei Java Bücher hier und habe nichts passendes dazu finden können, eventuell übersehen oder falsch gesucht
 

mihe7

Top Contributor
Wenn du mir einen kleinen Schubs in die richtige Richtung geben könntest wäre das lieb.
Wenn Du die DLL verwenden willst, kannst Du Dir hier anschauen, wie das funktioniert. Ganz am Ende ist ein Link für ein Tool, das Dir das Interface ggf. anhand der Headerdatei generiert.

Ich würde trotzdem einfach das Protokoll implementieren, so wie es auf Page 6 in dem PDF zum Protokoll angegeben ist. Macht mehr Spaß als irgendeine Lib des Herstellers einzubinden :)
 

Werner_66

Mitglied
Wenn Du die DLL verwenden willst, kannst Du Dir hier anschauen, wie das funktioniert. Ganz am Ende ist ein Link für ein Tool, das Dir das Interface ggf. anhand der Headerdatei generiert.

Ich würde trotzdem einfach das Protokoll implementieren, so wie es auf Page 6 in dem PDF zum Protokoll angegeben ist. Macht mehr Spaß als irgendeine Lib des Herstellers einzubinden :)
Das Protokol ist sicher besser, wo bekomme ich aber dazu nähere Informationen eine Übersicht der Steuerzeichen,

oder wie sollte der output stream aussehen
 

Werner_66

Mitglied
Das sind Standardcodes: https://de.wikipedia.org/wiki/Steuerzeichen

Viel interessanter wäre: weißt Du, wie die Prüfsumme berechnet wird? Also, welche Werte Du bei SetCSKW(MYDWORD, MYDWORD); (die Funktion aus der DLL) einsetzen musst?
Sorry Übersicht der Steuerzeichen habe ich sollte es heißen, ist geschluckt worden.

Bei den Prüfsummen hängt es ja hauptsächlich,

der vorhandene Code liest ja nur aus

Code:
           m_dWeightBuffer = 0.0;
            write(new byte[] {0x05});
            flush();             
            
            // Esperamos un ratito
            try {
                wait(1000);
            } catch (InterruptedException e) {
            }
            
            if (m_iStatusScale == SCALE_READY) {
                // a value as been readed.
                double dWeight = m_dWeightBuffer / 1000.0;
                m_dWeightBuffer = 0.0;
                return new Double(dWeight);
            } else {
                m_iStatusScale = SCALE_READY;
                m_dWeightBuffer = 0.0;
                return new Double(0.0);
            }
        }
    }

ich müsste aber erst mal den Wert PriceSell an die Waage übergeben
 

mihe7

Top Contributor
Die Übertragung ist das geringste Problem. Du müsstest erst einmal wissen, wie die Prüfsummen berechnet werden. Ansonsten sieht das schlecht aus - egal, ob mit DLL oder Java.
 

Werner_66

Mitglied
Die Übertragung ist das geringste Problem. Du müsstest erst einmal wissen, wie die Prüfsummen berechnet werden. Ansonsten sieht das schlecht aus - egal, ob mit DLL oder Java.
Wo bekomme ich diese her oder kann ich eigene setzen?

ich habe mal den Serial Port ausgelesen wärend der Nutzung der App für den treiber

Code:
Initialisierung der Waage an COM 3
#######################################################################################################################
[08/08/2019 20:55:39]
1 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_BAUD_RATE - Returns the baud rate that is currently set for a COM port
            BaudRate - 9600
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
3 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_LINE_CONTROL - Request returns information about the line control set for a COM port
            StopBits   - 0 (1 stop bit)
            Parity     - 1 (ODD_PARITY)
            WordLength - 7
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
5 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_CHARS - Request returns the special characters that Serial uses with handshake flow control
            EofChar   - 0
            ErrorChar - 0
            BreakChar - 0
            EventChar - 0
            XonChar   - 17
            XoffChar  - 19
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
7 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_HANDFLOW - Request returns information about the configuration of the handshake flow control set for a COM port
            ControlHandShake - 0x00 
            FlowReplace      - 0x40 (SERIAL_RTS_CONTROL)
            XonLimit         - 2048
            XoffLimit        - 512
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
9 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_BAUD_RATE - Returns the baud rate that is currently set for a COM port
            BaudRate - 9600
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
11 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_LINE_CONTROL - Request returns information about the line control set for a COM port
            StopBits   - 0 (1 stop bit)
            Parity     - 1 (ODD_PARITY)
            WordLength - 7
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
13 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_CHARS - Request returns the special characters that Serial uses with handshake flow control
            EofChar   - 0
            ErrorChar - 0
            BreakChar - 0
            EventChar - 0
            XonChar   - 17
            XoffChar  - 19
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
15 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_HANDFLOW - Request returns information about the configuration of the handshake flow control set for a COM port
            ControlHandShake - 0x00 
            FlowReplace      - 0x40 (SERIAL_RTS_CONTROL)
            XonLimit         - 2048
            XoffLimit        - 512
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
17 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_BAUD_RATE - Request sets the baud rate on a COM port. Serial verifies the specified baud rate
            BaudRate - 9600
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
19 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_CLR_RTS - Request clears the RTS control signal 
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
21 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_CLR_DTR - Request clears the DTR control signal. 
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
23 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_LINE_CONTROL - Request sets the line control register
            StopBits   - 0 (1 stop bit)
            Parity     - 1 (ODD_PARITY)
            WordLength - 7
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
25 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_CHARS - Request sets the special characters that Serial uses for handshake flow control
            EofChar   - 0
            ErrorChar - 0
            BreakChar - 0
            EventChar - 0
            XonChar   - 17
            XoffChar  - 19
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
27 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_HANDFLOW - Request sets the configuration of handshake flow control
            ControlHandShake - 0x00 
            FlowReplace      - 0x00 
            XonLimit         - 2048
            XoffLimit        - 512
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
29 IRP_MJ_CLOSE - Close a COM port (COM3)
    STATUS_SUCCESS
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
31 IRP_MJ_CREATE - Opens a COM port (COM3)
    STATUS_SUCCESS
        Opened by:
            C:\Users\Werner\Desktop\SCALE\Dialog6App.exe
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
33 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_WAIT_MASK - Request configures Serial to notify a client after the occurrence of any one of a specified set of wait events
            Mask - 0x00000000 
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
35 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_QUEUE_SIZE - Request sets the size of the internal receive buffer
            InSize  - 4096
            OutSize - 4096
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
37 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_PURGE - Request cancels the specified requests and deletes data from the specified buffers
            Flags - 0x0000000f
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
39 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_TIMEOUTS - Request sets the timeout value's that the driver uses with read and write requests
            ReadIntervalTimeout         - -1
            ReadTotalTimeoutMultiplier  - 5
            ReadTotalTimeoutConstant    - 10
            WriteTotalTimeoutMultiplier - 5
            WriteTotalTimeoutConstant   - 10
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
41 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_BAUD_RATE - Returns the baud rate that is currently set for a COM port
            BaudRate - 9600
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
43 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_LINE_CONTROL - Request returns information about the line control set for a COM port
            StopBits   - 0 (1 stop bit)
            Parity     - 1 (ODD_PARITY)
            WordLength - 7
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
45 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_CHARS - Request returns the special characters that Serial uses with handshake flow control
            EofChar   - 0
            ErrorChar - 0
            BreakChar - 0
            EventChar - 0
            XonChar   - 17
            XoffChar  - 19
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
47 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_HANDFLOW - Request returns information about the configuration of the handshake flow control set for a COM port
            ControlHandShake - 0x00 
            FlowReplace      - 0x00 
            XonLimit         - 2048
            XoffLimit        - 512
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
49 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_BAUD_RATE - Returns the baud rate that is currently set for a COM port
            BaudRate - 9600
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
51 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_LINE_CONTROL - Request returns information about the line control set for a COM port
            StopBits   - 0 (1 stop bit)
            Parity     - 1 (ODD_PARITY)
            WordLength - 7
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
53 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_CHARS - Request returns the special characters that Serial uses with handshake flow control
            EofChar   - 0
            ErrorChar - 0
            BreakChar - 0
            EventChar - 0
            XonChar   - 17
            XoffChar  - 19
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
55 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_GET_HANDFLOW - Request returns information about the configuration of the handshake flow control set for a COM port
            ControlHandShake - 0x00 
            FlowReplace      - 0x00 
            XonLimit         - 2048
            XoffLimit        - 512
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
57 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_BAUD_RATE - Request sets the baud rate on a COM port. Serial verifies the specified baud rate
            BaudRate - 9600
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
59 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_RTS - Request sets RTS
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
61 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_CLR_DTR - Request clears the DTR control signal. 
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
63 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_LINE_CONTROL - Request sets the line control register
            StopBits   - 0 (1 stop bit)
            Parity     - 1 (ODD_PARITY)
            WordLength - 7
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
65 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_CHARS - Request sets the special characters that Serial uses for handshake flow control
            EofChar   - 0
            ErrorChar - 0
            BreakChar - 0
            EventChar - 0
            XonChar   - 17
            XoffChar  - 19
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
67 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_SET_HANDFLOW - Request sets the configuration of handshake flow control
            ControlHandShake - 0x00 
            FlowReplace      - 0x40 (SERIAL_RTS_CONTROL)
            XonLimit         - 2048
            XoffLimit        - 512
----------------------------------------------------------------------------------
[08/08/2019 20:55:39]
69 IRP_MJ_DEVICE_CONTROL - Request operates a serial port (COM3)
    STATUS_SUCCESS
        IOCTL_SERIAL_PURGE - Request cancels the specified requests and deletes data from the specified buffers
            Flags - 0x0000000c
----------------------------------------------------------------------------------

##########################################################################################
senden von 555 als Preis an Waage
###########################################################################################

----------------------------------------------------------------------------------
[08/08/2019 20:57:56]
71 IRP_MJ_WRITE - Request transfers data from a client to a COM port (COM3) - 26 bytes of 26
    STATUS_SUCCESS
            04 02 30 34 1b 30 35 35 35 30 30 1b 20 20 20 20   ..04.055500.     
            20 20 20 20 20 20 20 20 20 03                              .       
----------------------------------------------------------------------------------
[08/08/2019 20:57:57]
73 IRP_MJ_READ - Transfers data from a COM port to a client (COM3) - 1 bytes of 256
    STATUS_SUCCESS
            06                                                .               
----------------------------------------------------------------------------------

##################################################################
von Waage lesen Ergebnis 0,140kg 555€/kg 77,70€
##################################################################

[08/08/2019 20:59:55]
75 IRP_MJ_WRITE - Request transfers data from a client to a COM port (COM3) - 2 bytes of 2
    STATUS_SUCCESS
            04 05                                             ..               
----------------------------------------------------------------------------------
[08/08/2019 20:59:55]
77 IRP_MJ_READ - Transfers data from a COM port to a client (COM3) - 1 bytes of 256
    STATUS_SUCCESS
            15                                                .               
----------------------------------------------------------------------------------
[08/08/2019 20:59:55]
79 IRP_MJ_WRITE - Request transfers data from a client to a COM port (COM3) - 5 bytes of 5
    STATUS_SUCCESS
            04 02 30 38 03                                    ..08.           
----------------------------------------------------------------------------------
[08/08/2019 20:59:55]
81 IRP_MJ_READ - Transfers data from a COM port to a client (COM3) - 7 bytes of 256
    STATUS_SUCCESS
            02 30 39 1b 33 30 03                              .09.30.         
----------------------------------------------------------------------------------
[08/08/2019 21:00:04]
83 IRP_MJ_WRITE - Request transfers data from a client to a COM port (COM3) - 2 bytes of 2
    STATUS_SUCCESS
            04 05                                             ..               
----------------------------------------------------------------------------------
[08/08/2019 21:00:04]
85 IRP_MJ_READ - Transfers data from a COM port to a client (COM3) - 26 bytes of 256
    STATUS_SUCCESS
            02 30 32 1b 33 1b 30 30 31 34 30 1b 30 35 35 35   .02.3.00140.0555
            30 30 1b 30 30 37 37 37 30 03                     00.007770.       
----------------------------------------------------------------------------------

habe die Schritte meiner Handlung immer über die einzelnen Punkte gesetzt, vieleicht hilft das ja
 

mihe7

Top Contributor
habe die Schritte meiner Handlung immer über die einzelnen Punkte gesetzt, vieleicht hilft das ja
Ja, anscheinend verlangt Deine Waage den Spaß gar nicht. Dann ist das Protokoll doch noch viel einfacher umzusetzen.

Du fängst einfach damit an, den Preis rauszuschreiben, also oben:

write(new byte[] {0x04,0x02,0x30,0x34,0x1b,0x30,0x35,0x35,0x35,0x30,0x30,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,,0x03});

Unten im switch reagierst Du einfach auf die empfangenen Bytes: wenn das erste Byte ein 0x0f ist, schickst Du 0x04, 0x02, 0x30, 0x38, 0x03 raus. In allen anderen Fällen schickst Du 0x04, 0x05 zurück, ggf. erst, nachdem Du einen Frame gelesen hast. Ein Frame beginnt mit 0x02 und endet mit 0x03. Wenn Du einen Frame erhalten hast, der mit 0x02, 0x30, 0x32, 0x1b beginnt, hast Du das Ergebnis der Waage erhalten und bist fertig.
 

Werner_66

Mitglied
Ja, anscheinend verlangt Deine Waage den Spaß gar nicht. Dann ist das Protokoll doch noch viel einfacher umzusetzen.

Das Protokol wurde von dem Windows Treiber BDD6 abgegriffen kann sein das die Daten intern verarbeitet und nicht gesendet wurden aber probieren schadet nichts.

Du fängst einfach damit an, den Preis rauszuschreiben, also oben:

write(new byte[] {0x04,0x02,0x30,0x34,0x1b,0x30,0x35,0x35,0x35,0x30,0x30,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,,0x03});

kannst Du mir den Byte Aufbau genauer erklären?

0x04 = EOT, 0x02 = Frame Start und 0x03 = Frame Ende, dazwischen blicke ich kaum durch nehme aber an das die dazwischen stehenden HEX Daten für Preis und Tara Werte stehen nur wie teilt sich das auf

Unten im switch reagierst Du einfach auf die empfangenen Bytes: wenn das erste Byte ein 0x0f ist, schickst Du 0x04, 0x02, 0x30, 0x38, 0x03 raus. In allen anderen Fällen schickst Du 0x04, 0x05 zurück, ggf. erst, nachdem Du einen Frame gelesen hast. Ein Frame beginnt mit 0x02 und endet mit 0x03. Wenn Du einen Frame erhalten hast, der mit 0x02, 0x30, 0x32, 0x1b beginnt, hast Du das Ergebnis der Waage erhalten und bist fertig.

Das ist schon genauer etwas detailierter würde mir das verstehen einfacher machen

Danke
 

mrBrown

Super-Moderator
Mitarbeiter
Geht aus dem obige Dokument hervor, direkt auf der ersten Seite: https://www.sbzsystems.com/download/pdf/Check-D-06-eng.pdf :)

Die Werte sind aus deinem Beispiel, dies hier ist das Senden von Preis und Text (Record No. 4):
0x04,0x02,0x30,0x34,0x1b,0x30,0x35,0x35,0x35,0x30,0x30,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x03

Der Preis ist dies: 0x30,0x35,0x35,0x35,0x30,0x30, was 055500 entspricht.
Der Text sind die ganzen 0x20, was Leerzeichen sind.
 

Werner_66

Mitglied
Geht aus dem obige Dokument hervor, direkt auf der ersten Seite: https://www.sbzsystems.com/download/pdf/Check-D-06-eng.pdf:)

Die Werte sind aus deinem Beispiel, dies hier ist das Senden von Preis und Text (Record No. 4):
0x04,0x02,0x30,0x34,0x1b,0x30,0x35,0x35,0x35,0x30,0x30,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x03

Der Preis ist dies: 0x30,0x35,0x35,0x35,0x30,0x30, was 055500 entspricht.
Der Text sind die ganzen 0x20, was Leerzeichen sind.

und 0x1b Escape trennt die Blöcke jetzt habe ich es auch Verstanden und werde mich mal ans umsetzen machen.

Habt erstmal herzlichen Dank

wenns klappt werde ich den fertigen Code hier noch einsetzen gibt sicher einige die Ihn auch brauchen können
Und sollte noch was hängen wende ich mich auch noch mal hoffnungsvoll an euch ;-)
 

mihe7

Top Contributor
Ich dachte an etwas wie (Achtung: keine Ahnung, ob das auch nur ansatzweise funktioniert)
Java:
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 BizerbaScale implements Scale, SerialPortEventListener {
    private static final byte STX = 0x02;
    private static final byte ETX = 0x03;
    private static final byte EOT = 0x04;
    private static final byte ENQ = 0x05;
    private static final byte ACK = 0x06;
    private static final byte NAK = 0x15;
    private static final byte ESC = 0x1b;

    private static final byte[] REQ_NAK_REASON = {EOT, STX, 0x30, 0x38, ETX};
    private static final byte[] REQ_RESULT = {EOT, ENQ};
    private static final byte[] SET_PRICE = {
       EOT, STX, 0x30, 0x34, ESC, 0x30, 0x35, 0x35, 0x30, 0x35, 0x35, 0x35, 0x30, 0x30,
       ESC, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ETX
    };

    private static final int SCALE_READY = 0;
    private static final int SCALE_READING = 1;
 
    private String m_sPortScale;
    private CommPortIdentifier m_PortIdPrinter;
    private SerialPort m_CommPortPrinter;  
    private OutputStream m_out;
    private InputStream m_in;

    private double m_dWeightBuffer;
    private int m_iStatusScale;

    private byte[] frame = new byte[256];
    private int frameLen = 0;

     
    /** Creates a new instance of ScaleComm
     * @param sPortPrinter */
    public BizerbaScale(String sPortPrinter) {
        m_sPortScale = sPortPrinter;
        m_out = null;
        m_in = null;
     
        m_iStatusScale = SCALE_READY;
        m_dWeightBuffer = 0.0;
    }
 
    /**
     *
     * @return
     */
    @Override
    public Double readWeight() {
     
        synchronized(this) {

            if (m_iStatusScale != SCALE_READY) {
                try {
                    wait(1000);
                } catch (InterruptedException e) {
                }
                if (m_iStatusScale != SCALE_READY) {
                    // bascula tonta.
                    m_iStatusScale = SCALE_READY;
                }
            }
         
            // Ya estamos en SCALE_READY
            m_dWeightBuffer = 0.0;
            send(SET_PRICE);
         
            // Esperamos un ratito
            try {
                wait(1000);
            } catch (InterruptedException e) {
            }
         
            if (m_iStatusScale == SCALE_READY) {
                // a value as been readed.
                double dWeight = m_dWeightBuffer / 1000.0;
                m_dWeightBuffer = 0.0;
                return new Double(dWeight);
            } else {
                m_iStatusScale = SCALE_READY;
                m_dWeightBuffer = 0.0;
                return new Double(0.0);
            }
        }
    }
 
    private void flush() {
        try {
            m_out.flush();
        } catch (IOException e) {
        }    
    }
 
    private void write(byte[] data) {
        try {
            if (m_out == null) {
                m_PortIdPrinter = CommPortIdentifier.getPortIdentifier(m_sPortScale); // Tomamos el puerto                
                m_CommPortPrinter = (SerialPort) m_PortIdPrinter.open("PORTID", 2000); // Abrimos el puerto    

                m_out = m_CommPortPrinter.getOutputStream(); // Tomamos el chorro de escritura
                m_in = m_CommPortPrinter.getInputStream();
             
                m_CommPortPrinter.addEventListener(this);
                m_CommPortPrinter.notifyOnDataAvailable(true);
             
                m_CommPortPrinter.setSerialPortParams(4800, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_ODD); // Configuramos el puerto
            }
            m_out.write(data);
        } catch (NoSuchPortException | PortInUseException | UnsupportedCommOperationException | TooManyListenersException | IOException e) {
        }    
    }
 
    /**
     *
     * @param e
     */
    @Override
    public void serialEvent(SerialPortEvent e) {
        switch (e.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:
                try {
                    while (m_in.available() > 0) {
                        int b = m_in.read();

                        if (frameLen == 0) {
                            if (b == 0x15) {
                                send(REQ_NAK_REASON);
                            } else if (b == 0x06) {
                                send(REQ_RESULT);
                            } else if (b == 0x02) {
                                push((byte) b);
                                synchronized(this) {
                                    m_iStatusScale = SCALE_READING;
                                }
                            }
                        } else {
                            push((byte) b);
                            if (b == 0x03) {
                                processFrame();
                            }
                        }
                    }
                } catch (IOException eIO) {}
                break;
        }
    }

    private void send(byte[] buf) {
        write(buf);
        flush();
    }

    private void push(byte b) {
        frame[frameLen] = b;
        frameLen = (frameLen + 1) % frame.length;
    }


    private void processFrame() {
        if (frame[1] == 0x30 && frame[2] == 0x32) {
            int units = 0;
            for (int i = 0; i < 5; i++) {
                units = units*10 + (frame[i+6] - 0x30);
            }
            frameLen = 0;
            synchronized(this) {
                m_dWeightBuffer = units / 1000.0;
                m_iStatusScale = SCALE_READY;
                notifyAll();
            }
        } else {
            frameLen = 0;
            send(REQ_RESULT);
        }
    }
}
 

mihe7

Top Contributor
Ja, das ist ein Fehler. Korrektur:
Java:
    private static final byte[] SET_PRICE = {
       EOT, STX, 0x30, 0x34, ESC, 0x30, 0x35, 0x35, 0x35, 0x30, 0x30, ESC,
       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, ETX
    };
 

Werner_66

Mitglied
@Werner_66 und, schon ans Laufen gebracht? :)
Nein will noch nicht so recht:oops:
warte jetzt aber bis Montag-Dienstag bekomme dann sehr wahrscheinlich das Polynom für die Waage und einen OPOS Waagentreiber von Bizerba.
Dann schaue ich mal weiter derzeit sendet er gar nichts an den COMPORT der Monitor bleibt leer nur über die externe Datei funktioniert es im Notfall muss ich halt mit JNA arbeiten.
Habe da gestern mal reingesehen so einfach wie das beschrieben ist
Code:
import com.sun.jna.*;
und JNA von Github holen ist es bei weitem nicht

hab das runtergeladenen Verzeichnis in die Bibliothek bei Netbeans geladen aber angeblich gibts keine JNA komponeneten, war aber nur mal ein kurzes reinschnuppern.
 

mihe7

Top Contributor
Dann schaue ich mal weiter derzeit sendet er gar nichts an den COMPORT der Monitor bleibt leer nur über die externe Datei
Vermutlich musst Du die Parameter in der Zeile
Java:
m_CommPortPrinter.setSerialPortParams(4800, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_ODD); // Configuramos el puerto
anpassen.
 

Werner_66

Mitglied
Vermutlich musst Du die Parameter in der Zeile
Java:
m_CommPortPrinter.setSerialPortParams(4800, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_ODD); // Configuramos el puerto
anpassen.

Selbstverständlich ebenso habe ich public class BizerbaScale und public BizerbaClass in public class ScaleDialog6 und public ScaleDialog6 geändert
 

mihe7

Top Contributor
Selbstverständlich ebenso habe ich public class BizerbaScale und public BizerbaClass in public class ScaleDialog6 und public ScaleDialog6 geändert
Die Klassennamen sind aber uninteressant :) Wichtig ist, dass die Parameter (und natürlich der COM-Port) stimmen. Dein Monitor sollte dann in jedem Fall wenigstens ausgeben, was Du an die Waage schickst.
 

Werner_66

Mitglied
Die Klassennamen sind aber uninteressant :) Wichtig ist, dass die Parameter (und natürlich der COM-Port) stimmen. Dein Monitor sollte dann in jedem Fall wenigstens ausgeben, was Du an die Waage schickst.

Die Klassennamen waren insoweit wichtig da ich es ja schon vorbereitet hatte und keine neue Datei dafür erstellen wollte.

Code:
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at gnu.io.CommPortIdentifier.<clinit>(CommPortIdentifier.java:123)
    at uk.chromis.pos.scale.ScaleDialog6.write(ScaleDialog6.java:115)
    at uk.chromis.pos.scale.ScaleDialog6.send(ScaleDialog6.java:177)
    at uk.chromis.pos.scale.ScaleDialog6.readWeight(ScaleDialog6.java:84)
    at uk.chromis.pos.scale.DeviceScale.readWeight(DeviceScale.java:92)
    at uk.chromis.pos.sales.JPanelTicket.incProduct(JPanelTicket.java:1064)
    at uk.chromis.pos.sales.JPanelTicket.buttonTransition(JPanelTicket.java:1101)
    at uk.chromis.pos.sales.JPanelTicketSales$CatalogListener.actionPerformed(JPanelTicketSales.java:108)
    at uk.chromis.pos.catalog.JCatalog.fireSelectedProduct(JCatalog.java:243)
    at uk.chromis.pos.catalog.JCatalog$SelectedAction.actionPerformed(JCatalog.java:407)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at org.pushingpixels.substance.internal.utils.RolloverButtonListener.mouseReleased(RolloverButtonListener.java:124)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
    at java.awt.Component.processMouseEvent(Component.java:6539)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6304)
    at java.awt.Container.processEvent(Container.java:2239)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2297)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
    at java.awt.Container.dispatchEventImpl(Container.java:2283)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
    at java.awt.EventQueue$4.run(EventQueue.java:733)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

vieleicht hilft das sobald ich die Waage auslöse
 

Werner_66

Mitglied
Du hast vermutlich RXTX noch nicht eingebunden?

habs gerade nochmal kontroliert die RXTXcomm ist in der Bibliothek
vorhanden und habe sie auch noch mal wie in der Readme steht in die entsprechenden Verzeichnisse der JRE kopiert

Manifest
Code:
Export-Package: gnu.io;version="3.11.0",gnu.io.rfc2217;version="3.11.0
 ";uses:="gnu.io"

gnu.io.rxtx.properties
Code:
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang2057{\fonttbl{\f0\fnil\fcharset0 Courier New;}{\f1\fnil\fcharset0 Calibri;}}
{\*\generator Riched20 10.0.10240}\viewkind4\uc1
\pard\f0\fs22 gnu.io.rxtx.SerialPorts=//./COM1://./COM2://./COM3://./COM4://./COM5://./COM6://./COM7://./COM8://./COM9://./COM10://./COM11://./COM12:\par

\pard\sa200\sl276\slmult1\f1\lang9\par
}

Readme zu dieser Version ich arbeite aber auf COM3:
To support virtual serial ports COM9-12 on Windows, the file gnu.io.rxtx.properties needs to be copied into your Java Runtime Environment:
{JRE-PATH}/lib/ext/gnu.io.rxtx.properties
 

Werner_66

Mitglied
Code:
java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path

Der hat doch einen an der Waffel der Treiber :cool:

Windows 10/64bit und Netbeans, habe jetzt den Treiber und die Jar so fleißig verteilt wie kein anderer.

die 32 und 64 bit Version jeweils in die Java Versionen in die "lib" und in die "bin" Ordner, im Projektordner auch in die "Lib" die Quellordner von wo ich Sie verteilt habe habe ich auch noch mal extra in die Bibliothek eingebunden: Ich habe mir später einfach gesagt besser einmal zu viel als das es immer noch fehlt.

Und was ist? Er mault immer noch! Der hat doch ne Schraube locker soll mal die Augen aufmachen und seine bits polieren.

Spass beiseite woran kanns liegen?
 

mihe7

Top Contributor
Gib mal bei der Ausführung explizit -Djava.library.path=/pfad/zum/ordner/der/die/dll/enthält an. Wenn Du 64-Bit-Java verwendest, musst Du die 64-Bit-Version des Treibers nehmen.
 

Werner_66

Mitglied
Rechtsklick auf das Projekt -> Properties -> Run -> VM Options (Bild s. https://www.greenfoot.org/files/netbeans/project_Properties-Run.png)

Dort trägst Du -Djava.library.path= gefolgt von dem Pfad zum Verzeichnis, in dem Deine DLL liegt, ein.
das Ergebnis
Code:
ant -f C:\\Users\\Werner\\Desktop\\LeoPOSv1 -Dnb.internal.action.name=run run
init:
Deleting: C:\Users\Werner\Desktop\LeoPOSv1\build\built-jar.properties
deps-jar:
Updating property file: C:\Users\Werner\Desktop\LeoPOSv1\build\built-jar.properties
compile:
run:
Fehler: Hauptklasse Djava.library.path=C:\Users\Werner\Desktop\LeoPOSv1\lib\Windows\i368-mingw64 konnte nicht gefunden oder geladen werden
Java Result: 1
BUILD SUCCESSFUL (total time: 24 seconds)

und es tut sich gar nichts mehr
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Waage mit RS232 auslesen Allgemeine Java-Themen 12
C Nested JSON in Java ansprechen [Wordpress Rest Api] Allgemeine Java-Themen 26
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
K Labels mit Namen ansprechen Allgemeine Java-Themen 3
I USB ansprechen Allgemeine Java-Themen 2
K Xattr Mac unter Java ansprechen Allgemeine Java-Themen 17
S GPS-Maus über USB ansprechen Allgemeine Java-Themen 8
buk USB Geräte ansprechen Allgemeine Java-Themen 14
redJava99 Speicherchipkarte ansprechen / I2C Allgemeine Java-Themen 2
G Excel Menüsteuerung ansprechen Allgemeine Java-Themen 3
Sonecc Ansprechen von Schnittstellen des PCs Allgemeine Java-Themen 4
Z Elemente einer HashTabelle gezielt ansprechen Allgemeine Java-Themen 10
R Barcode Scanner mit JavaPos ansprechen Allgemeine Java-Themen 1
G Druckenport eines USB -> Druckerport Adapters ansprechen Allgemeine Java-Themen 4
ARadauer mit java photoshop ansprechen Allgemeine Java-Themen 8
M Daten aus einem ZIP wie die im JAR ansprechen Allgemeine Java-Themen 4
K exe Programm einbinden/ansprechen Allgemeine Java-Themen 5
G Servlet über apache Tomcat ansprechen Allgemeine Java-Themen 6
F Ansprechen eines Array in der JSP Allgemeine Java-Themen 4
Y Javadoc - Wie Parameter ansprechen bei Methodenkommentar Allgemeine Java-Themen 2
G Mikrocontroller mit Java ansprechen Allgemeine Java-Themen 2
S Usb Port ansprechen Allgemeine Java-Themen 7
M Paralle Schnittstelle ansprechen Allgemeine Java-Themen 2
J Mehrere CPUs gleichzeitig ansprechen Allgemeine Java-Themen 4
MQue Button ansprechen Allgemeine Java-Themen 5
I Mehrere Soundkarten mit JavaSoundAPI ansprechen Allgemeine Java-Themen 2
N Serielle Schnittstelle ansprechen Allgemeine Java-Themen 9
M pdf maker via java code ansprechen Allgemeine Java-Themen 2
N USB Device ansprechen Linux Allgemeine Java-Themen 9
J MS Access mit Java ansprechen Allgemeine Java-Themen 3
M Ansprechen der Windows API Allgemeine Java-Themen 5
J PS/2-Schnittstelle ansprechen Allgemeine Java-Themen 7
R ISDN-Modem ansprechen Allgemeine Java-Themen 2
E Seriellen Port unter Windows ansprechen Allgemeine Java-Themen 16
S Datei in .jar über url ansprechen Allgemeine Java-Themen 3
N hardware ansprechen ? Allgemeine Java-Themen 21
K Ansprechen und Verwalten der Parallelport Schnittsstelle Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben