jasso Geschrieben 27. April 2005 Teilen Geschrieben 27. April 2005 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Manfred.Becker Geschrieben 27. April 2005 Teilen Geschrieben 27. April 2005 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
jasso Geschrieben 27. April 2005 Autor Teilen Geschrieben 27. April 2005 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
jasso Geschrieben 27. April 2005 Autor Teilen Geschrieben 27. April 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Manfred.Becker Geschrieben 27. April 2005 Teilen Geschrieben 27. April 2005 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] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
jasso Geschrieben 28. April 2005 Autor Teilen Geschrieben 28. April 2005 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: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Manfred.Becker Geschrieben 28. April 2005 Teilen Geschrieben 28. April 2005 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) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
jasso Geschrieben 9. Mai 2005 Autor Teilen Geschrieben 9. Mai 2005 so hat ein weilchen gedauert bis ich wieder dazugekommen bin. aber du hattest recht :uli jetzt funktionierts! vielen dank jasso Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.