Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    18

    [Java] Convertire byte di risposta della eeprom in int

    Ciao a tutti, ho un piccolo problemino che nn riesco a risolvere.
    Ho creato un programmino per la programmazione di un microcontrollore, ho la possibilita di inviare e ricevere dati da quest'ultimo, ed il problema sta proprio in quest'ultima operazione.
    Quando mando un comando di richiesta alla eeprom essa mi risponde con 3 blocchi di byte ( 6 Byte, 8 Byte, 1 byte ) questi, se non erro dovrebbero rappresentare dei valori esadecimali, la mia domanda è:
    Siccome la risposta dovra essere visualizzata su una JtextField di una gui come faccio a convertire la risposta della eeprom in caratteri o interi visualizzabili correttamente?? Perche se glie li faccio stampare direttamente adesso visualizzo avviamente solo simboli strani come faccine e quadratini. Avevo trovato una guida che diceva di dividere i blocchi di byte e fare una doppia divisione per 16 e prendere solo il resto ma nn sono stato in grado di risolvere, potete darmi una mano ???
    Grazie mille in anticipo ciao ciao

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Convertire byte di risposta della eeprom in int

    Originariamente inviato da Sampy84
    Quando mando un comando di richiesta alla eeprom essa mi risponde con 3 blocchi di byte ( 6 Byte, 8 Byte, 1 byte ) questi, se non erro dovrebbero rappresentare dei valori esadecimali
    Dire che "rappresentano valori esadecimali" di per sé vuol dire poco ... nel senso che un byte sono 8 bit e basta. Cosa rappresentano per te quei byte ... dipende .... devi saperlo (un valore con segno? un valore senza segno? Un carattere ASCII? ecc..). E se facessi un esempio, sarebbe ovviamente meglio.

    Originariamente inviato da Sampy84
    Siccome la risposta dovra essere visualizzata su una JtextField di una gui come faccio a convertire la risposta della eeprom in caratteri o interi visualizzabili correttamente?? Perche se glie li faccio stampare direttamente adesso visualizzo avviamente solo simboli strani come faccine e quadratini.
    Ovviamente non puoi "buttare" i byte direttamente su un JTextField ... nemmeno supponendo 1 byte -> 1 char (se il byte valesse 9 sarebbe uno spazio di "tabulazione" ... e quindi?).

    Originariamente inviato da Sampy84
    Avevo trovato una guida che diceva di dividere i blocchi di byte e fare una doppia divisione per 16 e prendere solo il resto ma nn sono stato in grado di risolvere, potete darmi una mano ???
    Ma bisogna vedere cosa vuoi rappresentare e come! Vuoi che un byte 10100110 sia scritto nel JTextField come 2 caratteri a6 (è la rappresentazione in esadecimale del byte)??? Allora usa Integer.toHexString().

    codice:
    byte b = -90;   // è 10100110 in binario, a6 in esadecimale
    
    String s = Integer.toHexString(b & 0xFF);    // s contiene "a6"
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    18
    si scusami in effetti ho fatto un po di confusione, quei tre blocchi di byte rappresentano la risposta offerta dal micro. La risposta è composta da una parte iniziale inviata sottoforma di String ("ParRX:") che mi viene visualizzata correttamente sia sullo schermo che sulla jtextField. poi due serie di numeri ( la prima di 8 e la seconda di 1). il problema è che questi numeri inviati dall'eeprom sono in forma esadecimale e quando vado a stamparli non sono visualizzabili.
    Questa è la parte di codice che si occupa della lettura


    public void serialEvent(SerialPortEvent event) {
    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:

    case SerialPortEvent.DATA_AVAILABLE:
    byte[] readBuffer = new byte[8];

    try {

    while (in.available()>0 ) { // in è l'inputstream collegato alla porta seriale

    int numByte=in.read(readBuffer); // Mi restituisce il numero di byte

    risposta=new String(readBuffer);
    System.out.println(risposta+" Numero di byte "+numByte);
    System.out.println("");
    }
    }
    catch (IOException e) {}
    }
    }


    Di seguito ti invio anche cio che mi viene stampato a video. La parte String viene visualizzata correttamente mentre gli altri due pezzi no...
    Immagini allegate Immagini allegate

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Sampy84
    il problema è che questi numeri inviati dall'eeprom sono in forma esadecimale e quando vado a stamparli non sono visualizzabili.
    Ripeto che dire "sono in forma esadecimale" non vuol dire nulla .... 1 byte sono 8 bit punto. Cosa rappresenta per te un byte ... dipende!!

    Vuoi semplicemente visualizzare il valore con una rappresentazione in esadecimale? L'ho spiegato prima ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    18
    Si scusami in effetti avevo fatto un po di confusione, quello che dovevo fare era prendere ogni singolo byte in arrivo, spezzarlo in due gruppi di 4 bit e fare una traduzione utilizzando la tabella per il sistema numerico esadecimale http://it.wikipedia.org/wiki/Sistema...co_esadecimale
    in modo tale da ottenere il valore che mi era stato mandato dall' eeprom, ed alla fine ho risolto andando a creare e richiamare questo metodo, che ne pensi??
    Il parere di chi ne sa piu di me è sempre utile


    /////////////////////////////////////////////////////////////////////////////////////////////
    // Metodo getInt()
    /////////////////////////////////////////////////////////////////////////////////////////////

    public String getInt(int p){

    String s= Integer.toBinaryString(p); // Mi restituisce l'equivalente binario dell'intero

    while (s.length()!=8) {
    s="0"+s;
    }
    String prima="";
    String seconda="";
    String primahex="";
    String secondahex="";
    int i=0;

    for(i=0; i<8; i++) {

    if(i<4)

    prima=prima+s.charAt(i);

    else

    seconda=seconda+s.charAt(i);
    }

    // Codifica prima parte

    if (prima.equals("0000"))
    primahex="0";
    else
    if (prima.equals("0001"))
    primahex="1";
    else
    if (prima.equals("0010"))
    primahex="2";
    else
    if (prima.equals("0011"))
    primahex="3";
    else
    if (prima.equals("0100"))
    primahex="4";
    else
    if (prima.equals("0101"))
    primahex="5";
    else
    if (prima.equals("0110"))
    primahex="6";
    else
    if (prima.equals("0111"))
    primahex="7";
    else
    if (prima.equals("1000"))
    primahex="8";
    else
    if (prima.equals("1001"))
    primahex="9";
    else
    if (prima.equals("1010"))
    primahex="A";
    else
    if (prima.equals("1011"))
    primahex="B";
    else
    if (prima.equals("1100"))
    primahex="C";
    else
    if (prima.equals("1101"))
    primahex="D";
    else
    if (prima.equals("1110"))
    primahex="E";
    else
    if (prima.equals("1111"))
    primahex="F";

    // Codifica seconda parte

    if (seconda.equals("0000"))
    secondahex="0";
    else
    if (seconda.equals("0001"))
    secondahex="1";
    else
    if (seconda.equals("0010"))
    secondahex="2";
    else
    if (seconda.equals("0011"))
    secondahex="3";
    else
    if (seconda.equals("0100"))
    secondahex="4";
    else
    if (seconda.equals("0101"))
    secondahex="5";
    else
    if (seconda.equals("0110"))
    secondahex="6";
    else
    if (seconda.equals("0111"))
    secondahex="7";
    else
    if (seconda.equals("1000"))
    secondahex="8";
    else
    if (seconda.equals("1001"))
    secondahex="9";
    else
    if (seconda.equals("1010"))
    secondahex="A";
    else
    if (seconda.equals("1011"))
    secondahex="B";
    else
    if (seconda.equals("1100"))
    secondahex="C";
    else
    if (seconda.equals("1101"))
    secondahex="D";
    else
    if (seconda.equals("1110"))
    secondahex="E";
    else
    if (seconda.equals("1111"))
    secondahex="F";

    return(primahex+secondahex);

    } // Metodo getInt()



    Grazie ciao ciao

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Sampy84
    alla fine ho risolto andando a creare e richiamare questo metodo, che ne pensi??
    Che ha poco senso ..... lo avrebbe forse solo se ti fosse stato chiesto (per qualunque motivo .... "didattico" o altro) di fare espressamente il passaggio valore -> stringa binaria -> stringa esadecimale.

    Ma in ogni caso hai solo fatto un metodo lungo e fumoso.

    codice:
    public static String byteToHexString(byte b) {
        String s = Integer.toHexString(b & 0xFF).toUpperCase();
        return s.length() == 1 ? "0"+s : s;
    }
    E se si voleva farlo senza usare metodi del framework ma solo con dei calcoli, si poteva anche fare:

    codice:
    private static final char[] hexDigits = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
    
    public static String byteToHexString(byte b) {
        return "" + hexDigits[b >> 4 & 0xF] + hexDigits[b & 0xF];
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    18
    Grazie del consiglio... Ora provo ciao ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.