Bytearray senden via SerialPort

Chefselber

Mitglied
Hallo,

ich habe folgenden Code mit welchem ich 13 Byte über die serielle Schnittstelle schicken möchte.

Java:
           byte []tx_buffer = new byte[13];
            String temp = "" ;
            byte checksum = 0;
          
            // Buffer vorbelegen
             tx_buffer[0] = (byte) 165;  // Fest lt. Protokoll
            tx_buffer[1] = 64;  // 40=GPRS 80=übergeordnet - anscheinend egal
            tx_buffer[2] = (byte)144;  // 90 = Spannung, Strom und SOC
            tx_buffer[3] = 8;  // 8 = Länge fix, nicht ändern
            tx_buffer[4] = 0;  // Rest auf 0 setzen
            tx_buffer[5] = 0;
            tx_buffer[6] = 0;
            tx_buffer[7] = 0;
            tx_buffer[8] = 0;
            tx_buffer[9] = 0;
            tx_buffer[10] =0;
            tx_buffer[11] =0;

            code = tx_buffer[2];


            // Checksumme berechnen und an Byte 13 eintragen
            for (int i=0;i<=11;i++)
            {
                checksum += tx_buffer[i];
                temp += tx_buffer[i];
              
            }
            tx_buffer[12] = checksum;
             temp += String.valueOf(tx_buffer[12]);

             jTextField1.setText(String.valueOf(temp));
          //  jTextField1.setText(tx_buffer.toString());

            // für Anzeige "-" entfernen und Leerzeichen raus nehmen
        //   temp =  BitConverter.ToString(tx_buffer);
        //    temp = temp.Replace('-', ' ');
        //    temp = Regex.Replace(temp, @"\s", "");
        //    textBoxDATASTRING.Text = temp;
        //    textBoxSend.Text += "\r\n" + temp;
      
            // An Serialport übergeben
               serialPort.writeBytes(tx_buffer,13);




Es wird diese Bytefolge an die serielle Schnittstelle übergeben:
-9164-112800000000125

Es kommt als Antwort nur 1 Byte -91 zurück.
Normalerweise sollten es 13 sein.

Ich vermute, dass die Gegenstelle ein Problem mit signed (unsigned) im 1. und 3. Byte hat. tx_buffer[0] und tx_buffer[2].
Diese muss ich ja casten, da sonst Java meckert.

Wenn ja, wie kann ich das bewerkstelligen?

Wenn ich denselben Code mit C#
verwende, funktioniert es.

MfG
 
Der cast des ints 165 nach byte ist hier kein Problem. 165 ist erstmal ein int-Literal und das Bit-Pattern davon ist 00000000000000000000000010100111. Der Cast nach byte macht daraus dann einfach das byte mit Bit-Pattern 10100111 per "Truncation" (also Abschneiden der 24 höherwertigen Bits).
Da ist es irrelevant, ob z.B. arithmetische Operationen oder toString das als "signed" interpretieren.
Das Problem wird ein anderes sein.
 
Ich kann keine Methode mit der Signatur "writeBytes(byte[] data, int count)" finden. Von welcher Klasse ist "serialPort" ein Objekt?
 
@httpdigest für die schnelle, gute Erklärung.


Hier der C# Code.

Ich kann keine Unterschiede finden.



Code:
   // Port öffnen wenn geschlossen
            if (!serialPort1.IsOpen)
               btn_OPEN_Click(sender, e);

            byte[] tx_buffer = new byte[13];
            string temp = "" ;
            byte checksum = 0;
          
            // Buffer vorbelegen
            tx_buffer[0] = 165;  // Fest lt. Protokoll
            tx_buffer[1] = 64;  // 40=GPRS 80=übergeordnet - anscheinend egal
            tx_buffer[2] = 144;  // 90 = Spannung, Strom und SOC
            tx_buffer[3] = 8;  // 8 = Länge fix, nicht ändern
            tx_buffer[4] = 0;  // Rest auf 0 setzen
            tx_buffer[5] = 0;
            tx_buffer[6] = 0;
            tx_buffer[7] = 0;
            tx_buffer[8] = 0;
            tx_buffer[9] = 0;
            tx_buffer[10] = 0;
            tx_buffer[11] = 0;

            code = tx_buffer[2];

            // Checksumme berechnen und an Byte 13 eintragen
            for (int i=0;i<=11;i++)
            {
                checksum += tx_buffer[i];
            }
            tx_buffer[12] = checksum;
        
            // für Anzeige "-" entfernen und Leerzeichen raus nehmen
            temp =  BitConverter.ToString(tx_buffer);
            temp = temp.Replace('-', ' ');
            temp = Regex.Replace(temp, @"\s", "");
            textBoxDATASTRING.Text = temp;
            textBoxSend.Text += "\r\n" + temp;
      
            // An Serialport übergeben
            serialPort1.Write(tx_buffer, 0, 13);
 
Habe hier die Schleife entfernt und es kommen nun Daten an.
Aber Bitweise.

Java:
  public void SerialPortLesen(SerialPort port)
{
  
   port.addDataListener(new SerialPortDataListener(){
    @Override
    public int getListeningEvents() {return SerialPort.LISTENING_EVENT_DATA_RECEIVED;}
    @Override
    public void serialEvent(SerialPortEvent event){
    byte[] newdata = event.getReceivedData();
    System.out.println("UART Länge bytes" + newdata.length);   
    
 //for(int i=0; i<=newdata.length; i++)
 //    {
    
  //       databuffer += (byte)newdata[i];
        
   //   }
    System.out.println("neue Werte gelesen von UART" + newdata);     

}


Sieht jetzt so aus:

UART Länge bytes1
neue Werte gelesen von UART[B@1c1df491
UART Länge bytes1
neue Werte gelesen von UART[B@6f192a39
UART Länge bytes1
neue Werte gelesen von UART[B@797a659e
UART Länge bytes1
neue Werte gelesen von UART[B@23190489
UART Länge bytes1
neue Werte gelesen von UART[B@50d3c507
UART Länge bytes1
neue Werte gelesen von UART[B@763d65c6
UART Länge bytes1
neue Werte gelesen von UART[B@5c41b80a
UART Länge bytes1
neue Werte gelesen von UART[B@3797d247
UART Länge bytes1
neue Werte gelesen von UART[B@79a2d24f
UART Länge bytes1
neue Werte gelesen von UART[B@64ac8be8
UART Länge bytes1
neue Werte gelesen von UART[B@35fcfe9f
UART Länge bytes1
neue Werte gelesen von UART[B@3c70178d
UART Länge bytes1
neue Werte gelesen von UART[B@53af9ae6




Noch etwas kryptisch aber das muss ich anscheinend noch in irgendein Format wandeln.
 

Neue Themen


Zurück
Oben