Italian java.lang.NumberFormatException: Invalid hex double:0x456

fifiddu70

Well-Known Member
Licensed User
Longtime User
Ciao a tutti, qualcuno mi sa dire come convertire far leggere da una edittext il codice vendor id e da un'altra edittext il product id della stampante termica? al momento funziona bene solo inserendo direttamente il codice come esempio:
B4X:
usb1.SetCustomDevice(usb1.DRIVER_SILABS, 0x456, 0x808)

se inserisco invece le due edittex:
B4X:
usb1.SetCustomDevice(usb1.DRIVER_SILABS, txtvendorid.text, txtpruductid.text)
in questo modo ricevo l'errore:
java.lang.NumberFormatException: Invalid hex double:0x456
che si può fare per farlo leggere correttamente dalle due edittext?
 

sirjo66

Well-Known Member
Licensed User
Longtime User
.... ma nelle edittext cosa c'è scritto ??

Nella prima dovresti scrivere 1110, nella seconda 2056
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Nella edittex dovrei scrivere 0x456 per una e 0x808 per l'altra, ma ricevo l'errore che ho detto.
 

LucaMs

Expert
Licensed User
Longtime User
Sono numeri esadecimali, quindi devi convertirli in decimali.

B4X:
Dim Esadecimale As String = txtvendorid.Text
Esadecimale = Esadecimale.Replace("0x", "")
Log("Esad. : " & Esadecimale)
Dim Intero As Int = Bit.ParseInt(Esadecimale, 16)
Log("Intero: " & Intero)
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Sono numeri esadecimali, quindi devi convertirli in decimali.

B4X:
Dim Esadecimale As String = txtvendorid.Text
Esadecimale = Esadecimale.Replace("0x", "")
Log("Esad. : " & Esadecimale)
Dim Intero As Int = Bit.ParseInt(Esadecimale, 16)
Log("Intero: " & Intero)

ricevo il seguente errore: java.lang.NumberFormatException: Invalid int: ""
 

LucaMs

Expert
Licensed User
Longtime User
se txtvendorid contiene 0x456 come hai detto dovrebbe funzionare.

Prova il codice mettendo:

Dim Esadecimale As String = 0x456

anziché

Dim Esadecimale As String = txtvendorid.Text

e vedrai che funziona.

Verifica cose viene scritto in txtvendorid.text (con un log)
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
il problema è appena inserisco le edittext non va, mi torna quell'errore.
 

LucaMs

Expert
Licensed User
Longtime User
il problema è appena inserisco le edittext non va, mi torna quell'errore.
usb1.SetCustomDevice(usb1.DRIVER_SILABS, txtvendorid.text, txtpruductid.text)

Non è mai il modo di migliore di scrivere il codice, per vari motivi:

1) non sai cosa venga scritto nelle EditText, non lo controlli;
2) per il debugging.

Quindi:

a) nell'evento txtvendorid_TextChanged verifichi che il contenuto sia accettabile
b) chiami la SetCustomDevice passandogli delle variabili, VendorID e ProductID

VendorID = txtvendorid.Text
ProductID = txtproductid.Text


