Zum Inhalt springen

probleme mit comm-schnittstelle


jasso

Empfohlene Beiträge

morgen leute

habe mit einem kleinen simplen vb programm so meine probleme *schäm*.

und zwar folgendes:

mit barcodescanner wird ein code gescannt und dann über eine comm-schnittstelle an rechner übertragen.

zu testzwecken habe ich in der comm_scanner_OnComm() nur den comm_scanner.Input in eine textdatei geschrieben.

auf meinem rechner im büro (XP VB6) läuft das auch wunderbar (--> scann --> schreiben des scannstrings in die textdatei).

auf dem produktionsrechner allerdings (auch XP VB6) wird die comm-schnittstelle bei einem scann zweimal aufgerufen und der gescannte string jeweils auf die beiden comm_scanner.Input der OnComm() aufrufe verteilt?? :(

der service vom barcodescanner hat gemeint er habe schon einmal gehört (programmiert allerdings nicht selbst), dass VB6 mit den comm-schnittstellen allgemein probleme macht. was meint ihr dazu? oder fällt euch sonst was dazu ein? :confused:

lg

jasso

PS: habe das thema schon einmal im hardware-forum angesprochen weil ich zuerst dachte es muss am scanner liegen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi jasso,

ich selbst hatte noch mit keinem Betriebsystem jemals Probleme mit VB6 und der Ser. Schnittstelle!

Höchstwahrscheinlich ist eine unsaubere Programmierung der OnComm-Funktion die Ursache.

Hast du daran gedacht, dass während du Daten aus der seriellen Schnittstelle liest, noch weitere Daten hinzukommen können?

Deshalb sollte die OnComm-Funktion etwa so aussehen:


Private Sub MSComm1_OnComm()
Dim ReceiveData(1024) As Integer
Dim BytesLeft As Integer
Dim i As Integer
Dim nBytes As Integer
Dim ch As Byte
Dim strIn As String


nBytes = 0

BytesLeft = MSComm1.InBufferCount
Do While BytesLeft > 0
strIn = MSComm1.Input
nBytes = nBytes + 1
If strIn <> "" Then
ReceiveData(nBytes) = AscB(strIn)
Else
ReceiveData(nBytes) = 0
End If

DoEvents
BytesLeft = MSComm1.InBufferCount
Loop

...
End Sub

[/PHP]

Wichtig dabei ist die Do While BytesLeft > 0 Schleife!

Poste doch mal deine OnComm-Funktion...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hast du daran gedacht, dass während du Daten aus der seriellen Schnittstelle liest, noch weitere Daten hinzukommen können?

nein hab ich nicht daran gedacht (wusst ich nicht *schäm* :floet: )

bei mir sahs bisher so aus

(habe eigentlich alles zum testen rausgeschmissen^^)

Private Sub comm_scanner_OnComm()

    logfile.WriteLog comm_scanner.Input, ".\scannerinput.txt"    

End Sub
die logfile.writelog ist von mir und schreibt einfach nur in die genannte textdatei. habe das ganze jetzt aushilfsweise so
Option Explicit

Public scannerstring As String


Private Sub comm_scanner_OnComm()

Dim eingang As String


    eingang = comm_scanner.Input

    If eingang <> "" Then

        scannerstring = scannerstring & "" & eingang

        If Len(scannerstring) <> 0 Then

            If Mid(scannerstring, Len(scannerstring), 1) = Chr(13) Then

                logfile.WriteLog scannerstring, ".\scannerinput.txt"

                scannerstring = ""

            End If

        End If


    End If


End Sub

hat mehr schlecht als recht funktioniert, aber im endeffekt bin ich mit 2 scanns dann immer auf das richtige ergebnis gekommen.

werde aber gleich mal den code von dir ausprobieren. dankeschöööööön!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Private Sub comm_scanner_OnComm()

    Dim ReceiveData(1024) As Integer

    Dim BytesLeft As Integer

    Dim i As Integer

    Dim nBytes As Integer

    Dim ch As Byte

    Dim strIn As String

    Dim scannerstring As String


    nBytes = 0


    BytesLeft = comm_scanner.InBufferCount

    scannerstring = ""

    Do While BytesLeft > 0

        strIn = comm_scanner.Input

        scannerstring = scannerstring & "" & strIn

        nBytes = nBytes + 1

        If strIn <> "" Then

            ReceiveData(nBytes) = AscB(strIn)

        Else

            ReceiveData(nBytes) = 0

        End If


        DoEvents

        BytesLeft = comm_scanner.InBufferCount

    Loop

    logfile.WriteLog scannerstring, ".\scannerstring.txt"

End Sub
so schauts jetzt aus aaaaber er geht mir pro scann immer noch zweimal in die sub rein und arbeitet erst den ersten teil des barcodes und dann den zweiten ab (wie gehabt :( )
--27.04.2005 16:31:17-- 

--27.04.2005 16:31:17-- *000000000000014

--27.04.2005 16:31:34-- 285

--27.04.2005 16:31:34-- *000000000000014

so die textdatei dann.

er arbeitet mir beim zweiten scann den rest des ersten scanns ab.

lg

jasso

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

kontrolliere bitte mal dei Eigenschaft InputLen des MSComm-Controls.

Die muss unbedingt auf 1 gesetzt sein!

Sollte sie grösser 1 sein z.b. 16, dann werden immer nur Blockweise Daten gelesen. Wenns dann einen Rest gibt, kommt's nicht zum OnComm-Ereignis!

Hier die abgespeckte OnComm-Funktion:


Private Sub comm_scanner_OnComm()
Dim BytesLeft As Integer
Dim strIn As String
Dim scannerstring As String


BytesLeft = comm_scanner.InBufferCount
scannerstring = ""
Do While BytesLeft > 0
strIn = comm_scanner.Input
scannerstring = scannerstring & strIn
DoEvents
BytesLeft = comm_scanner.InBufferCount
Loop
logfile.WriteLog scannerstring, ".\scannerstring.txt"
End Sub
[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

die InputLen war bei mir vorher auf 0

mit InputLen auf 1 aber selbes ergebnis

--28.04.2005 10:24:37-- *0000000

--28.04.2005 10:24:37-- 00000014285

--28.04.2005 10:24:50-- 

--28.04.2005 10:24:50-- *000000000000014

--28.04.2005 10:25:02-- 285

--28.04.2005 10:25:02-- *000000000000014

--28.04.2005 10:25:20-- 285

--28.04.2005 10:25:20-- *000000000000014

seltsamerweise schneidet er beim ersten scan anders als bei den nachfolgenden :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi jasso,

arbeitest du mit einer sehr niedrigen Baudrate?

Es scheint, als ob nicht schnell genug Daten am Port ankommen.

Mein letzter Tip wäre in der Do-While-Schleife vor DoEvents ein call Sleep(10) einzubauen.

Dadurch wird 10 ms gewartet, bevor der InBuffer erneut geprüft wird.

Sleep() ist eine API-Funktion, die du so deklarierst:

Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...