Newsgroup: it.comp.appl.access
Titolo: Access e interfaccia Seriale

Ciao a tutti, volevo porre un quesito: Access puo' ricevere un file dalla
seriale (COM1) e inserirlo in una tabella? Con VBA si puo' fare qualcosa?

 seriale (COM1) e inserirlo in una tabella? Con VBA si puo' fare qualcosa?
Si'.
Ad esempio usando un lettore di codici a barre.
Sib


Proprio in questi giorni ho provato a raccogliere dati da seriale
inviati da una penna ottica + calamaio di comunicazione con PC.
La soluzione che ho adottato č stata quella di utilizzare un piccolo
file .exe scritto in basic che gestisse la porta seriale e la
ricezione di dati salvandoli in un .txt. 
Lancio questo programmino da una maschera di Access e poi, quando
termina, importo  in una tabella i dati del file .txt generato.
Non č molto elegante come soluzione, perchč anche a me, come a Mario
Zecchin che ha aperto questo thread, sarebbe piaciuto fare tutto
attraverso VBA, ma purtroppo non sono riuscito.
Sono sicuro che tu sei in grado di darci qualche dritta, almeno spero,
perchč per mio scrupolo cerco sempre di migliorare quel che faccio,
anche se non č detto che sempre ci riesca!
Diversamente mi dovrň accontentare di quel che ho fatto io in modo
molto piů rozzo ( anche se funzionale ).
Comunque, tornando alla domanda di Mario, se interessa posso inviare
le poche righe di Basic necessarie per creare il .exe che per ricevere
dati da seriale. Credo che poi debba essere modificato alla bisogna.
DavideR
-----------------------------------------------------
Togli NOSPAM dall'indirizzo per contattarmi in e-mail
-----------------------------------------------------


Per leggere i codici a barre, senza starsi ad inventare cose strane in
programmazione, hanno da anni inventato lettori barcode in emulazione di
tastiera.
In genere, si collegano tra la tastiera e il PC (facendo attenzione alla
presa PS/2 o no) e si comportano esattamente come se ci fosse qualcuno che
digita il codice, numerico o alfanumerico, sulla tastiera.
Quasi tutti quelli che ho potuto provare hanno inoltre la possibilità di
aggiungere eventuali codici tastiera in coda (ad es. un TAB o un INVIO)
dando così la possibilità di passare al controllo successivo, attivando gli
eventi inseriti su Prima di Aggiornare, Dopo Aggiornamento, ecc. ecc.
I + professionali hanno anche una loro programmabilità.
Ciao
Silvio

Silvio


 alla COM1, raccolte in un file su PC.
In realtà esistono lettori con calamai che con una ulteriore interfaccina
diventano in emulazione di tastiera.
E ti togli il problema.
Silvio



 alla COM1, raccolte in un file su PC.
In realtà esistono lettori dotati di una loro memoria indipendente che si
collegano a calamai che con una ulteriore interfaccina diventano in


attraverso VBA, ma purtroppo non sono riuscito.
...............[cut]
puoi utilizzare degli ocx all'interno di una
maschera access. Io per esempio ho comprato
via internet la licenza per EasyIO Control
http://members.aol.com/easyio/home.html
che costa pochissimo sulle 100k mi pare,
oppure se hai il VISUAL BASIC,
dovresti avere l'activex della M$ MsComm.
Sono semplici da usare e programmare specie se
il dialogo e' unilaterale.
Bye :O)




Scusate l'inutile ripetizione dovuta ad un problema con il POP.
Silvio

>>Bye :O)


 dal buffer di memoria trasferirli in una semplice tabella?"
Dunque. Per quanto ne so il tutto si può fare tramite le API di windows. Ho
realizzato con il mitico Access 2.0 un server multilinea (e relativi client)
che gestiscono a basso livello i modem, ovviamente vedendoli come COM. La
sostanza del discorso è aprire le COM e, a tempi regolari (se fossimo in C
lavoreremmo in modo diverso) controllare se è arrivato qualcosa e
scaricarlo. Se nella stringa scaricata c'è il o i caratteri di terminazione,
ti fermi.
Per le API a 32 bit dovrei guardare meglio, comunque ti posto alcuni stralci
di codice (a 16 bit!):
Può darsi che ci sia qualche problema, poichè ho eliminato parecchio codice
delle routine originali (codice non necessario per la lettura/scrittura
sulle COM, gestiva altre funzioni)
' --------------------------------------------------------------------------
--------------------------------------
Option Compare Database   'Utilizza il tipo di ordinamento del database per
i confronti fra stringhe
Option Explicit
' Alloca memoria per una struttura DCB
Type DCB
    Stringa As String * 200
