Italian Seriale/usb intercettare caratteri

marco.canta

Active Member
Licensed User
buongiorno ragazzi, ho bisogno del vostro aiuto, ho bisogno di realizzare un programma che legga la porta seriale e intercetti un carattere ascii = 175 , il momento che rilevo e aolo se lo rilevo devo leggere i sei caratteri successivi che vengono ricevuti.
Sulla seriale arrivano in continuo una serie di dati, e solo quando si verifica la mia condizione devo leggere i dati.
Ho fatto un prigramma con B4J che legge tutti i dati che passano sulla seriale, e fin li tutto ok, ma non riesco a trovare la procedura per fare cio che mi occorre.
Qualche idea o suggerimento ?

Grazie Marco

B4X:
Sub AStreams_NewData (Buffer() As Byte)
    Dim msg As String
    msg = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
    valoreRX = asc(msg)
End Sub
 

LucaMs

Expert
Licensed User
B4X:
Sub AStreams_NewData (Buffer() As Byte)
    Dim msg As String
    msg = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
    Dim Pos As Int
    Pos = msg.IndexOf(strTuoCarattere)
    If Pos > -1 Then
        ' trovato.
        ' qui, usando varie funzioni di stringa
        ' prelevi i caratteri successivi.
        ' Ad esempio, devi eliminare i caratteri precedenti:
        msg = msg.SubString(msg, Pos + 1)
        ' Verificare se la lunghezza rimanente è di almeno 6 caratteri
        if msg.Lenght >= 6 Then
        ' e così via.
        ' Potrebbe servirti anche una variabile globale
        ' nel caso in cui msg sia lunga ad esempio 2
        ' i 4 successivi li riceverai nel prossimo msg
        ' quindi, prima di questo blocco "If Pos...
        ' userai:
        If mResto > 0 then
             AltriDaLeggere = SubString2(msg, 0, mResto)
        ' etc
    End If
End Sub
 

marco.canta

Active Member
Licensed User
Ciao Luca, sto provando il codice che mi hai indicato e con qualche modifica sembra funzionare.
Mi rimangono un paio di difficolta':

- Pos = msg.IndexOf(strTuoCarattere)

come valore 'strTuoCarattere' dovrei inserire 'Chr(174)' ma non riesco ad inserire il valore Chr. Se inserisco una lettera ok.

es:

- Pos = msg.IndexOf("e")
ok funziona

- Pos = msg.IndexOf(Chr(174))
NON funziona.


poi nel tuo esempio non sono a comprendere l'origine del "mResto". da dove lo rilevo?

Grazie Marco
 

LucaMs

Expert
Licensed User
Beh, il mio esempio era scritto qui, al volo, tanto per darti un'idea.

mResto (variabile globale) lo calcolerai in base a quanti caratteri saranno arrivati in quel momento dopo quello chiave (174).
Cioè, facendo un esempio col solo testo leggibile, tanto per capirci:

se msg = "0123X45" e X è il tuo 174, in quel momento tu avrai solo 2 caratteri (45), non i 6 che ti servivano; quindi imposti mResto = 4 e all'arrivo successivo prelevi direttamente i primi 4 caratteri.

Per quanto riguarda chr(174)... sono rimasto al vecchio VB.Net; ora guardo se e cosa cambia e ti faccio sapere.
 

LucaMs

Expert
Licensed User
A me sembra che funzioni, anche se la funzione Chr indica la codifica Unicode:

B4X:
 Dim c As String = Chr(174)
Log(c)
Log(Asc(c))
®
174

[nel tuo primo post era 175]
 

marco.canta

Active Member
Licensed User
Per il valore Chr(174) risolto. Ho cambiato i parametri di ricezione da "UTF8" a "iso-8859-1".

Ora sto sistemando il discorso del mResto, anche perche non sempre ho tutti i dati nella stringa ricevuta.
 

LucaMs

Expert
Licensed User
anche perche non sempre ho tutti i dati nella stringa ricevuta.
proprio per questo, perché potrebbero arrivare in due "gruppi" diversi, dovresti usare la variabile globale mResto.

Se nella routine mResto = 0, precedentemente non hai incontrato (174) oppure hai letto i suoi 6 caratteri successivi.
Se trovi (174) e il blocco (msg) contiene altri 6 caratteri dopo la posizione di (174), li leggi tutti; se invece contiene, sempre dopo (174), meno di 6 caratteri, diciamo 4,
imposti mResto = 2, cioè la differenza, quanti ancora dovrai riceverne.
 

marco.canta

Active Member
Licensed User
Risolto ... cosi funziona tutto !!!

Grazie LucaMs

B4X:
Sub AStream_NewData (Buffer() As Byte)
    Dim Evt As Int
    Dim msg As String
    Dim ValEvento As String
    Dim ValRX As String
    Dim ValRX1 As String
    Dim ValRX2 As String
   
    ValRX = BytesToString(Buffer,0,Buffer.Length,"iso-8859-1")
    msg = ValRX
    If mResto > 0 Then
        msg = msg.SubString2(0, mResto)
        mResto = 0
        ValRX2 = msg
        ValEvento = ValRX1 & ValRX2   
    End If   
   
    Evt = msg.IndexOf(Chr(174))
    If Evt > -1 Then
        msg = msg.SubString(Evt+1)

        If msg.Length >= 6 Then
            msg = msg.SubString2(0,6)
            mResto = 0
            ValEvento = msg
            ValRX1 = ""
            ValRX2 = ""
        Else
            mResto = 6 - msg.Length
            ValRX1 = msg           
        End If
    End If
End Sub
 
Top