Com-port mit VB-Access lesen

Guten Tag,

Ich bin Systeminformatiker Azubi und soll mit Hilfe von Access und dem dort enthaltenen VB einen COM-Port Anschluss lesen.

Hintergrund: Es ist per USB ein Microcontroller angeschlossen, der einen Analogwert in einen digitalen Wert umwandelt.

Dieser soll per VB Programmierung gelesen und in eine Access-Datenbank geschrieben werden, damit ich somit die aktuellen Messdaten erfassen und speichern kann.

Leider habe ich bislang nur sehr geringes Basiswissen, was den Umgang mit VB angeht.

Vielen Dank hier schonmal für Ihre Bemühungen

MfG SI-Azubi

Hallo Stift *kicher*

Ich bin Systeminformatiker Azubi und soll mit Hilfe von Access
und dem dort enthaltenen VB einen COM-Port Anschluss lesen.

bei Access spricht man von Vb a
COM-Port?

Ich kenne an PCs den seriellen Port den würde ich als Com bezeichnen.
dann den parallelen Port wie LPT1.
Neu jetzt halt USB, was ja auch seriell ist, aber völlig anders als der serielle Port mit RS232 o.ä. aufgebaut ist.

USB ist so ne Sache.
Nicht die Lösung, aber besser wäre es du könntest da deinen Microdingsda an die serielle Schnittstelle anstöpseln.
Dazu gibt es dann Bücher wie Messen,steueren,regeln einer RS232 durch VbA.

Soweit ich weiß, recherche mal dazu falls es wichtig ist, so ist USB sowieso nicht brauchbar bei zeitkritischen Vorhaben.
D.h. wenn du sehr zeitnah=Richtung Echtzeit deinen Mikrdingsda auswerten/aufzeichnen willst so ist da die serielle Schnittstelle besser, vielleicht auch die parallele.

Ansonsten erst mal sorry, ich habe da keinen Code dazu.
Vielleicht hat ja Rainer etwas dazu in seiner Schatztruhe wo Code ist der den USB ausliest.

Gruß
Reinhard

Hallo Reinhard,

Vielleicht hat ja Rainer etwas dazu in seiner Schatztruhe wo
Code ist der den USB ausliest.

nein, keine Ahnung.

Gruß Rainer

Hallo

In Access kannst Du wahrscheinlich scripten.
Was das script in access kann, weiß ich leider nicht.

Aber wenn Du VB sagst, bei VB kann man eine Ereignissteuerung für den seriellen Port programmieren.
Was auch geht, das ist das Ansprechen des Portes als Datei.
Allerdings ist mir keine Ereignissteuerung bekannt oder nur per API möglich.

An Rainer:
Kann man mit Access Ereignisse oder API-Aufrufe programmieren?

MfG
Matthias

Hallo Matthias,

In Access kannst Du wahrscheinlich scripten.
Was das script in access kann, weiß ich leider nicht.

? Nehmen wir mal an in Access könnte man sripten, und dann?

Ein Script ist für mich sehr vieldeutig, deshalb weiß ich nicht was genau du meinst.

Aber wenn Du VB sagst, bei VB kann man eine Ereignissteuerung
für den seriellen Port programmieren.

Ja, ich sah schon Code für den seriellen Port.
Der Anfrager spricht von USB, das klappt mit den Codes nicht .

Kann man mit Access Ereignisse oder API-Aufrufe programmieren?

? Ich weiß nicht welche Ereignisse du meinst, ohne es zu kennen gehe ich davon aus, auch Access-Vba kann API benutzen.

Vielleicht habe ich mich unklar ausgedrückt im anderen beitrag.

Für das was ich als seriellen Port ansehe gibt es in Vba und Vb Code um mit dem zu kommunizieren.

Was es für USB gibt weiß uch nicht.
Ja, das S in USB steht für seriell, ich weiß das.

Nur, die Codes für den alten seriellen Port klappen bei USB nicht.

Gruß
Reinhard

Hallo Matthias,

Was das script in access kann, weiß ich leider nicht.

Das ist auch das Microsoft Script Control 1.0

Kann man mit Access Ereignisse oder API-Aufrufe programmieren?

API-Aufrufe auf jeden Fall, ActiveX Komponenten nicht und Klassenmodule … weiß ich nicht. Reinhard? Ist Dir in VBA schon mal …

 Raise Event 

begegnet?

Gruß Rainer

Hallo an alle,

Erst mal Danke für die Antworten.

Wir haben zu dem Microcontroller eine Treibersoftware installiert, der diesen als COM5 an dem Laptop erkennen lassen sollte. Ich weiß nicht, ob Ihnen das vielleicht helfen könnte.

MfG SI-Azubi

