View Full Version : [vb6] ci provo in visual basic...
RaouL_BennetH
29-11-2004, 12:57
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "19200,n,8,1"
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm()
Dim Ricevi
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(App.Path & "\Archivio.txt") Then
fso.CreateTextFile App.Path & "\Archivio.txt"
Set f = fso.OpenTextFile(App.Path & "\Archivio.txt", 2)
Else
Set f = fso.OpenTextFile(App.Path & "\Archivio.txt", 8)
End If
Ricevi = MSComm1.Input
f.Write Ricevi & Now
f.Close
sSave = ""
End Sub
Con questo codice riesco a catturare su un file di testo l'input dalla seriale, aggiungendoci l'ora esatta del passaggio del badge ma.....
la formattazione non la capisco :(
Mi ripete più di una volta la data, così:
CODICE LETTO29/11/2004 13.49.44 ->0001<-
29/11/2004 13.49.44
0001 è il codice del badge.... come posso evitare la ripetizione della data?
scusami... ma da dove ti arrivano questi dati?
Molto probabilmente lui ti fa due passaggi e tu li intercetti tutti e due, così quando scrivi il file lui ti mette due volte...secondo me devi organizzarti in un altro modo!
Inanzitutto prova a vedere quanti passaggi fa, ma secondo me sono davvero 2!
RaouL_BennetH
29-11-2004, 21:55
Originariamente inviato da matpez
scusami... ma da dove ti arrivano questi dati?
Molto probabilmente lui ti fa due passaggi e tu li intercetti tutti e due, così quando scrivi il file lui ti mette due volte...secondo me devi organizzarti in un altro modo!
Inanzitutto prova a vedere quanti passaggi fa, ma secondo me sono davvero 2!
Ciao e grazie per la risposta.
Ti dico cosa vedo a video ad esempio da hyper terminal:
CODICE LETTO -> 0001 <-
Quindi, forse potrebbero essere realmente due passate..
Per altro modo di organizzarmi, cosa mi suggerisci visto che sono a zero?
Prova ad impostare la proprietà RThreshold = 0 e riprova così com'è il codice!
Fammi sapere se ci sono cambiamenti! :)
RaouL_BennetH
29-11-2004, 22:24
vi riporto una delle specifiche di questo lettore:
"L'invio e la ricezione dei dati avviene tramite porta seriale utilizzando un baud rate di 19200 bit/sec con codifica 8-N-1 senza utilizzare alcun controllo di flusso. Inoltre, per ricevere i comandi e per inviare le proprie risposte, il sistema utilizza sempre dei caratteri MAIUSCOLI in formato ASCII e alla fine delle risposte aggiunge i caratteri speciali A CAPO e INVIO (valore numerico decimale 13 e 10) per indicare la fine delle stringhe.
All'accensione il sistema invia la stringa SYSTEM STARTUP ad indicare che è in corso l'inizializzazione. QUando il circuito invia la stringa "CODICE LETTO ->x<- in cui al posto della x vi sono i byte del codice; i caratteri "->" e "<-" sono stati inseriti per facilitare al software il compito di riconoscere il codice all'interno della risposta."
Forse è questo il problema.....
:muro:
RaouL_BennetH
29-11-2004, 22:26
Originariamente inviato da matpez
Prova ad impostare la proprietà RThreshold = 0 e riprova così com'è il codice!
Fammi sapere se ci sono cambiamenti! :)
Impostando il valore di RThreshold a 0, mi scrive sul file solo data e ora.
RaouL_BennetH
29-11-2004, 22:37
uhm, per fare una prova, ho provato ad inserire dei caratteri per vedere quante volte me li ripeteva:
f.write Ricevi & "O_O" & Now
ed ecco il risultato:
CODICEO_O29/11/2004 23.36.06 LETTO -O_O29/11/2004 23.36.06>0001<-
O_O29/11/2004 23.36.06O_O29/11/2004 23.36.06
Prova a fare una cosa del genere:
Private Sub MSComm1_OnComm()
Dim str As String
MSComm1.InputLen = 0
If MSComm1.InBufferCount Then
Text1 = Text1 & MSComm1.Input
End If
End Sub
Metti un breack point dentro all'IF e vedi quante volte passa ed il valore di Input ...
Cmq il trucco è facile, devi catturare tutte le stringe e separare al vbcrlf che sarebbe appunto il tuo catattere 10 e 13
Ora vado a dormire, domani prova, poi fammi sapere!
Ciaoooooooooooooooooooooooooooo!!
PS: metti la proprietà Multiline della textbox=true , così vedi anche dove va a capo ... poi copia quello che ti mette dentro alla textbox e incollalo qui, magari ho + chiaro cosa quell'apparecchio ti passa!!
RaouL_BennetH
29-11-2004, 23:00
senza cercare di fargli scrivere anche l'ora ottengo questo:
CODICE LETTO ->0001<-
premetto però, che davanti a "CODICE" ci sono due quadratini neri.
Questo invece è ciò che ottengo se cerco di fargli scrivere anche l'ora:
CODICE29/11/2004 23.59.53 LETTO -29/11/2004 23.59.53>0001<-
29/11/2004 23.59.53
29/11/2004 23.59.53
anche qui, ci sono dei quadratini ma col copia-incolla non vengono.
Credo di avere visto cosa serve, io adesso sono a lavoro, stasera arrivo a casa per le 19 e vedo di prepararti un esempietto, che spero che funzioni dato che nn lo posso provare!
Magari te lo mando dopo cena... spero che tu nn abbia fretta! ;)
Come promesso ti ho fatto un esempio...prova ad utilizzare il mio e fammi sapere se ti crea il vettore con i codici!
Al massimo ci facciamo qlc modifica!
RaouL_BennetH
30-11-2004, 22:24
Originariamente inviato da matpez
Come promesso ti ho fatto un esempio...prova ad utilizzare il mio e fammi sapere se ti crea il vettore con i codici!
Al massimo ci facciamo qlc modifica!
Matpez, grazie millissimo :) :ave:
Però..... a dir la verità, non ti so dire se funziona o meno perchè non riesco a vedere l'output :(
Così dovresti vedere anche l'output... :oink:
Buona notte :)
PS: cmq dovresti lavorare un po' con i break point, così ti facili la vita! :p
RaouL_BennetH
30-11-2004, 22:47
uhm, no, non mi da nessun output :(
Beh, ci lavoro su stasera poi domani ti so dire.
Grazie davvero tanto!
RaouL.
RaouL_BennetH
02-12-2004, 09:03
>EDITED<
RaouL_BennetH
02-12-2004, 11:26
forse....
Option Explicit
Dim sLettura As String
Dim sCodice() As String
Private Sub Form_Load()
ReDim sCodice(0)
MSComm1.CommPort = 1
MSComm1.Settings = "19200,n,8,1"
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False
End Sub
Private Sub MSComm1_OnComm()
Dim sAux As String
MSComm1.InputLen = 0
If MSComm1.InBufferCount Then
sLettura = sLettura & MSComm1.Input
'prendo tutta la stringa passata fino a quando non arriva il carettere di fine stringa
If InStr(sAux, Chr$(13)) >= 0 Then
Call EstraiCodice
'sLettura = ""
End If
End If
End Sub
Private Sub EstraiCodice()
Dim nPos(2) As Integer
Dim sCodiceAux As String
'prendo la posizione dentro alla stringa del -> e del <-
nPos(1) = InStr(sLettura, "->")
nPos(2) = InStr(sLettura, "<-")
'controllo che ci sia realmente il codice dentro alla stringa
If nPos(1) > 0 And nPos(2) > 0 Then
nPos(1) = nPos(1) + 2
sCodiceAux = Mid(sLettura, nPos(1), nPos(2) - nPos(1))
Open App.Path & "\archivio.txt" For Append As #1
Write #1, sCodiceAux, Now; w
Close #1
'lo inserisco nel vettore
ReDim Preserve sCodice(UBound(sCodice) + 1)
sCodice(UBound(sCodice)) = sCodiceAux
'Text1 = Text1 & sCodiceAux & vbCrLf
End If
End Sub
questo è il codice un pò modificato che mi ha passato l'ottimo matpez.
Direi che ci sono quasi, devo solo capire perchè all'interno del file, mi scrive due volte la stessa cosa.
RaouL_BennetH
02-12-2004, 12:11
finalmente!!!! :winner:
Option Explicit
Dim sLettura As String
Dim sCodice() As String
Private Sub Form_Load()
ReDim sCodice(0)
MSComm1.CommPort = 1
MSComm1.Settings = "19200,n,8,1"
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False
End Sub
Private Sub MSComm1_OnComm()
Dim sAux As String
MSComm1.InputLen = 0
If MSComm1.InBufferCount Then
'prendo tutta la stringa passata fino a quando non arriva il carettere di fine stringa
If InStr(sAux, Chr$(13)) >= 0 Then
Call EstraiCodice
sLettura = sLettura & MSComm1.Input
End If
End If
End Sub
Private Sub EstraiCodice()
Dim nPos(2) As Integer
Dim sCodiceAux As String
'prendo la posizione dentro alla stringa del -> e del <-
nPos(1) = InStr(sLettura, "->")
nPos(2) = InStr(sLettura, "<-")
'controllo che ci sia realmente il codice dentro alla stringa
If nPos(1) > 0 And nPos(2) > 0 Then
nPos(1) = nPos(1) + 2
sCodiceAux = Mid(sLettura, nPos(1), nPos(2) - nPos(1))
Open App.Path & "\archivio.txt" For Append As #1
Write #1, sCodiceAux, Now
Close #1
'lo inserisco nel vettore
ReDim Preserve sCodice(UBound(sCodice) + 1)
sCodice(UBound(sCodice)) = sCodiceAux
End If
End Sub
RaouL_BennetH
02-12-2004, 12:40
Bene, ora volevo complicarmi un pò la vita per fare questo:
Se anzichè scrivere in un file di testo, volessi fare in modo che il valore di sCodiceAux (ad esempio "0001") ed il valore di Now (che è l'ora e la data corrente) venissero scritti in un db access, magari in una tabella con questi campi "Codice" e "Orario", sarebbe molto complesso?
La connessione ad un db access la so fare, solo che non ho mai provato a scrivere dati direttamente in questo modo. Mi aiutate?
Servito su un piatto d'argento... :p
RaouL_BennetH
03-12-2004, 10:21
Matpez, ti ringrazio ancora una volta tantissimo :)
Solo che l'esempio che mi hai messo a disposizione, mi ha confuso tantissimo :( (colpa mia ovviamente)
Il fatto è che non vorrei inserire i dati manualmente nel db, ma vorrei che quello che viene catturato dalla porta seriale, venisse memorizzato nel db. Ora sto facendo un pò di prove, stasera se non riesco te le posto.
Grazie un milione :D
RaouL_BennetH
03-12-2004, 10:51
questa connessione al db mi da errore:
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & App.Path & "\timbrature.mdb"
RaouL_BennetH
03-12-2004, 11:16
trovato l'errore per la connessione, era solo un errore di sintassi.
RaouL_BennetH
03-12-2004, 11:46
Perfetto :D
Ora riesco a scrivere i dati catturati direttamente nel database!!
Matpez, sei un grande!!! :ave:
RaouL_BennetH
03-12-2004, 15:01
hai da darmi qualche dritta sul metodo "AddItem" della flexgrid?
Ti spiego a che punto sono arrivato e quello che vorrei fare:
Riesco ad inserire i dati che provengono dalla porta seriale nel database.
Ora, la tabella del database è composta da due soli campi.
Avevo pensato di popolare una flexgrid con il contenuto della tabella del database. Leggendo su msdn, avevo inteso che mi bastasse fare una cosa tipo:
myflexgrid.AddItem myflexgrid.nome_campo & vbtab & myflexgrid.nome_altro_campo & vbtab
Ma andando di break point, quando ci arrivo, mi da un errore di "Qualificatore non valido".
In questo pezzo di codice, la connessione al database è ancora aperta e i dati della seriale sono appena stati catturati.
Qualche suggerimento?
RaouL_BennetH
03-12-2004, 15:53
okiz, risolto anche questo :)
appena ho finito e ordino un pò meglio il tutto, posto il risultato delle cose che ho fatto.
RaouL_BennetH
03-12-2004, 16:13
uhm, ho cantato vittoria troppo presto :(
Mi sono accorto di una cosa:
Mentre l'applicazione è aperta, se passo un badge che ha un codice diverso dal primo che ho passato mentre l'applicazione è in esecuzione, mi memorizza sempre il codice del primo badge che ho passato. Per fargli memorizzare il codice di altre schede, devo chiudere e riavviare l'applicazione :(
>EDIT<
Mica mi è molto chiaro sai... :confused:
RaouL_BennetH
04-12-2004, 11:06
Originariamente inviato da matpez
Mica mi è molto chiaro sai... :confused:
Allora, io posseggo 20 badge, che sono stati programmati con codice che vanno da 0001 a 0020.
Bene, se passo un badge, ad esempio con codice 0002, lui lo legge, lo memorizza nel database e nel file di testo.
Ad applicazione ancora aperta, se passo il badge con codice 0018, l'applicazione mi legge di nuovo il codice 0002. Cioè, per fargli leggere un nuovo badge, devo chiudere e riavviare l'applicazione. In pratica, mi legge (ad applicazione aperta) solo il codice del primo badge inserito e lo ripete anche per i badge successivi che passo nel lettore.
Se invece gli faccio leggere i badge da Hyper Terminal per esempio, li legge tutti correttamente come glieli passo. :cry:
RaouL_BennetH
04-12-2004, 14:08
:D :D :D
Ora posso cantare vittoria :winner:
Funziona!!
Ora mi legge correttamente tutti i badge che inserisco. :)
RaouL_BennetH
04-12-2004, 14:39
ora, ho un altro problemino da affrontare, e cioè, la ricerca nel database per codice. Esempio:
Vorrei fare in modo che, se richiedo il codice "0015", mi restituisca quante volte ha marcato.
ho provato a fare la query con "SELECT * FROM mydb WHERE CODICE = 0015", ma non me la esegue :(
RaouL_BennetH
04-12-2004, 23:38
con questo codice:
Private Sub Form_Load()
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; Data Source=" & App.Path & "\timbrature.mdb" & vbCrLf
cn.Open
rsql = ""
rsql = rsql & "SELECT *" & vbCrLf
rsql = rsql & "FROM tblpresenze" & vbCrLf
rsql = rsql & "ORDER BY codmar" & vbCrLf
Set rs = cn.Execute(rsql)
flex2.Cols = 1
flex2.Rows = 1
flex2.ColWidth(0) = 1290
flex2.Text = "CODICE LETTO"
flex2.Cols = 2
flex2.Rows = 1
flex2.ColWidth(1) = 3000
flex2.Text = "ORARIO MARCATURA"
While Not (rs.EOF)
flex2.AddItem rs("codmar") & vbTab & rs("marcatura")
rs.MoveNext
Wend
End Sub
Riesco a vedere nella flexgrid i dati contenuti nel database.
Ho cercato di fare una funzione che invece mi permettesse di scegliere io quali campi visualizzarmi, ma non riesco a passare la stringa che digito in una textbox alla query :muro:
RaouL_BennetH
05-12-2004, 00:23
ok, risolto anche questo :)
vedo che durante la mia assenza hai fatto un po' di cose e risolte altrettante!! ehhehe :p
Io nn potevo risponderti, avevo la tipa a casa mia, e non è molto contenta se la trascuro per stare al pc :oink:
RaouL_BennetH
06-12-2004, 00:16
Originariamente inviato da matpez
vedo che durante la mia assenza hai fatto un po' di cose e risolte altrettante!! ehhehe :p
Io nn potevo risponderti, avevo la tipa a casa mia, e non è molto contenta se la trascuro per stare al pc :oink:
ah, tranqui :D
adesso i piccoli progressi che ho fatto li ho "fermati". Ci ho sbattuto la testa ma li ho capiti (spero) :)
Domani, pulisco un pò il codice e poi ti posto il progettino per intero, cosi, se ti va, ci dai uno sguardo. Mi farebbe piacere.
Non finirò mai comunque di ringraziarti!!
RaouL.
Volentieri, così quando arrivo a casa stasera ci do un occhiata :)
A dopo :p
RaouL_BennetH
06-12-2004, 18:54
Originariamente inviato da matpez
Volentieri, così quando arrivo a casa stasera ci do un occhiata :)
A dopo :p
Prima non ho potuto farlo :(
Scusa il ritardo, ti allego il mio progettino, ma proprio "ino" "ino" :)
Eccomi, il tuo progetto è fatto bene, nn ci sono ottimizzazioni da fare, tranne che nella form 1 non ti conviene aprire la connnessione al database tutte le volte che passa dalla sub EstraiCodice, falla una volta all'inizio e poi alla chiusura della form tanto c'era già il controllo che se era aperta la chiude :D
Complimenti :)
RaouL_BennetH
06-12-2004, 20:45
Originariamente inviato da matpez
Eccomi, il tuo progetto è fatto bene, nn ci sono ottimizzazioni da fare, tranne che nella form 1 non ti conviene aprire la connnessione al database tutte le volte che passa dalla sub EstraiCodice, falla una volta all'inizio e poi alla chiusura della form tanto c'era già il controllo che se era aperta la chiude :D
Complimenti :)
:eek:
Complimenti?? a me??
ma se al 90% è roba tua :D
cmq, grazie mille ancora :)
Sai che nel tempo libero quando posso rispondo al formu soprattutto per quanto riguarda VB6
Se serve una mano scrivi... ehehehe :p
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.