End Type
' API di Windows
Declare Function OpenComm Lib "User" (ByVal lpComName$, ByVal wInQueue%,
ByVal wOutQueue%) As Integer
Declare Function Closecomm Lib "User" (ByVal nCid%) As Integer
Declare Function WriteComm Lib "User" (ByVal nCid%, ByVal lpBuf$, ByVal
nSize%) As Integer
Declare Function ReadComm Lib "User" (ByVal nCid As Integer, ByVal lpBuf As
String, ByVal nSize As Integer) As Integer
Declare Function BuildCommDCB Lib "User" (ByVal lpDef As String, lpDCB As
DCB) As Integer
Declare Function SetCommState Lib "User" (lpDCB As DCB) As Integer
Function LeggiCom ()
    On Error GoTo Err_LeggiCom
    Dim RetVal As Integer
    Dim ToLeggi As String * 255
    ToLeggi = Space(255)
    ' Fase di LETTURA
    RetVal = ReadComm(LineeSet.Handle, ToLeggi, 255)
    If RetVal < 0 Then
        Notifica "Errore di ReadComm n° " + Str(RetVal)
        LeggiCom = Null
        Exit Function
    End If
    LeggiCom = Left(ToLeggi, RetVal)
    ' Gestione errori
    Exit Function
Err_LeggiCom:
    If MsgBox(Error$, 21, "Errore Imprevisto") = 4 Then
        Resume Next
    Else
        DoCmd Quit
    End If
End Function
Function ScriviCom (ByVal Txt As String)
    ' Modificata il 26/6/97
    ' 3/7/97
    ' Scrive sulla seriale specificata e restituisce il valore True
    ' Se fallisce, restituisce il valore False
    ' La funzione deve essere chiamata dopo InitCOM, che inizializza
l'handle
    ' ScriviCom ("Ciao")
    On Error GoTo Err_ScriviCom
    ScriviCom = True
    ' Scrive sulla seriale
    If WriteComm(LineeSet.Handle, Txt, Len(Txt)) < 0 Then
        Notifica "Errore di scrittura sulla COM"
        ScriviCom = False
    End If
    ' Gestione errori
    Exit Function
Err_ScriviCom:
    If MsgBox(Error$, 21, "Errore Imprevisto") = 4 Then
        Resume Next
    Else
        DoCmd Quit
    End If
End Function
Function InitCom ()
    ' Inizializza le costanti di sistema
    CR = Chr$(13)
    LF = Chr$(10)
    CRLF = CR & LF
    On Error GoTo Err_InitCom
    Dim OpenPort As Integer
    Dim Stringa As String
    Dim Comando As String
    Dim Inizio
    Dim RetVal As Integer
    InitCom = False
    ' Nel caso che la porta sia rimasta bloccata per un precedente
    ' blocco del programma, prova a chiuderla!
    ' 1 è l'handle, non la COM
    OpenPort = Closecomm(1)
    ' Inizializza la COM da utilizzare
    Dim Msg
    Msg = ""
    ' Apre la porta di comunicazione
    OpenPort = OpenComm("COM1" , 16384, 2048)
    If OpenPort < 0 Then
        Msg = "Impossibile aprire la porta COM1"
        GoTo Prosegui
    End If
    ' Struttura DCB. Imposta la seriale
    Dim MioDCB As DCB
    Err = BuildCommDCB("COM" & LineeSet.NumCom & ":19200,n,8,1", MioDCB)
    If Err < 0 Then
        Msg = "Errore di BuildCommDCB n° " + Str(Err)
        GoTo Prosegui
    End If
    Err = SetCommState(MioDCB)
    If Err < 0 Then
        Msg = "Errore di SetCommState n° " + Str(Err)
    End If
Prosegui:
    InitCom = True
    ' Gestione errori
    Exit Function
Err_InitCom:
    MsgBox Error$
    Resume Next
End Function
Function ChiudiCom ()
    ' Chiude la COM precedentemente aperta
    On Error GoTo Err_ChiudiCom
    Dim RetVal
    ChiudiCom = True
    ' Chiude le COM utilizzate (se ce ne sono!)
    If LineeSet.recordcount = 0 Then
        Exit Function
    End If
    LineeSet.MoveFirst
    ' Chiude la porta di comunicazione
    If LineeSet.Handle <> 0 Then
        RetVal = Closecomm(LineeSet.Handle)
    Else
        RetVal = 0
    End If
    If RetVal < 0 Then
        Notifica "Impossibile chiudere la porta COM" & LineeSet.NumCom
        ChiudiCom = False
    End If
    ' Gestione errori
    Exit Function
Err_ChiudiCom:
    MsgBox Error$
    Resume Next
End Function
' --------------------------------------------------------------------------
--------------------------------------
Piccolo esempio della routine che attendeva l'"OK" del modem:
        'Aspetta per 5 secondi al massimo l'"OK" dal modem
        Inizio = Timer      ' Ricava l'ora dalla quale inizierà il calcolo.
        Do
            Stringa = Stringa & LeggiCom()
        Loop Until Timer >= Inizio + 5 Or InStr(Stringa, "OK") > 0
--
--
--
Cordiali saluti
ALADINO INFORMATICA - CyberNet Point
Via E.Chianesi, 15 - 55049 Viareggio (LU)
Tel.Fax. 0584/389210 Cell. 0338/8456974
e-mail: 
in...@aladinoinformatica.com

>>Dunque. Per quanto ne so il tutto si può fare tramite le API di windows. 
 [cut]
Non mi aspettavo tanto!
Ti ringrazio per la disponibilità, mi studierò bene il tuo codice per
vedere se, con qualche modifica può essere utile alla mia causa.
Non subito però.
Domattina ore 9.00 mi aspettano 10 ore di navigazione destinazione
Olbia. Avevo promesso alla mia famigliola un po' di mare prima
dell'inizio della scuola... ed ogni promessa è debito.
Chissà se trovo un PC ed un collegamento alla rete, lì in mezzo al
mare? Potrei postare come DavideR (dal cuore del Mediterraneo); vedo
che vanno di moda qui sul NG i punti di collegamento più disparati...
Bèh, tanto che ci siamo, non è che qualcuno conosce qualche locale
dove mangiare bene (e spendere poco, of course) lì da quelle parti?
Io delle guide turistiche mi fido molto poco e preferisco le
indicazioni di qualcuno che ha provato in prima persona.
A risentirci fra una decina di giorni e buon lavoro a tutti.
DavideR (per stasera ancora dall'afosissima pianura Padana).


>>Dunque. Per quanto ne so il tutto si può fare tramite le API di windows. 
 [cut]


 Non mi aspettavo tanto!
Be', dirti che c'è del cibo buono e non dirti quale, serve a poco, penso :-)
Comunque, mi sovviene un'altra cosa. Al tempo, la scelta delle API era
praticamente obbligatoria, perchè gli OCX davano parecchi problemi di
stabilità. Oggi, che questi problemi sono stati largamente superati, trovi
anche molti OCX che gestiscono molto bene le comunicazioni su e da seriale
(come MsComm per VB).
A risentirci se hai bisogno!



Aiuto!!!
Ho scaricato l'ocx, ma non essendo un esperto di VB, non riesco a capire,
una volta aperta la porta COM, come leggere i dato dal lettore badge!!!
Se tu riuscissi a darmi qualche dritta (magari qualche riga di codice....)
te ne sarei molto grato.
Ciao :)))
                    Flavio


Ops, ho dimenticato di specificare che rea un post di davideR del 29/08/00
:(   Scusate!
        Flavio

>>
 
Sono tornato solo oggi dalla Sardegna e chiedo scusa per non aver
potuto rispondere prima. Devo confessare che il paesaggio incantevole
di quest'isola mi ha fatto dimenticare qualsiasi cosa inerente la
routine quotidiana.
Da domani proverò a mettere in pratica i vostri consigli.
Grazie
DavideR


>>>
Scusa l'enorme ritardo, ma sono tornato solo ora dalle vacanze in
Sardegna. Fortunatamente in quei giorni non mi è mai passato per il
cervello nulla che riguardasse la vita di tutti i giorni.
Cmq per risponderti posso solo dirti che anche io ho avuto difficoltà 
a far funzionare l'OCX. Così ho aggirato il problema con un
programmino in QuickBasic richiamato da Access che legge i dati da
seriale e me li salva in un file .txt
Non è la soluzione più elegante ma funziona.
In questi giorni provo ad analizzare il codice di Jonathan e vedo se
sono capace di adattarlo alla bisogna.
Ciao


 ha scritto nel messaggio
news:39ba58fd...@news.ipsnet.it...

Io speravo anche nell'aiuto di Enrico T.S., che dice che sono facili da
programmare....
Ciao
            Flavio