Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 37
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    49

    Comunicazioine seriale sincrona con RS-232 senza handshake

    Salve,
    sto facendo i primi passi nel mondo VB6, non senza difficoltà.
    In questo momento sto cercando di far comunicare il pc con un dispositivo, un sensore, che acquisisce dati continuativamente ad una frequenza di campionamento fissata e li memorizza in una memoria ram. Tramite comunicazione basata su rs-232 effettuata per mezzo di un cavo con le sole linee di TX, RX e GND (niente linee CTS, RTS, etc... per intenderci) e tramite la trasmissioine di determinati caratteri devo indirizzare ogni cella di memoria delle 8 totali e richiedere l'invio del byte in queste contenuto. Il sensore, non appena riceve il carattere relativo alla richiesta di trasmissione, trasmette al pc il contenuto della cella di memoria indirizzata.
    Questa operazione deve essere ripetuta ciclicamente per tutte le celle di memoria e per un numero di volte infinito (spero di essere stato abbastanza chiaro).
    Con l'oscilloscopio mi sono assicurato che iI pc (DCE) e il sensore (DTE) comunichino.

    PROBLEMA:
    Ho associato ad un evento di click su un pulsante l'iterazione che indirizza ciclicamente tutte le celle di memoria e richiede la trasmissione dei byte in esse presenti. Osservando sull'oscilloscopio la comunicazione noto che il pc trasmette ma il sensore no (nonostante sia indirizzato correttamente e nonostante gli venga richiesto di trasmettere).
    Non riesco a fare in modo che quando il pc trasmette, il sensore non trasmetta e, viceversa, quando il sensore trasmette il pc non trasmetta. Una sorta di problema di temporizzazione.
    Vorrei che una volta indirizzata una cella e richiesta la trasmissionie del dato in essa presente, il pc attenda che il dato venga ricevuto sul buffer e letto (cancellandolo dal buffer) per poi riprendere con l'indirizzamento della cella successiva e con la richiesta di trasmissione del dato in essa presente, e così per infinite volte.

    Per rendere tutto ancora più chiaro, vi posto il codice.

    Option Explicit

    Dim startstop As Boolean
    Dim buffer As Integer
    Dim wordlow As String
    Dim a As Integer
    Dim i As Integer

    Private Sub Command1_Click()
    MSComm1.Output = Chr$(85) + Chr$(129) + Chr$(129) 'Attivazione sensore
    End Sub


    Private Sub Command3_Click() 'Iterazione di indirizzamento e richiesta trasmissione
    startstop = True
    i = 0
    Do While startstop = True
    buffer = MSComm1.InBufferCount
    Do While buffer = 0
    For a = i To 25 Step 1
    Select Case a
    Case 0
    MSComm1.Output = Chr$(&H0)
    MSComm1.Output = Chr$(&H1)
    MSComm1.Output = Chr$(&H0)
    MSComm1.Output = Chr$(&H2)
    MSComm1.Output = Chr$(&HA)
    MSComm1.Output = Chr$(&H5)
    MSComm1.Output = Chr$(&H2)
    i = (a + 1)
    Case 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
    MSComm1.Output = Chr$(&H2)
    i = (a + 1)
    Case 14, 15
    i = (a + 1)
    Case 15
    MSComm1.Output = Chr$(&H0)
    MSComm1.Output = Chr$(&H1)
    MSComm1.Output = Chr$(&H0)
    MSComm1.Output = Chr$(&H12)
    MSComm1.Output = Chr$(&HA)
    MSComm1.Output = Chr$(&H5)
    MSComm1.Output = Chr$(&H2)
    i = (a + 1)
    Case 16, 17, 18, 19, 20, 21, 22, 23, 24
    MSComm1.Output = Chr$(&H2)
    i = (a + 1)
    Case 25
    MSComm1.Output = Chr$(&H2)
    i = 0
    End Select
    Exit For
    Next a
    Loop
    Loop
    End Sub

    Private Sub Command4_Click()
    startstop = False
    End Sub

    Private Sub Form_Load()
    MSComm1.RThreshold = 1
    MSComm1.InputLen = 0
    MSComm1.CommPort = 1
    MSComm1.Settings = "9600,N,8,1"
    MSComm1.PortOpen = True
    Text1.Text = ""
    Text2.Text = ""
    End Sub

    Private Sub Form_QueryUnload(cancel As Integer, unloadmode As Integer)
    MSComm1.PortOpen = False
    End Sub

    Private Sub MSComm1_OnComm()
    If MSComm1.CommEvent = comEvReceive Then
    wordlow = MSComm1.Input
    End If
    End Sub

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Di che sensore si tratta?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    49
    E' un micrometro, diciamo progettato ad hoc.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    E' un po' difficile risponderti perche':

    1) non e' ben chiaro il problema (non risponde il device? non ricevi correttamente?)

    2) il codice mostrato non e' commentato e non e' indentato (non hai usato neanche i tag [ CODE ] per renderlo leggibile)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    49
    Riposto il codice semplificato e commentato.

    Option Explicit
    Dim startstop As Boolean
    Dim buffer As Integer
    Dim wordlow As String
    Dim a As Integer
    Dim i As Integer
    -
    Private Sub Command1_Click()
    ----MSComm1.Output = Chr$(85) + Chr$(129) + Chr$(129) 'Attivazione sensore
    End Sub
    -
    Private Sub Command3_Click() 'Iterazione di indirizzamento e richiesta trasmissione
    ----startstop = True
    ----i = 0
    ----Do While startstop = True
    --------buffer = MSComm1.InBufferCount 'Utilizzo dell'opzione InBufferCount per _
    _ sospendere la trasmissione fintanto che nel buffer è presente un carattere
    --------Do While buffer = 0
    ------------For a = i To 7 Step 1
    ----------------Select Case a
    ----------------Case 0
    --------------------MSComm1.Output = Chr$(&H0) 'Invio carattere indirizzamento
    --------------------MSComm1.Output = Chr$(&H1) 'Invio carattere indirizzamento
    --------------------MSComm1.Output = Chr$(&H0) 'Invio carattere indirizzamento
    --------------------MSComm1.Output = Chr$(&H2) 'Invio carattere indirizzamento
    --------------------MSComm1.Output = Chr$(&HA) 'Invio carattere indirizzamento
    --------------------MSComm1.Output = Chr$(&H5) 'Invio carattere indirizzamento
    --------------------MSComm1.Output = Chr$(&H2) 'Invio carattere richiesta di trasmis.
    --------------------i = (a + 1)
    ----------------Case 1, 2, 3, 4, 5, 6
    --------------------MSComm1.Output = Chr$(&H2) 'Invio carattere richiesta di trasmis.
    --------------------i = (a + 1)
    ----------------Case 7
    --------------------MSComm1.Output = Chr$(&H2) 'Invio carattere richiesta di trasmis.
    --------------------i = 0
    ----------------End Select
    ----------------Exit For
    ------------Next a
    --------Loop
    ----Loop
    End Sub
    -
    Private Sub Form_Load()
    ----MSComm1.RThreshold = 1
    ----MSComm1.InputLen = 0
    ----MSComm1.CommPort = 1
    ----MSComm1.Settings = "9600,N,8,1"
    ----MSComm1.PortOpen = True
    ----Text1.Text = ""
    ----Text2.Text = ""
    End Sub
    -
    Private Sub Form_QueryUnload(cancel As Integer, unloadmode As Integer)
    ----MSComm1.PortOpen = False
    End Sub
    -
    Private Sub MSComm1_OnComm()
    ----If MSComm1.CommEvent = comEvReceive Then
    --------wordlow = MSComm1.Input 'Copia del carattere ricevuto nella stringa wordlow, _
    _ pulizia del buffer e InBufferCount portato a 0 automaticamente (credo)
    ----End If
    End Sub

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    49
    In sostanza vorrei sapere se c'è un modo generico e "automatico" (iterativo) per tutte le comunicazioni asincrone con rs-232 per poter ricevere i caratteri presenti nella memoria di un dispositivo (ciclicamente e per un tempo infinito) e per far si che il pc (dopo aver indirizzato e richieso la trasmissione del carattere presente in una particolare cella di memoria indirizzata) attenda che il carattere richiesto sia stato ricevuto, letto (e quindi il buffer di ricezione svuotato) prima di indirizzare e richiedere la trasmissione di un carattere presente in un'altra cella di memoria.

    ps: Grazie Oregon per il tempo dedicato

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Utilizzando i soli segnali TX,RX, non esiste alcun modo "automatico" di gestire la comunicazione con la seriale.

    La comunicazione e' completamente asincrona (nel senso che la ricezione avviene senza controllo da parte del programma).

    E' un po' difficile risolvere il problema che hai senza fare le prove specifiche con il device (per questo ti avevo chiesto il tipo ... ).

    In generale, posso dirti che la prima cosa che devi fare e' definire un codice che, dato il comando in output al device, riceva - una sola volta e correttamente - i dati che ti attendi.
    Quindi, scrivi il codice che, senza cicli, effettui "un solo ciclo" di lettura delle informazioni dal device e poi ne riparliamo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    49
    Se il codice fosse:

    Option Explicit
    Dim startstop As Boolean
    Dim buffer As Integer
    Dim wordlow As String
    Dim a As Integer
    Dim i As Integer
    -
    Private Sub Command1_Click()
    ----MSComm1.Output = Chr$(85) + Chr$(129) + Chr$(129) 'Attivazione sensore
    End Sub
    -
    Private Sub Command3_Click()
    ----MSComm1.Output = Chr$(&H0) 'Invio carattere indirizzamento
    ----MSComm1.Output = Chr$(&H1) 'Invio carattere indirizzamento
    ----MSComm1.Output = Chr$(&H0) 'Invio carattere indirizzamento
    ----MSComm1.Output = Chr$(&H2) 'Invio carattere indirizzamento
    ----MSComm1.Output = Chr$(&HA) 'Invio carattere indirizzamento
    ----MSComm1.Output = Chr$(&H5) 'Invio carattere indirizzamento
    ----MSComm1.Output = Chr$(&H2) 'Invio carattere richiesta di trasmis.
    End Sub
    -
    Private Sub Form_Load()
    ----MSComm1.RThreshold = 1
    ----MSComm1.InputLen = 0
    ----MSComm1.CommPort = 1
    ----MSComm1.Settings = "9600,N,8,1"
    ----MSComm1.PortOpen = True
    ----Text1.Text = ""
    ----Text2.Text = ""
    End Sub
    -
    Private Sub Form_QueryUnload(cancel As Integer, unloadmode As Integer)
    ----MSComm1.PortOpen = False
    End Sub
    -
    Private Sub MSComm1_OnComm()
    ----If MSComm1.CommEvent = comEvReceive Then
    --------wordlow = MSComm1.Input
    --------text1.text = wordlow
    ----End If
    End Sub


    ricevo il carattere correttamente e lo visualizzo in text1.
    Quello che vorrei è adesso indirizzare ciclicamente e ripetitivamente tutte le celle di memoria disponibili.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Bene ...

    Adesso ... perche' non inserisci tutti i caratteri di

    ----MSComm1.Output = Chr$(&H0) 'Invio carattere indirizzamento
    ----MSComm1.Output = Chr$(&H1) 'Invio carattere indirizzamento
    ----MSComm1.Output = Chr$(&H0) 'Invio carattere indirizzamento
    ----MSComm1.Output = Chr$(&H2) 'Invio carattere indirizzamento
    ----MSComm1.Output = Chr$(&HA) 'Invio carattere indirizzamento
    ----MSComm1.Output = Chr$(&H5) 'Invio carattere indirizzamento
    ----MSComm1.Output = Chr$(&H2) 'Invio carattere richiesta di trasmis.

    in una sola stringa ?

    E poi ... come si indirizza la prossima cella ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    49
    Ottima idea! Questo renderà sicuramente il codice più leggibile.
    Ora però entriamo nel particolare: lascia che ti spieghi.
    Il sensore, una volta indirizzata la prima cella di memoria, è programmato perchè incrementi l'indice di 1 (per indice in questo caso intendo l'indirizzo della cella indirizzata) in modo tale che non sia più necessario inviare consecutivamente tutti i caratteri che tu hai suggerito di inserire in una stringa ma solamente il carattere relativo alla richiesta di trasmissione del dato (ovvero l'ultimo che compare nella serie: &H02 o &H2). Quindi dopo aver indirizzato e richiesto la trasmissione del primo dato non resterà che richiedere la trasmissione dei dati successivi utilizzando un solo carattere fino a raggiungere l'ultimo indirizzo.
    Quello che vorrei è fare questo ciclicamente e per un tempo infinito.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.