Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    193

    [VB6]Gestire buffer rs232

    Ciao a tutti

    Espongo il mio problema:
    Ho collegato uno strumento di misura di temperatura al pc tramite rs232 e vorrei visualizare i dati ricevuti in una textbox, e fino qui tutto bene solo che lo strumento invia 1 carattere alla volta e non riesco a comporre la stringa di testo come vorrei visualizzarla.
    Un esempio:
    Private Sub Form_Load()
    MSComm1.Settings = "19200,N,8,1"
    MSComm1.CommPort = 9
    MSComm1.InputLen = 1
    MSComm1.PortOpen = True
    MSComm1.RThreshold = 1
    End Sub
    Private Sub MSComm1_OnComm()
    Dim StrData As Variant 'define variable type as it is variant
    StrData = MSComm1.Input
    Text1.Text = Text1.Text & StrData

    End Sub
    ed il risultato è questo:
    Flow[l/h]: +0.00 Temp[C]: +21.0,Flow[l/h]: +0.00 Temp[C]: +21.0,Flow[l/h]: +0.00 Temp[C]: +21.0,
    Flow... ecc...
    Tutto scritto su una riga,allora ho messo un enter alla fine cosi':
    Text1.Text = Text1.Text & StrData & vbCrLf
    ed il risultao è questo:
    F
    l
    o
    w
    [
    l
    /
    h
    ]
    :

    +
    0
    .
    0
    0


    T
    e
    m
    p
    [
    C
    ]
    :

    +
    2
    1
    .
    1
    ,
    ecc...

    Quindi deduco che lo strumento invia 1 lettera alla volta quindi dovrei creare un buffer che mi contenga la stringa da stampare completa ma pur avendo seguito degli esempi non riesco.
    dovrei ottenere questo risultato:

    Flow[l/h]: +0.00 Temp[C]: +21.1
    Flow[l/h]: +0.00 Temp[C]: +21.1
    Flow[l/h]: +0.00 Temp[C]: +21.1
    Flow[l/h]: +0.00 Temp[C]: +21.1
    ecc...
    L'ultima mia prova è stata:


    Private Sub MSComm1_OnComm()
    Dim RxBuffer$
    Dim Pos As Integer
    Dim Rx$
    Dim Pacchetto$


    Rx$ = MSComm1.Input
    If Len(Rx$) = 0 Then Exit Sub


    RxBuffer$ = RxBuffer$ & Rx$


    If Left$(RxBuffer$, 1) <> "F" Then

    Pos = InStr(RxBuffer$, "F")
    RxBuffer$ = Mid$(RxBuffer$, Pos)
    If Len(RxBuffer$) = 0 Then

    Exit Sub
    End If
    End If


    Do
    Pos = InStr(RxBuffer$, ",")
    If Pos = 0 Then Exit Do


    Pacchetto$ = Mid$(RxBuffer$, 2, Pos - 2)

    RxBuffer$ = Mid$(RxBuffer$, Pos + 1)


    Pos = InStr(Pacchetto$, "F")
    If Pos Then

    Pacchetto$ = Mid$(Pacchetto$, Pos + 1)

    End If


    Loop

    Text1.Text =Pacchetto$

    End Sub
    Mi restituisce
    "errore di rountine 5"
    "chiamata di rountine o argomento non valido"

    facendo il debug si ferma qui:

    RxBuffer$ = Mid$(RxBuffer$, Pos)
    Scusate la lunghezza del post ma dopo 2 giorni che sto provando mi affido a voi.
    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    758
    Quindi deduco che lo strumento invia 1 lettera alla volta quindi dovrei creare un buffer che mi contenga la stringa da stampare completa ma pur avendo seguito degli esempi non riesco.
    Lo strumento invia una sequenza di bit, giacché attraverso una porta seriale non può passare altro (si chiama seriale per questo). Il controllo MSComm, in base a cosa gli hai impostato nella proprietà Settings, raggruppa questi bit in modo da ricostruire dei byte, e te li mette a disposizione nella quantità che tu gli dici con la proprietà InputLen, cioè 1.
    Se la stringa "utile" ha una lunghezza costante (sembrerebbe 31) puoi impostare RThreshold a 31 in modo tale cje l'evento OnComm si verifichi ogni 31 byte ricevuti e anche InputLen a 31 in modo da avere a disposizione segmenti di questa lunghezza.
    In alternativa puoi continuare come stai facendo ora, cioè accumulando un byte alla volta in Text1 (o altra stringa), ma verificando se il carattere ricevuto è una virgola, nel qual caso hai una stringa valida e completa da interpretare; dopodiché puoi resettare Text1 (op la stringa usata).

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Segui il secondo suggerimento di Grumpy ... qualcosa come

    codice:
    StrData = MSComm1.Input
    If StrData="," Then
      Text1.Text = ""
    Else
       Text1.Text = Text1.Text & StrData 
    End If
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    193
    Ho risolto cosi,immaginavo fosse una cosa semplice....
    MSComm1.InputLen = 35
    MSComm1.PortOpen = True
    MSComm1.RThreshold = 35
    Grazie

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    758
    Va bene, ma ricorda che questo metodo dà per certo che arrivino sempre e regolarmente "messaggi" di 35 caratteri; se per qualche motivo dovesse arrivare un messaggio più lungo o più corto tutti i successivi sarebbero sballati.
    L'altro metodo invece - come non a caso suggeriva oregon - permetterebbe di risincronizzarsi in caso di errore nella trasmissione.

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.