Il codice che ti ho suggerito funziona.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
questo è il codice che ho inserito sulla activity_load layout, quindi alla partanza dell'app carica questo codice:
B4X:
If usb1.UsbPresent(1) = usb1.USB_NONE Then    ' Ver_2.4
            Msgbox("Stampante non connessa al cavo usb","ATTENZIONE!!")
            Return
        End If
        If (usb1.HasPermission(1)) Then    ' Ver_2.4
            Log(usb1.DeviceInfo(1))
            'This is very important - ( VendorId, ProductId )


             usb1.SetCustomDevice(usb1.DRIVER_SILABS, 0x456,0x808) ' qui legge il vendor id e il product id della mia stampante ma dovrebbe essere come rigo sotto.
        ' come vorrei che sia nel rigo di sotto
               ' usb1.SetCustomDevice(usb1.DRIVER_SILABS, txtvendorid.text ,txtproductid.text)' io voglio che lo legga dalle edittext non come rigo di sopra.

           

 Dim dev As Int
            dev = usb1.Open(9600, 1) 'STMicroeletronics
            If dev <> usb1.USB_NONE Then
                Log("Connected successfully! 1")
            
            
        
                Log("CONNECTED SUCCESSFULLY!!!")
                connected = True
                astreams1.Initialize(usb1.GetInputStream, usb1.GetOutputStream, "astreams1")

                'This is important
                usb1.SetParameters(9600, usb1.DATABITS_8,usb1.STOPBITS_1, usb1.PARITY_EVEN)
            
                'Here if you want codce that call print
            Else
                Log("Error opening USB port 1")
            End If
        Else
            usb1.RequestPermission(1)  ' Ver_2.4
        
        End If

il problema nasce nella lettura di questo rigo; usb1.SetCustomDevice(usb1.DRIVER_SILABS, txtvendorid.text,txtproductid.text)
 
D

Deleted member 103

Guest
Prova così:
B4X:
        Dim vendorid, productid As Int
        vendorid = txtvendorid.text
        productid = txtproductid.text
        usb.SetCustomDevice(usb.DRIVER_FTDI, vendorid, productid)
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Non ho capito chi, quando e dove riempia le due EditText; comunque, durante l'Activity_Create esse saranno certamente vuote, per questo ottieni l'errore.
ho realizzato un database dove in automatico le due caselle di testo vengono riemipite, quindi questo problema non c'è perchè prima le caselle di testo vengono riempite e poi passate alla stringa della stampante usb con vendor e product
 

LucaMs

Expert
Licensed User
Longtime User
ho realizzato un database dove in automatico le due caselle di testo vengono riemipite, quindi questo problema non c'è perchè prima le caselle di testo vengono riempite e poi passate alla stringa della stampante usb con vendor e product
Assicurati che non siano vuote prima di lanciare il famigerato comando.

Se non fossero vuote, NON devi passarne il contenuto a quel comando, devi trasformare il contenuto, che dovrebbe essere 0x456 e 0x808 in numeri interi e passare questi al comando.
Per trasformali in interi... vedi post #4
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Filippo non va, ho riprovato con il codice di LucaMs ma in questo modo:
B4X:
Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    
    If FirstTime Then
        Server.Initialize(9092, "Server")
        Server.Listen
        Log("MyIp = " & Server.GetMyIP)
        TTS1.Initialize("TTS1")
        
    End If
    'txtproductid.Text=0x5011
    
    'txtvendorid.Text=0x4016
    
    Activity.LoadLayout("stampafattura")
    imgsplashscreen.SetLayout(0%x,0%y,100%x,100%y)
    wifi1.Initialize("wifi1")
    wifi2.Initialize
    mp1.Initialize
    mp2.Initialize
    
    
    
  

    
    pnlsetup.Visible=False
    timer1.Initialize("timer1",1000)
    timer2.Initialize("timer2",1000)
    timer3.Initialize("timer3",3000)
    timer4.Initialize("timer4",1500)
    timer6.Initialize("timer6",2000)
    lbla.SetLayout(0%x,1%y,18%x,38%y)
    txttavolo.SetLayout(22%x,1%y,80%x,38%y)
    lblb.SetLayout(0%x,41%y,18%x,38%y)
    txttavolo2.SetLayout(22%x,41%y,80%x,38%y)
    imgnext.SetLayout(1%x,80%y,45%x,18%y)
    imgB1.SetLayout(52%X,80%Y,45%X,18%Y)
    txtprintname.SetLayout(1%x,1%y,70%x,10%y)
    btnsavename.SetLayout(72%x,1%y,26%x,10%y)
    txtproductid.SetLayout(1%x,13%y,20%x,8%y)
    btnsaveproductid.SetLayout(22%x,13%y,20%x,10%y)
    txtvendorid.SetLayout(44%x,13%y,20%x,8%y)
    btnsalvavendorid.SetLayout(73%x,13%y,20%x,10%y)
    txtmyip.SetLayout(1%x,25%y,35%x,10%y)
    btnsalvamyip.SetLayout(37%x,25%y,20%y,10%y)   
    txtintestazione.SetLayout(1%x,36%y,98%x,30%y)
    btnsalvaintestazione.SetLayout(1%x,67%y,98%x,10%y)
    pnlsetup.SetLayout(0%x,0%y,100%x,100%y)
    
    
    btnchiudisetup.SetLayout(1%x,88%y,98%x,10%y)
    txtintestazione.Color=Colors.White
    txtvendorid.Color=Colors.White
    txtproductid.Color=Colors.White
    txtmyip.Color=Colors.White
    txtprintname.Color=Colors.White
    imgnext.Bitmap=(LoadBitmap(File.DirAssets,"stampaA.jpg"))
    imgB1.Bitmap=(LoadBitmap(File.DirAssets,"stampaB.jpg"))
    

    
    
    If File.Exists(File.DirInternal, "data.db") = False Then ' se non trova il database  allora lo copia usando il rigo di sotto altrimenti non fa nulla.
    File.Copy(File.DirAssets, "data.db", File.DirInternal, "data.db")
    Else
        
    End If
    dbsql2.Initialize(File.DirInternal, "data.db", True) ' inizializza il database
    
    productid
    vendorid
    
    'File.Delete(File.DirInternal,"data.db")
    If txtvendorid.Text ="" And txtproductid.Text = "" Then
        
        Msgbox("Attenzione devi inserire il product id e vendor id della stampante","ATTENZIONE!!!")
        Return
    Else
        
        If usb1.UsbPresent(1) = usb1.USB_NONE Then    ' Ver_2.4
            Msgbox("Stampante non connessa al cavo usb","ATTENZIONE!!")
            Return
        End If
        If (usb1.HasPermission(1)) Then    ' Ver_2.4
            Log(usb1.DeviceInfo(1))
            'This is very important - ( VendorId, ProductId )
          
  Dim Esadecimale As String = txtvendorid.Text
            Esadecimale = Esadecimale.Replace("0x", "")
            Log("Esad. : " & Esadecimale)
            Dim Intero As Int = Bit.ParseInt(Esadecimale, 16)
            Log("Intero: " & Intero)
            
            Dim Esadecimale2 As String = txtproductid.Text
            Esadecimale2 = Esadecimale2.Replace("0x", "")
            Log("Esad. : " & Esadecimale2)
            Dim Intero As Int = Bit.ParseInt(Esadecimale2, 16)
            Log("Intero: " & Intero)
            
            usb1.SetCustomDevice(usb1.DRIVER_SILABS, Esadecimale, Esadecimale2)
            'usb1.SetCustomDevice(usb1.DRIVER_SILABS, 0x456,0x808)
                
            Dim dev As Int
            dev = usb1.Open(9600, 1) 'STMicroeletronics
            If dev <> usb1.USB_NONE Then
                Log("Connected successfully! 1")
            
            
        
                Log("CONNECTED SUCCESSFULLY!!!")
                connected = True
                astreams1.Initialize(usb1.GetInputStream, usb1.GetOutputStream, "astreams1")

                'This is important
                usb1.SetParameters(9600, usb1.DATABITS_8,usb1.STOPBITS_1, usb1.PARITY_EVEN)
            
                'Here if you want codce that call print
            Else
                Log("Error opening USB port 1")
            End If
        Else
            usb1.RequestPermission(1)  ' Ver_2.4
        
        End If
        
        
    End If
        INTESTAZIONE
        nomestampante
    
        myip
        txtmyip.Text = wifi2.getIpAddress
        'timer2.Enabled=True
        switch=0
    '______________________
    
    
    
    
    
End Sub
Adeso mi da: Error opening USB port 1
questo e quello che ricevo nel log:

B4X:
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
Manufacturer : STMicroelectronics��������������������������
Product : USB Portable Printer    ��������������
Serial : Printer������������������������������������������������
DeviceName : /dev/bus/usb/002/002
DeviceClass : USB_CLASS_PER_INTERFACE (per-interface basis)
DeviceSubClass : 0
Device ID : 0x7D2
ProductId : 0x808
VendorId : 0x456
  B4aInterfaceNumber : 0
  InterfaceClass : USB_CLASS_PRINTER (printer)
  InterfaceSubClass : 1
  InterfaceProtocol : 2
    EndpointNumber : 1
    EndpointDirection : In
    EndpointType : USB_ENDPOINT_XFER_BULK (bulk)
    EndpointAttribute : 2
    EndpointInterval : 0
    EndpointMaxPacketSize : 64
    EndpointNumber : 3
    EndpointDirection : out
    EndpointType : USB_ENDPOINT_XFER_BULK (bulk)
    EndpointAttribute : 2
    EndpointInterval : 0
    EndpointMaxPacketSize : 64
Esad. : 808
Intero: 2056
Esad. : 456
Intero: 1110
Error opening USB port 1
** Activity (main) Resume **
** Activity (main) Pause, UserClosed = false **
** Service (starter) Destroy (ignored)**
** Activity (main) Resume **
** Activity (main) Pause, UserClosed = true **

quindi ci dovremmo essere, solo che non va ancora.
 

LucaMs

Expert
Licensed User
Longtime User
usb1.SetCustomDevice(usb1.DRIVER_SILABS, Esadecimale, Esadecimale2)
A questo devi passare degli interi, non esadecimali.
Quindi, invece di dichiarare Esadecimale e Esadecimale2, dovresti avere Intero e Intero2 e passargli questi.

Meglio ancora potresti creare una funzione. Questa è parte del tuo codice:
If (usb1.HasPermission(1)) Then ' Ver_2.4
Log(usb1.DeviceInfo(1))
'This is very important - ( VendorId, ProductId )

Dim Esadecimale As String = txtvendorid.Text
Esadecimale = Esadecimale.Replace(
"0x", "")
Log("Esad. : " & Esadecimale)
Dim Intero As Int = Bit.ParseInt(Esadecimale, 16)
Log("Intero: " & Intero)

Dim Esadecimale2 As String = txtproductid.Text
Esadecimale2 = Esadecimale2.Replace(
"0x", "")
Log("Esad. : " & Esadecimale2)
Dim Intero As Int = Bit.ParseInt(Esadecimale2, 16)
Log("Intero: " & Intero)

usb1.SetCustomDevice(usb1.DRIVER_SILABS, Esadecimale, Esadecimale2)

Cambiala così:
B4X:
If (usb1.HasPermission(1)) Then    ' Ver_2.4
    Log(usb1.DeviceInfo(1))
    'This is very important - ( VendorId, ProductId )
    usb1.SetCustomDevice(usb1.DRIVER_SILABS, EsadInt(txtvendorid.Text), EsadInt(txtproductid.Text))



Aggiungendo la funzione:
B4X:
Sub EsadInt(Esadecimale As String) As Int
    Esadecimale = Esadecimale.Replace("0x", "")
    Return Bit.ParseInt(Esadecimale2, 16)
End Sub



[Non mi piace perché comunque si passa il contenuto di due EditText alla funzione, ma se controlli che questo sia corretto, può essere accettabile.
Tra l'altro il controllo che fai è minimo e mica tanto logico:
If txtvendorid.Text ="" And txtproductid.Text = "" Then
E se una sola delle EditText fosse vuota?
Quindi dovresti mettere:
If txtvendorid.Text ="" Or txtproductid.Text = "" Then

Inoltre, potrebbero non essere vuote ma non contenere codici esadecimali nella forma corretta].
 
Last edited:
Top