PDA

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?

matpez
29-11-2004, 21:03
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?

matpez
29-11-2004, 22:21
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

matpez
29-11-2004, 22:40
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!!

matpez
29-11-2004, 22:42
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.

matpez
30-11-2004, 08:47
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! ;)

matpez
30-11-2004, 19:40
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 :(

matpez
30-11-2004, 22:41
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?

matpez
02-12-2004, 20:23
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:

matpez
03-12-2004, 13:05
ah nn esagerare :p

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<

matpez
03-12-2004, 18:07
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 :)

matpez
05-12-2004, 23:23
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.

matpez
06-12-2004, 07:47
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" :)

matpez
06-12-2004, 20:27
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 :)

matpez
06-12-2004, 22:29
Sai che nel tempo libero quando posso rispondo al formu soprattutto per quanto riguarda VB6

Se serve una mano scrivi... ehehehe :p