Hallo Rainer
Der hat den Usb Port als seriellen Port zur Verfügung.
Also bevor ich(oder evtl. der Fragesteller) selber google(t), weißt Du wie der Com Port unter Script funktioniert?
Bei API in Scripten, kann ich Funktionen als Adressen übergeben? Also eine Adresse für Ereignisse angeben?
Raise Event soll ja nicht programmiert werden, soll ja der Com Port machen.
MfG
Matthias

Erst mal danke für die zeit
bei VB.net/6 hätte ich das Problem das ich dann mich über ein Quellcode für ne Datenbank schlau machen müsste(eintragen, ordnen, anzeigen u.s.w.) und das ganze Projekt soll ende nächster Woche fertig sein. ich hab leider nur Freizeitkenntnisse in VB und da ich mich in letzter zeit sehr viel mit Access befast habe passte das irgendwie. ich weiß nicht welche Version von VB Access verwenden benutzte Access 2000 (9.0.3821 SR-1).

Ich glaub ich beschreib das Projekt etwas genauer.

Aufbau:
Wir haben ein Laisiersensor der Entfernung mist und sie an einer LOGO(ist ein Relais nur besser)weiter gibt(0V-10V).
Die LOGO macht aus den 10V 2V und gibt das Analogsignal an unseren Mikrocontroler(10Bit USB Datenerfassungssystem heißt der und kann maximal 2047mV ab) der das ganze in ein Digitalsignal verwandelt.
Angeschlossen wirt das per USP und durch Softwareinstallation als COMPort5 erkant.

Meine aufgabe:
Ich soll werte des Sensor erfassen und in einer art Ranking anzeigen(mit Sortieren nach Punkte).

Ich hab ein interessanten Quellcode gefunden aber ich glaube das mir ne Library(verweis)fehlt weil er Probleme mit den befehlen Combo1.additem oder Combo1.clear hat.
Bei der Funktion der Codes bin ich mir nicht sicher weil ich sie nicht testen kann aber ich glaub es führt mich ein stück näher zu Lösung

Hier mal der Code

Option Explicit

Dim PortOpen As Boolean

Public Function PortTest(COMPortNummer As Integer) As Boolean
MSComm1.CommPort = COMPortNummer

'wenn ein Fehler auftritt, dann funktioniert der Port nicht
On Error Resume Next

MSComm1.PortOpen = True
If Err = 0 Then
'Port verfügbar
PortTest = True
MSComm1.PortOpen = False
Else
PortTest = False
MSComm1.PortOpen = False
End If
End Function

Private Sub Command1_Click()
Me.Text1 = Me.Text1 & Str(Time) & " +++ Versuch den Text" & _
" zu senden" & vbCrLf

If PortOpen = False Then
MsgBox „Bitte vorher einen Port öffnen“
Me.Text1 = Me.Text1 & Str(Time) & _
" +++ Fehler beim Senden des Textes, Port " & _
„ist nicht geöffnet“ & vbCrLf & vbCrLf
Exit Sub
End If

If Me.Text2 = „“ Then
MsgBox „Und was ist mit dem Text“
Me.Text1 = Me.Text1 & Str(Time) & " +++ Text fehlt" & _
vbCrLf & vbCrLf
Exit Sub
End If

On Error Resume Next

MSComm1.Output = Me.Text2 + vbCr

If Err 0 Then
MsgBox „Text nicht fehlerfrei gesendet!“
Me.Text1 = Me.Text1 & Str(Time) & " +++ Text nicht " & _
„fehlerfrei gesendet“ & vbCrLf & vbCrLf
Else
Me.Text1 = Me.Text1 & Str(Time) & _
" +++ „“" + Me.Text2 & „“„wurde gesendet“ & _
vbCrLf & vbCrLf
End If
End Sub

Private Sub Command2_Click()
Dim Portzaehler As Integer

Me.Text1 = Me.Text1 & Str(Time) & _
" +++ Vorhandene COM-Ports abfragen" & vbCrLf

’ Combobox löschen
Me.Combo1.Clear

For Portzaehler = 1 To 16
If PortTest(Portzaehler) Then
Me.Combo1.AddItem „COM“ & Str(Portzaehler)
End If
Next

If Me.Combo1.ListCount = 0 Then
Me.Combo1.AddItem „Kein Comport verfügbar“
Me.Text1 = Me.Text1 & Str(Time) & _
" +++ Kein Comport verfügbar" & _
vbCrLf & vbCrLf
Else
Me.Text1 = Me.Text1 & Str(Time) & _
" +++" & Str(Me.Combo1.ListCount) & _
" Comport(s) verfügbar" & vbCrLf & vbCrLf
End If

'Selektion auf den ersten Eintrag setzen
Me.Combo1.ListIndex = 0
End Sub

Private Sub Command3_Click()
Dim CPort As Byte
Dim Settings As String

Me.Text1 = Me.Text1 & Str(Time) & _
" +++ Versuch den COM-Port zu öffnen" _
& vbCrLf

If PortOpen = True Then
MsgBox "Es ist bereits ein Port geöffnet. Bitte " & _
„vorher schließen!“
Me.Text1 = Me.Text1 & Str(Time) & _
" +++ COM-Port kann nicht geöffnet " & _
„werden, da bereits ein Port geöffnet ist“ _
& vbCrLf & vbCrLf
Exit Sub
End If

CPort = Val(Mid(Me.Combo1.List(Me.Combo1.ListIndex), 4, _
Len(Me.Combo1.List(Me.Combo1.ListIndex))))

If CPort = 0 Then
MsgBox "Fehler! Sind eventuell keine COM-Ports " & _
„vorhanden?“

Me.Text1 = Me.Text1 & Str(Time) & _
" +++ COM-Port kann nicht geöffnet " & _
"werden " & vbCrLf & vbCrLf
Else
MSComm1.CommPort = CPort
Settings = Me.Combo2.List(Me.Combo2.ListIndex)
Select Case Me.Combo4.ListIndex
Case 0: Settings = Settings & „,E“
Case 1: Settings = Settings & „,O“
Case 2: Settings = Settings & „,N“
Case 3: Settings = Settings & „,M“
Case 4: Settings = Settings & „,S“
End Select

Settings = Settings & „,“ & _
Me.Combo3.List(Me.Combo3.ListIndex)

Settings = Settings & „,“ & _
Me.Combo5.List(Me.Combo5.ListIndex)

MSComm1.Settings = Settings

On Error Resume Next

MSComm1.PortOpen = True

If Err 0 Then
MsgBox "Fehler! Sind eventuell keine COM-Ports " & _
„vorhanden oder die Einstellungen falsch?“

Me.Text1 = Me.Text1 & Str(Time) & _
" +++ COM-Port kann nicht geöffnet werden" _
& vbCrLf & vbCrLf
Else
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.InputLen = 0
Me.Text1 = Me.Text1 & _
Str(Time) & " +++ COM-Port wurde geöffnet" _
& vbCrLf & vbCrLf
PortOpen = True
End If
End If
End Sub

Private Sub Command4_Click()
Me.Text1 = Me.Text1 & Str(Time) & _
" +++ Versuch den COM-Port zu schließen" & vbCrLf

If PortOpen = False Then
MsgBox "Es ist kein Port geöffnet, ein Schließen ist " & _
„daher nicht notwendig“

Me.Text1 = Me.Text1 & Str(Time) & _
" +++ COM-Port kann nicht geschlossen " & _
"werden, da nicht " & „notwendig“ & vbCrLf & _
vbCrLf
Else
On Error Resume Next

MSComm1.PortOpen = False
If Err 0 Then
MsgBox „Fehler beim Schließen des Ports“
Me.Text1 = Me.Text1 & _
Str(Time) & " +++ COM-Port kann nicht " & _
„geschlossen werden“ & vbCrLf & vbCrLf
Else
Me.Text1 = Me.Text1 & Str(Time) & " +++ COM-Port " & _
„geschlossen“ & vbCrLf & vbCrLf
PortOpen = False
End If
End If
End Sub

Private Sub Form_Load()
’ Oberfläche initialisieren
Me.Combo1.Clear
Me.Combo1.AddItem „Kein Comport verfügbar“
Me.Combo1.ListIndex = 0
Me.Combo2.AddItem „4800“
Me.Combo2.AddItem „9600“
Me.Combo2.AddItem „19200“
Me.Combo2.AddItem „38400“
Me.Combo2.AddItem „57600“
Me.Combo2.AddItem „115200“
Me.Combo2.ListIndex = 4
Me.Combo3.AddItem „4“
Me.Combo3.AddItem „5“
Me.Combo3.AddItem „6“
Me.Combo3.AddItem „7“
Me.Combo3.AddItem „8“
Me.Combo3.ListIndex = 4
Me.Combo4.AddItem „Gerade“
Me.Combo4.AddItem „Ungerade“
Me.Combo4.AddItem „Keine“
Me.Combo4.AddItem „Markierung“
Me.Combo4.AddItem „Leerzeichen“
Me.Combo4.ListIndex = 2
Me.Combo5.AddItem „1“
Me.Combo5.AddItem „1.5“
Me.Combo5.AddItem „2“
Me.Combo5.ListIndex = 0

PortOpen = False

Me.Text1 = Str(Time) & _
" +++ Programmstart. Willkommen." & _
vbCrLf & vbCrLf
End Sub

Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comOverrun: MsgBox „Datenverlust!“
Case comRxOver: MsgBox „Datenverlust!“
Case comEvReceive: Me.Text3 = Me.Text3 + MSComm1.Input
End Select
End Sub

Ich möchte mich schon mal im voraus bedanken für die antworten und bin auch für jeden Quellcode dankbar(auch aus VB.net) weil mich doch irgend wie immer ein stück in Meiner Ausbildung weiter bringt. ^^;

Hallo Matthias,

Der hat den Usb Port als seriellen Port zur Verfügung.
Also bevor ich(oder evtl. der Fragesteller) selber google(t),
weißt Du wie der Com Port unter Script funktioniert?

nein, ich habe mit dem Com-Port noch gar nichts programmiert.
Sollte das nötig werden, würde ich im VB6 das Steuerelement ‚MSComm‘ verwenden. Wie man da ohne dieses Steuerelement ran kommen würde, habe ich keine Ahnung.

Bei API in Scripten, kann ich Funktionen als Adressen
übergeben?

Unter ‚Scripten‘ verstehe ich den Umfang von ‚Micrisoft Script Control‘, wie er in VBS zur Verfügung steht und auch in VB/VBA verwendbar ist wie z.B. FSO, WSH … und damit kann man keine API aufrufen. Script und API schließen sich gegenseitig aus. Das sind zwei völlig verschiedenen Welten.

Also eine Adresse für Ereignisse angeben?
Raise Event soll ja nicht programmiert werden, soll ja der Com
Port machen.

Ja, der soll Ereignisse feuern, wenn Daten eintreffen.

Mit MSComm würde ich das bestimmt hin bekommen, wenn ich Hardware hätte mit der ich das ausprobieren könnte. Habe ich aber nicht.
Das alte Modem ist längst verschrottet. :smile:

Allerdings ist das eben VB6.0, die Frage war aber nach VBA und was da wie geht, habe ich absolut keine Ahnung.

Gruß Rainer

Wir haben zu dem Microcontroller eine Treibersoftware
installiert, der diesen als COM5 an dem Laptop erkennen lassen
sollte. Ich weiß nicht, ob Ihnen das vielleicht helfen könnte.

Hallo SI-Azubi,

2006 hat in einem anderen Forum (nur Vba) jemand gefragt wie man den Comport anspricht. Daraufhin habe ich ihm den nachfolgenden Code genannt den ich damals im Internet fand.
Leider kam keine Rückmeldung ob er mit dem Code klar kam.

Diese meine damalige Antwort fand ich jetzt bei der Recherche.

Gruß
Reinhard

Option Explicit

'-------------------------------------------------------------------
'
'Module: ComPort
'Author: Darren Richards
'Date : 11th August '95
'Synopsis : Win32 comms API wrapper for VBA
' OpenComPort - open / configure com port.
' ReadComPort - read available data from com port.
' WriteComPort - write data to com port.
' CloseComPort - close com port.
' StatComPort - get buffer stats for com port.
'
'


'-------------------------------------------------------------------
' API Constants And declarations
'-------------------------------------------------------------------

' structs used by Win32 comm api
'

Type DCB '' patched to proper definition VB32 ill-def DR
 DCBlength As Long
 BaudRate As Long
 fdwFlags As Long ' bit field in C
 wReserved1 As Integer
 XonLim As Integer
 XoffLim As Integer
 ByteSize As String \* 1
 Parity As String \* 1
 StopBits As String \* 1
 XonChar As String \* 1
 XoffChar As String \* 1
 ErrorChar As String \* 1
 EofChar As String \* 1
 EvtChar As String \* 1
 wReserved2 As Integer
End Type

Type COMMTIMEOUTS
 ReadIntervalTimeout As Long
 ReadTotalTimeoutMultiplier As Long
 ReadTotalTimeoutConstant As Long
 WriteTotalTimeoutMultiplier As Long
 WriteTotalTimeoutConstant As Long
End Type

Type COMSTAT
 fCtsHold As Long
 fDsrHold As Long
 fRlsdHold As Long
 fXoffHold As Long
 fXoffSent As Long
 fEof As Long
 fTxim As Long
 fReserved As Long
 cbInQue As Long
 cbOutQue As Long
End Type

' kernel defined constants
'

Public Const OPEN\_EXISTING = 3
Public Const GENERIC\_READ = &H80000000
Public Const GENERIC\_WRITE = &H40000000
Public Const INVALID\_HANDLE\_VALUE = &HFFFF
Public Const MAXDWORD = &HFFFF

' comms Constants
'

Public Const PURGE\_TXCLEAR = &H4
Public Const PURGE\_RXCLEAR = &H8

Public Const CE\_RXOVER = &H1 ' Receive Queue overflow
Public Const CE\_OVERRUN = &H2 ' Receive Overrun Error
Public Const CE\_RXPARITY = &H4 ' Receive Parity Error
Public Const CE\_FRAME = &H8 ' Receive Framing error
Public Const CE\_BREAK = &H10 ' Break Detected
Public Const CE\_TXFULL = &H100 ' TX Queue is full

Public Const SETRTS = 3 ' Set RTS high
Public Const SETDTR = 5 ' Set DTR high


' kernel API file i/o functions
'

Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal \_
lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As \_
Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As \_
Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As \_
Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function GetLastError Lib "kernel32" () As Long
Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As \_
Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, \_
ByVal lpOverlapped As Long) As Long
Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As \_
Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal \_
lpOverlapped As Long) As Long

' Win32 comms functions
'

Declare Function SetCommState Lib "kernel32" (ByVal hCommDev As Long, lpDCB \_
As DCB) As Long
Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long, \_
lpCommTimeouts As COMMTIMEOUTS) As Long
Declare Function PurgeComm Lib "kernel32" (ByVal hFile As Long, ByVal \_
dwFlags As Long) As Long
Declare Function BuildCommDCB Lib "kernel32" Alias "BuildCommDCBA" (ByVal \_
lpDef As String, lpDCB As DCB) As Long
Declare Function SetCommMask Lib "kernel32" (ByVal hFile As Long, ByVal \_
dwEvtMask As Long) As Long
Declare Function ClearCommError Lib "kernel32" (ByVal hFile As Long, \_
lpErrors As Long, lpStat As COMSTAT) As Long
Declare Function SetupComm Lib "kernel32" (ByVal hFile As Long, ByVal \_
dwInQueue As Long, ByVal dwOutQueue As Long) As Long
Declare Function EscapeCommFunction Lib "kernel32" (ByVal nCid As Long, \_
ByVal nFunc As Long) As Long
Declare Function GetCommMask Lib "kernel32" (ByVal hFile As Long, lpEvtMask \_
As Long) As Long
Declare Function GetCommModemStatus Lib "kernel32" (ByVal hFile As Long, \_
lpModemStat As Long) As Long
Declare Function WaitCommEvent Lib "kernel32" (ByVal hFile As Long, \_
lpEvtMask As Long, ByVal lpOverlapped As Long) As Long


'-------------------------------------------------------------------
'
'Routine: OpenComPort
' Parameters : strPortName - name of the port to open
' strSettings - port settings in the format
' "baud=9600 parity=N data=8 stop=1"
' lPortHandle - set to port handle on success
' Returns : Boolean representing success
' Synopsis : opens named communications port for synchronous
' i/o. The handle returned should be used in
' subsequent calls
'
'
Public Function OpenComPort(strPortName As String, \_
 strSettings As String, \_
 lPortHandle As Long) \_
 As Boolean


 Dim tCto As COMMTIMEOUTS
 Dim tDcb As DCB
 Dim hPort As Long
 Dim fRet As Boolean

 '
 ' set the length field of the DCB
 '

 tDcb.DCBlength = Len(tDcb)

 '
 ' get kernel to build a default DCB for us
 ' based on com settings string
 '

 Call BuildCommDCB(strSettings, tDcb)

 '
 ' open that com port
 '

 hPort = CreateFile(strPortName, \_
 GENERIC\_READ + GENERIC\_WRITE, \_
 0, \_
 0, \_
 OPEN\_EXISTING, \_
 0, \_
 0)

 '
 ' did we get port open ...
 '

 If hPort = INVALID\_HANDLE\_VALUE Then

 '
 ' ... no, get the error code from kernel
 '

 Dim lErr As Long

 lErr = GetLastError()

 Debug.Print "Failed to open comport( err = " & CStr(lErr) & ")"

 '
 ' setup returns for failure
 '

 fRet = False
 lPortHandle = INVALID\_HANDLE\_VALUE

 Else

 '
 ' ... yes, get port ready for action
 '

 '
 ' set port state using DCB we built earlier
 '

 Call SetCommState(hPort, tDcb)

 '
 ' set up buffer sizes and re-initialize comm driver
 '

 Call SetupComm(hPort, 64000, 64000) ' hPort, InQue, OutQue

 '
 ' setup timeout parameters for this port
 '

 tCto.ReadIntervalTimeout = MAXDWORD '' return with whatever is available
 tCto.ReadTotalTimeoutMultiplier = 0
 tCto.ReadTotalTimeoutConstant = 0

 tCto.WriteTotalTimeoutMultiplier = 0
 tCto.WriteTotalTimeoutConstant = 10000 '' max 10 secs to write data, just to stop locking
 '' up application if we gowrong
 Call SetCommTimeouts(hPort, tCto)

 '
 ' turn on DTR / RTS
 '

 Call EscapeCommFunction(hPort, SETDTR)
 Call EscapeCommFunction(hPort, SETRTS)

 '
 ' setup returns for success
 '

 fRet = True
 lPortHandle = hPort

 End If

 OpenComPort = fRet

End Function


'-------------------------------------------------------------------
'Routine: WriteComPort
' Parameters : lPortHandle - port handle from OpenComPort
' strData - data to write
' cbData - length of data to write
'
' Returns : Boolean representing success
' Synopsis : writes data to com port, does not return until
' all data has been written to comport buffer
'
'
Public Function WriteComPort(lPortHandle As Long, \_
 strData As String, \_
 cbData As Long) \_
 As Boolean

 Dim fWrite As Boolean
 Dim cbWritten As Long

 '
 ' write data to comms port
 '

 fWrite = WriteFile(lPortHandle, \_
 ByVal strData, \_
 cbData, \_
 cbWritten, \_
 0)

 '
 ' check if that worked
 '

 If Not fWrite Then

 Dim lErr As Long

 '
 ' get error from kernel
 '

 lErr = GetLastError()

 Debug.Print "WriteFile failed ( err = " & CStr(lErr) & " )"

 '
 ' make sure any comms errors are cleared
 '

 Dim tComStat As COMSTAT
 Dim lErrFlags As Long

 Call ClearCommError(lPortHandle, lErrFlags, tComStat)
 Call handleCommError(lPortHandle, lErrFlags)

 End If

 '
 ' return whatever write file returned
 '

 WriteComPort = fWrite

End Function

'-------------------------------------------------------------------
'
'Routine: ReadComPort
' Parameters : lPortHandle - port handle from OpenComPort
' strData - buffer to receive data
' cbRead - set to length of data read
'
' Returns : Boolean representing success
' Synopsis : reads data from com port, returns immediately
' if no data is available, otherwise gets contents
' of buffer.
'
'
Public Function ReadComPort(lPortHandle As Long, \_
 strData As String, \_
 cbRead As Long) \_
 As Boolean

 Dim strBuf As String \* 1000
 Dim cbBuf As Long
 Dim fRead As Boolean

 cbBuf = Len(strBuf)

 '
 ' read from port
 '

 fRead = ReadFile(lPortHandle, \_
 ByVal strBuf, \_
 cbBuf, \_
 cbRead, \_
 0)

 '
 ' check if that worked
 '

 If Not fRead Then

 Dim lErr As Long

 '
 ' get error from kernel
 '

 lErr = GetLastError()

 Debug.Print "ReadFile failed ( err = " & CStr(lErr) & " )"

 '
 ' make sure any comms errors are cleared
 '

 Dim tComStat As COMSTAT
 Dim lErrFlags As Long

 Call ClearCommError(lPortHandle, lErrFlags, tComStat)
 Call handleCommError(lPortHandle, lErrFlags)

 Else

 '
 ' make return into VB string
 '

 strData = Left(strBuf, cbRead)

 End If

 '
 ' return whatever ReadFile returned
 '

 ReadComPort = fRead

End Function

'-------------------------------------------------------------------
'Routine: CloseComPort
' Parameters : lPortHandle - port handle from OpenComPort
'Returns: none
' Synopsis : closes com port.
'
'

Public Sub CloseComPort(lPortHandle As Long)

 Call PurgeComm(lPortHandle, PURGE\_TXCLEAR Or PURGE\_RXCLEAR)
 Call CloseHandle(lPortHandle)
 lPortHandle = INVALID\_HANDLE\_VALUE

End Sub

'-------------------------------------------------------------------
'Routine: StatComPort
' Parameters : lPortHandle - port handle from OpenComPort
' lRxBuffer - number of bytes in receive buffer
' lTxBuffer - number of byte in transmit buffer
'Returns: none
' Synopsis : gets buffers statistics for comport, these are
' returned in lRxBuffer, lTxBuffer.
'
'

Public Sub StatComPort(lPortHandle As Long, lRxBuffer As Long, lTxBuffer As Long)

 Dim tComStat As COMSTAT
 Dim lDummy As Long

 '
 ' get those statistics
 '

 Call ClearCommError(lPortHandle, lDummy, tComStat)

 '
 ' grab the bits of comstat we are interested in
 '

 lRxBuffer = tComStat.cbInQue
 lTxBuffer = tComStat.cbOutQue

End Sub


'-------------------------------------------------------------------
' Routine: handleCommError
' Parameters : lPortHandle - port handle from OpenComPort lErrMask - error mask from ClearCommError
' Returns: none
' Synopsis : used internally to handle comms errors
'
'

Private Sub handleCommError(lPortHandle As Long, lErrMask As Long)

 If (lErrMask And CE\_RXOVER) Then
 Debug.Print "Receive overrun detected on com port"
 Call PurgeComm(lPortHandle, PURGE\_RXCLEAR)
 End If
 If (lErrMask And CE\_OVERRUN) Then
 Debug.Print "Byte lost on com port by hardware"
 End If
 If (lErrMask And CE\_RXPARITY) Then
 Debug.Print "Parity error detected on com port"
 End If
 If (lErrMask And CE\_FRAME) Then
 Debug.Print "Framing error detected on com port"
 End If
 If (lErrMask And CE\_BREAK) Then
 Debug.Print "Break condition detected on com port"
 End If
 If (lErrMask And CE\_TXFULL) Then
 Debug.Print "Transmit buffer overflow detected"
 Call PurgeComm(lPortHandle, PURGE\_TXCLEAR)
 End If

End Sub

Hallo SI-Azubi,

scrolle mal hier im Brett ganz nach unten und schaue dir mal die beiden alleruntersten Beitragsfolgen im Archiv an.

Ich habe jetzt dort nicht nachgeschaut, aber vielleicht hilft dir das ja.

Gruß
Reinhard

hi Leute
erst mal danke für die Empfehlung, mach ambesten erst mal ne Rückmehldung was nun ist.
Hab ein Datensatz gefunden der mir den Commport liest und ausgibt(VB6) aber…leider greift er für die Funktion auf eine dll zu wobei der Lerneffekt verloren ging(hab erfahren das dll’s nicht mehr in anständige Codes für VB gewandelt werden könn und Assembler kann ich nicht).das ganze ist auch Spätziel für den Mikrocontroler den ich habe anscheinend.(hatte zwischen druck Treiberprobleme weil ich Laptop gewechselt habe).
Der lik´nk ist für die die das beispielprogramm brauchen/wolln:
http://www.h-tronicshop.de/artikel.aspx?art=163444 (Download CD ist der treiber + beispiele)

soooo jetzt woll ich fragen ob ich vielleicht ein Beispielcode für Tabellen erstellen kriege oder noch besser wäre ein Crash kurz, irgend was wo ich mir das ganze raus arbeiten kann.
Da ich mich ja schon bisl durch das Thema gegoogle’d habe weiß ich das es mehrere art von Datenbanken gibt als beschreib ich ihr Funktion amtbesten:

Es gibt eine spalte in der ein punktewert eingetragen wird nach dem immer sortiert werden soll(der mit den meisten punkten ist oben(erster))es werden immer wieder neu einträge hinzugefügt aber nur die 10 Besten in der Tabelle angezeigt(spalten die wascheidlich vorhanden sind:stuck_out_tongue:unkte;Vorname;Nachname;Meter(x,xxm))

Das Problem ist nicht das ich keine Lust habe es zumachen sonder das ich 9 stunden am tag suche und in meinem betrieb mir keine helfen kann und Tabelle/Datenbank in VB(allgemein nur Heimkenntnisse habe) noch nie gemacht habe und ich mir das meiste durch Interpretation von Quellcodes beibringe(muss) oder im Internet nachlesen weil ich auch nicht die Hilfe benutzten kann in VB6(MSDN collection fehlt) ,ich versuch mir trotzdem was in meiner Ausbildung beizubringen Beschreibung der befehle wärn als nett v.v;

Hallo,

OK, Teil 1 scheint erledigt, wenn ich dich richtig verstehe.

soooo jetzt woll ich fragen ob ich vielleicht ein Beispielcode
für Tabellen erstellen kriege oder noch besser wäre ein Crash
kurz, irgend was wo ich mir das ganze raus arbeiten kann.
Da ich mich ja schon bisl durch das Thema gegoogle’d habe weiß
ich das es mehrere art von Datenbanken gibt als beschreib ich
ihr Funktion amtbesten:

Es gibt eine spalte in der ein punktewert eingetragen wird
nach dem immer sortiert werden soll(der mit den meisten
punkten ist oben(erster))es werden immer wieder neu einträge
hinzugefügt aber nur die 10 Besten in der Tabelle
angezeigt(spalten die wascheidlich vorhanden
sind:stuck_out_tongue:unkte;Vorname;Nachname;Meter(x,xxm))

Das ist eine komplett neue Frage, wenn ich Dich richtig verstehe.

Dazu hättest Du besser wirklich eine neue Frage gestellt, hier könnte das uiner gehen und Du bekommst, wenn Du Pech hast, nur Antworten von mir. :smile:

Dann los, gehen wir das mal an. Du hast VB6. Welche Version?
VB6 gibt es als Standard, Pofessional und Enterprise Edition. Jeweils mit verschiedenem Leistungsumfang.
Die Programmiersprache ist immer die Selbe, aber die verfügbaren Steuerelemente variieren stark.

Zur Datenbank. Existiert die schon? Wenn ja, was für eine Datenbank ist das? VB kann mit jeder Datenbank umgehen, zu der es einen ODBC-Treiber gibt. Für privat und singeluser Betrieb ist Access wohl am Besten.

Wenn nein, hast Du denn z.B. Access? Mit VB6 allein kann man auch eine Datenbank erstellen, ohne Code, mit Code zur Laufzeit des Programms, in ADO oder DAO … Du müsstest mal Wünsche äußern. :smile:

