Seriale

di il
18 risposte

Seriale

Ciao a tutti, ho un problema sul gestire una risposta seriale tra un elettronica e il software:
- Io mando comando
- io ricevo comando.
Io tra mandare e ricevere, posso avere un attesa massima di 2 secondi.

Al momento io la gestisco in questo modo:

- Io mando comando
Delay(2 secondi)
-io ricevo comando.

Ma se ricevo prima la risposta, vorrei interrompere il tempo di attesa.
Se metto un Timer, mi risolve il problema? L'ho provato, ma siccome non l'ho ancora usato, sicuramente ho sbagliato qualcosa

18 Risposte

  • Re: Seriale

    Ma come ricevi? Con un evento? Se è così fai partire il timer dopo l'invio, se ricevi cancelli il timer, se il timer scatta prima avverti del timeout
  • Re: Seriale

    Io so quando ricevo, perché le risposte le visualizzo su una richtextbox. Leggo quello che ricevo, se è quello che mi aspetto, porto una variabile che chiamo ok = 1. altrimenti rimane a 0.
  • Re: Seriale

    Io nel form1, ho la richtextbox dove ricevo le risposte, nel form due io mando i comandi.

    se ricevo la risposta corretta, ho una variabile OK=1, altrimenti rimane a 0.
    il mio comando nel form 2 si trova all'interno di un do:

    la logica col timer sarebbe la seguente:

    form2-
    do
    ..
    ..
    invio comando
    timer2.enabled=true
    loop until


    form1-
    if richtextbox.text=giusto then
    ok=1
    timer1.enabled = false
    end if


    timer2.interval=2000
    così ho provato, ma niente, esegue il do senza attendere la risposta
  • Re: Seriale

    Rileggi quello che ti ho scritto. Usi un evento per ricevere?
  • Re: Seriale

    Scusa oregano, si, per ricevere uso l'evento DataReceived
    
    Private Sub SerialPort_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            UpDateText(SerialPort1.ReadExisting())
        End Sub
        
    
      Delegate Sub SetTextCallback(ByVal [text] As String)
        Private Sub UpDateText(ByVal [text] As String)
            If Me.RichTextBox1.InvokeRequired Then
                Dim Cmp As New SetTextCallback(AddressOf UpDateText)
                Me.Invoke(Cmp, New Object() {(text)})
            Else
                Me.RichTextBox1.Text &= [text]
            End If
        End Sub
    
  • Re: Seriale

    Quindi segui quello che ti ho suggerito

    Fai partire il timer dopo l'invio con start
    Se arrivano dati nell'evento blocchi il timer
    Se arriva prima il timer visualizzi l'errore

    A grandi linee ... poi devi adattate tu alle fue esigenze complessive che non si conoscono
  • Re: Seriale

    Ci ho provato, ma niente:
    form1:
    Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
    if stringa ok allora
    OK = 1
    Form2.Timer2.Stop()
    end if
    form2:
    do

    invio messaggio
    timer2.enabled=true
    time2.start()

    loop until

    end sub

    ma niente, non attende i 2 secondi, manda tutti i comandi che deve mandare assieme, senza attendere la risposta
  • Re: Seriale

    Ma quel do loop a che serve???
  • Re: Seriale

    Mi manda il comando tot volte:

    tot=5
    do
    progressivo= progressivo+1
    stringa da inviare = stringa & progressivo
    attivo timer (2000 ms)
    interrompi timer se risposta arriva prima

    loop until progressivo = tot

    ma anche mettendo il timer con la logica indicata sopra, lui mi manda tutti i comandi che mi deve inviare assieme, senza aspettare la risposta, e nemmeno i 2 secondi del timer ( e come se non ci fosse il timer)
  • Re: Seriale

    Se io, dopo aver inviato il copmando, metto un ritardo di 2 secondi, i dati me li invia correttamente, ma cosi facendo, se l'elettronica mi risponde prima, sono obblicato ad attendere i 2 secondi, mentre io vorrei uscire prima
  • Re: Seriale

    Quelle che esegui nel do loop, lo devi mettere nella sub timer-tick . Per uscire prima dei 2 sec metti un contatore di tick
  • Re: Seriale

    Ma il contatore di tick non conta quanti tick ci sono ?
  • Re: Seriale

    Il timer fin ora nn l'ho mai usato
  • Re: Seriale

    Non so se ho capito. Trascina un timer e lascialo a 100 ms e metti una var globale n. Abilita il timer quando sai tu. Nella timer_tick se n = 0 , invia i dati, se n= 20 riporta a 0, aumenta n di 1. Quando ricevi i dati riporta n = 0. Disabilita il timer quando sai tu, tipo quando hai inviato un tot di dati?
Devi accedere o registrarti per scrivere nel forum
18 risposte