Italian Seriale/usb intercettare caratteri

Discussion in 'Italian Forum' started by marco.canta, May 22, 2015.

  1. marco.canta

    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

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

    LucaMs Expert Licensed User

    Code:
    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
     
  3. marco.canta

    marco.canta Active Member Licensed User

    Grazie Luca , provero al piu presto !
     
  4. marco.canta

    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
     
  5. LucaMs

    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.
     
  6. LucaMs

    LucaMs Expert Licensed User

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

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

    [nel tuo primo post era 175]
     
  7. marco.canta

    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.
     
  8. LucaMs

    LucaMs Expert Licensed User

    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.
     
  9. marco.canta

    marco.canta Active Member Licensed User

    Risolto ... cosi funziona tutto !!!

    Grazie LucaMs

    Code:
    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
     
    LucaMs likes this.
  10. LucaMs

    LucaMs Expert Licensed User

Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice