PDA

View Full Version : [VB] COMM Control


leadergl
02-02-2005, 08:00
Ciao ragazzi,
sto cercando di realizzare un applicazione che sfrutti la porta COM per dialogare tramite comandi AT col cellullare e sia in grado di Leggere e Scrivere la rubrica del cellulare...

Sono a buon punto...nel senso che ho:

1) Realizzato Interfaccia Grafica
2) Realizzato Gestione della Lettura dal Cellulare della Rubrica
3) Realizzata Memorizzazione su File della Rubrica Letta
4) Realizzata Lettura da File della Rubrica precedentemente Salvata

Ora quello che mi manda è la scrittua sul cellulare della rubrica...qui ho problemi non tanto per scrivere nel cellulare ma per gestire le pause tra una scrittura ed un altra...poichè se scrivo un solo elemento tutto funziona...se creo un ciclo FOR che mi scriva TUTTI i contatti in rubrica non va più nulla e questo perchè o:

1) Devo far passare un po di tempo tra una scrittura ed un altra (send delay)

OPPURE

2) Devo andare a scrivere un nuovo elemento solo quando ho avuto la risposta di OK dal cellulare...

solo che non riesco a gestire questa cosa....vi posto il mio codice..aiutatemi...:

Private Sub cmdSalvaCell_Click()
Dim iRiga As Integer
Dim stemp As String
Dim iPausa As Long
Dim iTemp As Long

AttivaLettura = False

If MSComm1.PortOpen = True Then

For iRiga = 1 To Griglia.Rows - 2
iTemp = 0
stemp = "AT+MPBW=" & iRiga & ",""" _
& Griglia.TextMatrix(iRiga, 1) & ""","_
& Griglia.TextMatrix(iRiga, 2) & ",""" _
& Griglia.TextMatrix(iRiga, 3) & """," _
& Griglia.TextMatrix(iRiga, 4)
MSComm1.Output = stemp + Chr(13)
Next iRiga

MsgBox "Memorizzazione Rubrica Completata", vbInformation, "Memorizzazione"
End If
End Sub


Private Sub MSComm1_OnComm()
'Dichiara la Variabile dove convervare i pacchetti dati
Static sIncoming As String

'Quando Sto ricevendo dei dati faccio questo:
If MSComm1.CommEvent = comEvReceive Then
'Aggiungo il carattere letto alla stringa sIncoming
sIncoming = sIncoming & MSComm1.Input
'Dipende dal carattere con cui termina la nostra stringa
If Right(sIncoming, 2) = vbCrLf Then
'Esclude il carattere CrLf dalla stringa
sIncoming = Left(sIncoming, Len(sIncoming) - 2)

'Carico la procedura per elaborare i dati Letti
Call Elabora(sIncoming)

'Pulisce la variabile
sIncoming = ""
End If
End If
End Sub

leadergl
02-02-2005, 10:03
ho provato anche ad inserire un Timer che mi fa da temporizzatore in questo modo:

1) Nella procedura per scrivere la rubrica dopo aver inviato il comando al MsCOMM Controll ho posto a FALSE una variabile booleana

2) Riattivo la variabile booleana all'interno del Timer

Ho ovviamente aggiunto del codice alla procedura per scrivere in modo che invii il comando SOLO se la variabile booleana è TRUE...ho quindi impostato il Timer ad un intervallo di 300ms...

Solo che non funziona...va in loop continuo poichè durante il ciclo FOR il Timer "non si attiva"...nonstante precedentemente fosse attivo e funzionante...e quindi la booleana non cambia il suo stato e tutto si blocca....

Come posso fare? Help?

matpez
02-02-2005, 10:04
Dipende dal tuo cellulare, nn so se ti risponde OK tutte le volte che scrivi, se lo fa allora devi aspettare l'OK, altrimenti puoi mettere un delay da codice vb che ti rappenti di qlc millisecondo il tuo trasferimento

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sleep 200 '0.2 secondi


E già che ci sei metti un DoEvents appena sotto il tuo For , prima della riga iTemp = 0

leadergl
02-02-2005, 10:08
Ah...speravo fossi tu a rispondermi, in fin dei conti sei tu che mi hai insegnato quello che so del VB, cmq..

1) Si il cellulare ogni volta che scrivo mi restituisce l'OK o l'ERROR
2) Ho provato ad inserire lo Sleep solo che non so xkè l'applicazione funziona male...e cmq non mi scrive bene...

Mentre non ho provato ad inserire anche il "Do Events" che mi permette di fare se associato allo Sleep?


P.S. in rete ho trovato un programma "ATScan" che fa funzionare bene la cosa...ed in pratica aspetta la risposta di OK dal cellulare...come posso fare?

matpez
02-02-2005, 10:23
Bhe allora devi tenere sotto controllo il buffer della com, così quando tu incomincia a scrivere lanci il timer (per esempio settato a 100) e monitori il buffer! Quando ti torna OK dal cell allora tu vai a vanti a scrivere nel cell!

cmq io la funzione spleep la metterei ugualmente e fare un ciclo for di questo tipo, poi dopo vedi tu se lo devi modificare!


For ...
DoEvents
.
.
.
.
Sleep 200
Next

leadergl
02-02-2005, 10:59
Originariamente inviato da matpez
Bhe allora devi tenere sotto controllo il buffer della com, così quando tu incomincia a scrivere lanci il timer (per esempio settato a 100) e monitori il buffer! Quando ti torna OK dal cell allora tu vai a vanti a scrivere nel cell!
...[/CODE]


Ma la risposta di OK non mi arriva fin nella procedura di cancellazione poichè il tutto avviene nell'evento del MsCOMM...oltre ad aggiungere lo:

DoEvents
...
Sleep(x)

che mi consigli di fare?

leadergl
02-02-2005, 14:18
Ok, allora o provato a rimanere sulla stessa strada di prima, ovvero col Timer ed ho però inserito il DoEvents subito dopo il FOR ed in questo modo il timer si attiva....ho provato con vari tempi di intervalli del Timer da 200, 250, 300, 400, 500 ma anche a 500ms, seppur avendo notevoli miglioramenti, non tutto viene scritto....su 129 voci della rubrica circa 10 non vengono scritte ed sempre una decina non vengono cancellate quando facciola cancellazione totale....

Non ci sto capendo più molto...help

leadergl
02-02-2005, 19:58
...aiuto...

se volete vi allego i sorgenti del programmino...se può essere di aiuto a risolvere il problema...

leadergl
03-02-2005, 09:45
Ok,
ho risolto il problema facendogli attendere l'OK del controllo MSCOMM, ovviamente ho aggiunto che nel caso la risposta sia "ERROR" faccio mostrare una MsgBox che indica la mancata scrittura di quell'elemento ;)

leadergl
03-02-2005, 14:07
...mi servirebbe una info...

come faccio a far rilevare automaticamente le porte com disponibili?

tipo in HyperTerminal di WinXP, lui automaticamente rileva se la porta com 13 è disponibile e la visualizza nell'elenco...mentre se stacco l'apparecchio lui la toglie dalla lista....

come si fa?

leadergl
05-02-2005, 20:09
nessuno sa aiutarmi?

matpez
06-02-2005, 02:56
:gluglu: :ubriachi: :winner: :Puke: