Newsgroup: it.comp.lang.visual-basic
Titolo: MsComm e evento OnComm...

Ciao a Tutti!
Stavo cercando di fare leggere un codice a barre da un apposito lettore
collegato al computer. Il mio programma dovrebbe ricavare il codice per poi
effettuare un accesso al database da dove ricavare i dati.
Dato che il lettore è collegato al PC tramite porta seriale (su COM4, per
l'esattezza), utilizzo il componente Microsoft Comm Control.
A tal proposito, dopo averlo inserito nella form, eseguo le seguenti
istruzioni:
Sub Form_Load()
    MSComm1.CommPort = 3 'Prende in considerazione COM4
    MSComm1.Settings = "9600,N,8,1" 'Settaggi di porta
    MSComm1.PortOpen = True 'apro la porta
end sub
Ora, se non ho capito male, quando faccio leggere un codice a barre dal
lettore, questo mi invia il segnale alla porta. Visual Basic dovrebbe far
intervenire l'evento ONComm di MsComm1. Ciò non avviene!!!!!
Con un altro programma ho provato il lettore e funziona correttamente,
quindi non è un problema di drivers o simili.
in pratica.. sono io che sono imbranato!!!
Help me OUT!!
Ciao e grazie.
--------------------------------
Inviato via 
http://usenet.libero.it

Io è da tempo che uso il componente Comm, ma non ho mai utilizzato l'evento
normalmente metto un timer che controlla se sono arrivati dei dati sulla
porta seriale e funziona benissimo
Esempio
sub Timer1_tick()
    static Buffer as string
    ' Controlla se ci sono caratteri in seriale
   If Comm1.InBufferCount <> 0 Then
        ' Ci sono dei dati, li accodo nel buffer
        buffer = buffer + Comm1.input
        ' Controllo se c'è un dato che mi server (Il controllo può essere
più vario)
        if instr(1,buffer,"Codice:") <> 0 then
            ' Ok mi è arrivato un codice
            ' resetto il buffer o cancellandolo tutto o eliminando la parte
processata, in modo da non perdermi ulteriori altri dati a metà
        endif
   endif
end sub

 avviene!!!!!
Abbassa RThreshold a 1, e verifica se non serve un handshaking. Nel dubbio,
provali tutti e 4.
Ciao
Alberto
-- 
Rigore è quando arbitro fischia

 intervenire l'evento ONComm di MsComm1. Ciň non avviene!!!!!
se operi quei settaggi l'onComm avviene ad esempio quando il buffer arriva a
124 caratteri...
Ci ho appena sbattuto la testa... metti al posto di 124 la tua lunghezza, e
vedrai che l'onComm
magicamente funge
Olix

Ce l'ho fatta! Mi è bastato impostare le proprietà Rthreshold e Inputlen!
Grazie mille a tutti! Per noi novelli programmatori, questo NewsGroup è ORO!
Siete grandi!
Alla prossima!


 magicamente funge
Finchč non arriva un pacchetto errato, e bum che non funziona piů niente, se
non gestisci i caratteri spurri ad inizio stringa.
Non fidarti cosě ciecamente di RThreshold.
La gestione deve andare anche con RThreshold=1, poi se vuoi alzarlo vedi tu.
Alberto

 niente, se non gestisci i caratteri spurri
Ehm...
'spurii'
Alberto


Confermo assolutamente
ciaociao

La gestione deve andare anche con RThreshold=1, poi se vuoi alzarlo vedi
tu.
Io lo imposto a 124 perkč ho il sorgente anche dell'apparecchiatura che sto
interfacciando... E' di produzione aziendale, testa e ritestata.
Nel mio caso effettuo l'allineamento ad inizio del mio programma, un volta
allineato vado da dio :)...
Ma solo xkč l'hardware č fatto da noi, so cosa fa... Quindi in effetti hai
ragione tu, deve gestire i caratteri spurii quando non sai che piffero ti
mandano...
Io non ho potuto avviare un thread xkč quello di VB6 č penoso, e il tempo
per creare Dll in VC non ce l'ho... Indi per cui, dovendo gestire una
grafica a video, leggo il buffer quando č completo e basta...
Se hai suggerimenti volentirei, io sono un novellino. 22 anni e programmo da
3 mesi in modo continuo.. (perň ho cominciato a smanettare con Pascal e c a
14 anni :-) )
Grazie ciao :-)

 volta allineato vado da dio :)...
Scrivi che accetti i consigli.
E allora inizia accettando quello che ti ho detto.
Con la tua strategia, basta che uno appoggi un cellulare vicino al cavo
seriale, e se, per sfiga, questo genera un singolo carattere sulla porta, il
tuo sistema non va piů.
Ma non per un singolo colpo, non va proprio piů finchč non riavvii
l'applicativo o finchč non chiudi la porta.
Sinceramente, non mi sembra il modo corretto di operare.
E, soprattutto, non mi sembra una cosa da consigliare.
Ciao
Alberto

[cut]
anchio uso hardware testato e stratestato, ma se l'elettrico di turno ti
passa il cavo (magari non schermato) vicino a una linea elettrica, o
qualcuno usa un cellulare vicino, o il gruppo di continuità fa i capricci
(tutte cose che mi sono capitate), va tutto a pu....e!
Fai come ha detto Albe e vai tranquillo
ciaociao


prima non lo facevo, se staccavo il cavo dopo 4 secondi si riallineava...
Ciao e rigrazie :-)

 riallineava...
4 secondi è un tempo immenso, almeno per molte applicazioni.
Mettiamola così: stai usando una strategia che va bene per la tua app e con
la tua periferica, ma che richiederà grossi ritocchi per altre applicazioni.
Potevi, invece, agire diversamente e realizzarti le tue funzioncine a valore
'universale'.


Ciao a tutti...
Sono di nuovo incasinato.. sto tirando giu uno ad uno i santi dal cielo...
Questo è quanto ho fatto:
Private Sub MSComm1_OnComm()
    Text1.Text = Text1.Text + ReadComm
End Sub
..e tutto funziona.
ReadComm è una Funzione che legge dal buffer e mi restituisce quel che ho
ricevuto, dopo averlo correttamente interpretato.
Continuo ad aggiungere a text1 perchè non so quanti caratteri mi vengono
inviati (dipende dalla lunghezza del codice a barre e non lo posso sapere!)
Decido di definire una variabile nelle dichiarazioni generali della form, di
tipo Boolean, da utilizzare come flag per sapere quando svuotare il
contenuto di Text1.
NON CI RIESCO!
Anche solo ad aggiungere una riga alla procedura OnComm, non funziona più
niente! Non legge il codice!
Per prova ho fatto cosi:
Private Sub MSComm1_OnComm()
    Text1.Text = Text1.Text + ReadComm
    Controllo = False
End Sub
Non faccio niente di particolare, setto solo la variabile già definita a
false. Eppure non viene piu letto quel che mi arriva alla porta!!
Cosa faccio?
HEEEEELPP!


 HEEEEELPP!
mi sembra impossibile..... posta il codice di ReadComm

Function ReadComm() As String
Dim Buffer As Variant
Dim y, T As Integer
Dim Ch, Code As String
Buffer = Comm1.Input
x = StrConv(Buffer, vbUnicode)
For T = 1 To Len(x)
   Ch = Mid(x, T, 1)
   If Ch >= " " Then
      Code = Code + Ch
   End If
Next
ReadComm = Code
End Function
Grazie anticipatamente per l'aiuto


 Buffer = Comm1.Input
Ma il controllo non si chiamava MSComm1?
Hai messo Option Explicit in alto?
Alberto

 End Function
Qua sembra corretto (a parte l'if con il >= che non mi è molto chiaro)...
non è che stai facendo un debug?
Se con il mouse passi sopra Comm1.Input e ne vedi il contenuto hai già
svuotato il buffer di ricezione, quindi poi non vedrai più nulla