Am bequemsten und schnellsten geht es, wenn Du mit VB6 eine DAO-Datenbank (Access97) erstellst und mit den dazugehörigen Steuerelementen darauf zugreifst. Dann dauert das mit ein wenig Übung nur 5 Minuten. :smile: Die moderen Variante ist ADO, in VB.NET wird man alle Datenbanken mit ADO (Access200 und höher) erstellen.

Gruß Rainer

Dazu hättest Du besser wirklich eine neue Frage gestellt, hier
könnte das uiner gehen und Du bekommst, wenn Du Pech hast, nur
Antworten von mir. :smile:

Hallo Rainer,

Pech ist doch wirklich etwas anderes. Pech hat grad wieder mein spezieller Freund.
Ich sah seine Anfrage und wußte gleich die Lösung, aber er will ja keine Antworten von mir. C’est la vie.
Meine Therapeutin wäre begeistert von mir daß ich endlich mal, wenn auch in einem unwichtigen Fall mal nicht den netten darstelle.

Und wenn der Anfrager von hier nur noch Antworten von dir bekommt so ist das sein Glück und nicht sein Pech.

Wer außer dir hier soll ihm denn helfen? Wer kennt sich mit Datenbanken und Vb, oder war das Access, egal, aus.

Ich nicht. Viele andere hier, soweit ich das vom Mitlesen her feststellen kann, auch nicht.

Gruß
Reinhard

Hallo Reinhard,

Wer außer dir hier soll ihm denn helfen? Wer kennt sich mit
Datenbanken und Vb, oder war das Access, egal, aus.

Alex. :smile: Der weiß das viel besser als ich. Von dem habe ich das doch alles gelernt.

Gruß Rainer

erst mal danke für die antwort.
ich hab nicht das Gefühl das ich bei dir an der falschen Adresse bin.

zur Version die ich benutzte:
VB6.0 Enterprise Edition
Version:8176 VBA:Retail 6.0.8169 Forms3:2.01

ja ich habe Access 2000 würd aber gern es VB technisch bei 1 Datei belassen(also die exe die später den ist)

zur Datenbank:
die Danteenbank existiert noch nicht und soll bei Programm start erstellt werden und im laufe des Tages mit Daten gefüllt werden(Textbox reinschreiben, butten_click Datensatz rein sozusagen)also sozusagen eine temporäre Datenbank die auch in laufe der zeit per butten_click reset/gelöscht(bezogen auf die Daten) wirt. die Daten masse wird nicht al zu groß sein.

ADO oder DAO…schwierig welches von beiden kann man ausbauen(Wahrscheinlich ADO)schnell ein Datenbank zu erstell ist nützlich aber viel neues ein zu bring auch, will beides lern. >.

Hallo,

zur Version die ich benutzte:
VB6.0 Enterprise Edition
Version:8176 VBA:Retail 6.0.8169 Forms3:2.01

das ist schön. :smile:

ja ich habe Access 2000 würd aber gern es VB technisch bei 1
Datei belassen(also die exe die später den ist)

zur Datenbank:
die Danteenbank existiert noch nicht und soll bei Programm
start erstellt werden und im laufe des Tages mit Daten gefüllt
werden(Textbox reinschreiben, butten_click Datensatz rein
sozusagen)also sozusagen eine temporäre Datenbank die auch in
laufe der zeit per butten_click reset/gelöscht(bezogen auf die
Daten) wirt. die Daten masse wird nicht al zu groß sein.

Hast Du Dir das MSFlexgrid schon mal angesehen? Da passen etwas mehr als 30 000 Zeilen rein (Der Counter ist ‚Integer‘.) das kann sortieren … Flüchtige Daten müssen nicht in eine Datenbank. Die sind in einem Flexgrid auch gut aufgehoben.

wichtig ist das es nach spalten sortieren kann …

Dafür braucht man keine Datenbank.
Wenn die Datenbank beim Programmstart jedes mal gebaut werden soll und beim Beenden des Programms wieder gelöscht, dann wird sie nicht gebraucht.

Gruß Rainer

danke für den Tipp mit dem MSFlexgrid scheint einfach zu sein so das ich das auch da hin bekomme.

nun das mit der Datenbank war ne Sache allein für mich und nicht fürs Projekt weil ich das könn will, das dass Projekt fertig wird ist für mich persönlich Zweitrangig(Problem vom chef aber mit dem MSFlexgrid wird das wohl ;p)

ich hab MSFlexGrid under Components zugefügt und das ding nun…
ich glaub ich mach irgend was dummes falsch,
.additem/.row/.col usw. kennt mein Programm nicht…
kann es sein da ich irgend was noch zufügen muss?(verweis z.b)