Newsgroup: it.comp.lang.visual-basic
Titolo: MSCOMM e seriale

Salve a tutti,
Ho un problema con un programma che legge i dati dalla seriale.
Se accendo il PC e lancio il programma la prima volta perde alcuni dati, 
dalla seconda volta in poi funziona correttamente.
Mi potete dare un consiglio ??
Ciao


se posti un po di codice magari ...
CIAO

forse xchè quando accendi e spegni il pc sulla 232 rimangono dei segnali in
input che il tuo programma interpreta e quidi perdi il resto
"Mr X" <M...@xxx.xx> ha scritto nel messaggio
news:MPG.17671fa83...@news.interbusiness.it...


, 
cgamb...@libero.it
 says...

Ho messo le routine principiali per il controllo della seriale...
Ciao
private sub form_load()
.
.    
    'Configurazione seriale
    With MSCommCTRL
        .CommPort = 1
        .Settings = 9600,E,7,1
        .Handshaking = 0
        .RThreshold = 1
        .SThreshold = 1
        .InBufferSize = 1024
    End With
.
.
end sub
.
.
Private Sub cmdLeggiCOM_Click(Index As Integer)
    'Inizializza variabili
    RxBuffer = ""
    DataMov = "": CausMov = "": DepoMov = ""
    If MSCommCTRL.PortOpen = False Then
        'Richiedo estremi movimento
        With frmCausale
            .Show vbModal
            DataMov = .DataMovim
            CausMov = .CausMovim
            DepoMov = .DepoMovim
        End With
        'Controllo se dati sono corretti
        If frmCausale.InputOK = False Then
            Exit Sub
        End If
 
        'Attiva countdown per timeoutseriale
        timeoutserial.Enabled = True
 
        With MSCommCTRL
            .DTREnable = True
            .PortOpen = True
        End With
        Me.Enabled = False
    End If
End Sub
.
.
Private Sub MSCommCTRL_OnComm()
    'Ricezione dati
    Dim Buffer As String, Dati As String
    Dim x As Long
    Select Case MSCommCTRL.CommEvent
   ' Gestisce ogni evento o errore inserendo
   ' del codice dopo ogni istruzione Case
   ' Errori
      Case comEventBreak      ' Ricevuto un segnale di
                              ' interruzione.
      Case comEventFrame      ' Errore di frame.
      Case comEventOverrun      ' Perdita di dati.
      Case comEventRxOver      ' Overflow buffer di
                              ' ricezione.
      Case comEventRxParity   ' Errore di parità.
      Case comEventTxFull      ' Buffer di trasmissione
                              ' pieno.
      Case comEventDCB         ' Errore imprevisto
                              ' durante il recupero di
                              ' DCB.
   ' Eventi
      Case comEvCD         ' Modifica della linea CD.
      Case comEvCTS         ' Modifica della linea CTS.
      Case comEvDSR         ' Modifica della linea DSR.
      Case comEvRing         ' Modifica dell'indicatore
                           ' del segnale telefonico.
      Case comEvReceive      ' Ricevuto il numero di
                             ' caratteri RThreshold.
        'Ritardo seriale
        For x = 1 To Delay
        Next
 
        'Leggo seriale
        Buffer = MSCommCTRL.Input
        RxBuffer = RxBuffer & Buffer
 
        If DebugMode Then FDebug.writeline ("<--Seriale:" & RxBuffer & 
"-->")
 
        Call DataSerial(RxBuffer)
      Case comEvSend         ' Il buffer di trasmissione
                           ' include il numero di
                           ' caratteri
                           ' specificato da
                           ' SThreshold.
      Case comEvEOF         ' È stato trovato un
                           ' carattere EOF nel flusso
                           ' di input.
   End Select
End Sub
.
.
Private Sub DataSerial(ByRef Pacchetto As String)
    Dim StartCharFile As String, EndCharFile As String
    Dim StartBlockChar As String, StopBlockChar As String
    Dim Pos As Integer, sData As String
 
    StartCharFile = Chr(2)      'Inizio file
    StartBlockChar = Chr(91)    'Inizio blocco
    StopBlockChar = Chr(23)     'Fine blocco
    EndCharFile = Chr(3)        'Fine file
 
    'Disattiva controllo time out seriale
    timeoutserial.Enabled = False
 
    'Controlla se sono arrivati dati dalla seriale
    If Left(Pacchetto, 1) <> StartCharFile Then
 
        'Scarta tutto quello che è prima
        Pos = InStr(Pacchetto, StartCharFile)
        If Pos > 0 Then
            Pacchetto = Mid(Pacchetto, Pos)
        End If
        If Len(Pacchetto) = 0 Then
            Exit Sub
        End If
        If DebugMode Then FDebug.writeline ("<--Pacchetto:" & Pacchetto 
& "-->")
    End If
    'Carattere inizio blocco
    If Left(Pacchetto, 1) <> StartBlockChar Then
        Pos = InStr(Pacchetto, StartBlockChar)
        If Pos > 0 Then
            Pacchetto = Mid(Pacchetto, Pos)
        End If
        If Len(Pacchetto) = 0 Then
            Exit Sub
        End If
    End If
    'Carattere fine trasfmissione
    Pos = InStr(Pacchetto, EndCharFile)
    If Pos > 0 Then
        Pacchetto = Mid(Pacchetto, 1, Pos - 1) & StopBlockChar
        If Len(Pacchetto) = 0 Then
            Exit Sub
        Else
            'Chiude la potra COM
            MSCommCTRL.PortOpen = False
            Me.Enabled = True
            If DebugMode Then FDebug.writeline ("<--Fine 
Trasmissione-->" & Now)
        End If
    End If
 
    'controllo dati completi e elaboro
    Do
        Pos = InStr(Pacchetto, StopBlockChar)
 
        If Pos = 0 Then Exit Do     'nessun altro pacchetto esco dal 
loop
        'Dati da eleborare
        sData = Mid(Pacchetto, 1, Pos - 1)
        'Elimino dati dal buffer
        Pacchetto = Mid(Pacchetto, Pos + 1)
        'Elabora Dati
        Call ElaboraDati(sData)
    Loop
End Sub
.
.

