Newsgroup: it.comp.lang.visual-basic
Titolo: MSComm e il buffer che si cancella!

Ciao a tutti,
per impratichirmi volevo costruire un semplice terminale che invia comandi
AT al modem tramite la seriale.
Ho reperito molti esempi (fra cui quello presente sul "sito comune" per il
laser, e quello della MS negli esempi).
Pensavo di aver fatto tutto per bene, ma evidentemente c'è qualcosa che non
ho ancora ben chiaro.
Succede che quando invio, per esempio ATi3, ottengo i caratteri di risposta
del modem che stanno pochissimo sul buffer di input e poi spariscono.
Così succede che devo inviare nuovamente  inviare la stringa col risultato
di avere sempre una risposta differita.
Vi mostro un pezzo del programma in cui faccio l'invio e la ricezione e se
siete interessati metto i sorgenti nel ng binari.
'---------------------------------------------------------------------------
----
Private Sub cmdInvia_Click()
On Error GoTo cmdInvia_Click_Err
Dim strInvia As String
Dim intCount As Integer
'Catturo il testo contenuto in txtOut e lo trasmetto sulla seriale
strInvia = Trim(txtOut.Text) & Chr(13)
Seriale.Output = strInvia
'Conto quanti caratteri sono stati ricevuti
intCount = Seriale.InBufferCount
'Imposto di scaricare i caratteri specificati da intCount
Seriale.InputLen = intCount
RxBuffer = Seriale.Input     '<---------COMANDO INCRIMINATO
                                          ' in seriale.input ho la stringa
(che rimane per poco)
                                          ' RxBuffer non riesce a catturare
il buffer....:-(
'Scrivo il risultato in txtIn
txtIn.SelStart = Len(txtIn)
txtIn.Text = RxBuffer
Exit Sub
cmdInvia_Click_Err:
    If Err = 8018 Then MsgBox "ERRORE: " & Error$ & vbCrLf, vbCritical,
"ERRORE"
End Sub
'---------------------------------------------------------------------------
----
Ringrazio,
                Manrico

 wrote in message 7pcl5h$7i6$1...@nslave1.tin.it...


grazie per avermi risposto tuttavia, il mio problema sembra essere
l'opposto, ossia, effettivamente la stringa mi arriva, ma viene cancellata  prima di essere memorizzata in un mio buffer temporaneo.
 
Forse il file zip che ho mandato nel ng it.binari.visual-basic sarà pubblicato 
e mi piacerebbe fosse provato per vedere se è un problema del modem (non credo) o del programmetto che ho fatto.
 
Purtroppo questo fatto mi sta un po' bloccando e quindi sarei veramente grato a chiunque possa darmi una mano a continuare...

Questo è il ciclo di lettura che io userei.
Function LeggiRisposta() as string
Static Buffer$  'buffer di ricezione in modo da non perdere nulla
Dim x as long
'Piccola Attesa
Doevents
if Seriale.InBufferCount then 'se vi sono carattere allora li legge
    Do
        IF  Seriale.InBufferCount  then
            Buffer$=Buffer$ + Seriale.Input      'accodo tutti i caratteri
nel buffer
            x= instr(Buffer$,vbcr)
             if x then  'se trovo un carattere di CR allora esco dalla
lettura
                    LeggiRisposta= left$(Buffer$,x)
            'salvo eventuali caratteri seguenti per una sucessiva lettura
                    Buffer$=mid(Buffer$,x+1)
                    exit do
             end if
        end if
        doevents 'attesa
    Loop
end if
end function
Il codice lo scritto al volo però a parte qualche errore ortografico
dovrebbe funzionare.
Bye

txtIn.Text = RxBuffer
La ricezione non dovrebbe essere fatta nella stessa procedura di invio in
quanto non è detto che il modem abbia già completato la risposta ma
nell'evento onComm e, per accodare la risposta, dopo aver usato
correttamente txtIn.SelStart = Len(txtIn) devi caricare il buffer con
txtIn.SelText=RxBuffer altrimenti ricopri sempre quanto ricevuto in
precedenza. Così facendo devi però tener conto che dopo alcuni messaggi la
textbox si riempie.

Ho letto e scritto con attenzione il tuo esempio, tuttavia il problema permane....al primo invio i dati ci sono ma si azzerano e scompaiono dal buffer e il bello è che non riesco a memorizzarli in nessuna variabile.
 
Se ti interessa il problema su it.binar.visual-basic ho scaricato i sorgenti zippati (pochissimi k) ai quali potresti dare un'occhiata...
 
Ringrazio,
                    Manrico

Ho scaricato il tuo esempio ed effettivamente esiste qualche problema di
timing (tempo di propagazione dell'informazione) e l'ho risolto cosě:
txtIn.SelStart = Len(txtIn) 'posiziono il corsure a fine textbox
'Catturo il testo contenuto in txtOut e lo trasmetto sulla seriale
strInvia = Trim(txtOut.Text) & Chr$(13)
Seriale.Output = strInvia
'Private Declare Sub Sleep Lib "Kernel32" (ByVal Millisecondi As Long)
Sleep 200 'attendo 200 millisecondi la dichiarazione API č commentata sopra
naturalmente
RxBuffer = Seriale.Input
'Scrivo il risultato in txtIn
txtIn.SelText = RxBuffer 'immetto i caratteri ricevuti
Bye

Ti ringrazio veramente molto ( econ questo ringrazio anche tutti coloro che mi hanno risposto pubblicamente), con quel delay funziona tutto perfettamente....
 
Saluto,
                Manrico