-
VB Problem
Hi,
Ich versuche mit VB6 und dem Comm Control Daten von einem an den COM1 Port angeschlossenen Micoprozessor zu empfangen und in einer Listbox zu speichern.
Der VB-Code:
Code:
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.InputLen = 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False
End Sub
Private Sub MSComm1_OnComm()
Dim Eingang As String
Select Case MSComm1.CommEvent
Case comOverrun: MsgBox "Datenverlust!"
Case comRxOver: MsgBox "Datenverlust!"
Case comEvReceive: List1.AddItem MSComm1.Input
End Select
End Sub
Der Code im Prozessor ist das Testprogram2:
Code:
I = 0
Do
Incr I
Wait 1
Print "Hallo" ; I
Loop
Als Ergebnis bekomme ich folgendes in der List-Box:
( || bedeutet, dass da 2 seltsame schwarze balken kommen)
Hallo1||
Hallo2||
Hallo3||
Hallo4||
Hallo5||
Hallo6||
Hallo7||
Hallo8||
Hallo9||
Hallo10|
|
Hallo11|
|
Hallo12|
|
Meine Frage ist also: Warum kommen da so komische Balken nach dem empfangenen Wert? UND: Warum gibts immer nen neuen Eintrag in dem immer nur ein solcher Balken vorkommt. Schaut irgendwie wie ein Zeilenumbruch aber da es ne Liste ist geht das wohl nicht.
Bitte um Hilfe !!
mfg
jagdfalke
-
Soweit ich das in Erinnerung habe sind das Zeilenumbrüche, die in einer Listbox nicht als solche behandelt werden können, weil es da nur Einträge und keine Umbrüche gibt.
Es scheint das ganze nicht sorichtig synchron zu sein. Ansonsten musst du empfangene Zeilenumbrüche rausfiltern.
Die VB-Umgabungskonstante für einen Zeilenumbruch ist "vbCrLf"
-
Es scheinen wirklich Zeilenumbrüche zu sein. Ich hab das ganza mal in ne Textbox schreiben lassen.
Wenn multiline auf false ist, sind die Balken da. Wenn es auf false gestellt ist, sind sie weg: wahrscheinlich in echte Zeilenümbrüche umgewandelt.
Wie krieg ich das ganz denn dann synchron? Bzw. Wie kann ich die Zeilenübrüche rausfiltern?
-
Speicher den Input von der Comm-Schnittstelle vorher einmal in eine Variable und gehe die dann durch. Wenn du einen Text hast, der "Text" heißt filterst du wie folgt alle Zeilenumbrüche raus:
Code:
do
Text = Left(Text, instr(Text,vbcrlf)-1) & right(Text, len(Text)-instr(Text,vbcrlf))
until instr(Text, vbCrLf) = 0
-
Hi, ich hab das etz ein wenig anders gelöst, nachdem ich nen alten VB Schmöker gewälzt hab:
Code:
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.InputLen = 0
End Sub
Private Sub MSComm1_OnComm()
Dim Eingang As String
Dim Eingang_replaced As String
Select Case MSComm1.CommEvent
Case comOverrun: MsgBox "Datenverlust!"
Case comRxOver: MsgBox "Datenverlust!"
Case comEvReceive: Eingang = MSComm1.Input
End Select
Text1.Text = Replace(Eingang, vbCrLf, "")
VScroll1.Value = 255 - CInt(Replace(Eingang, vbCrLf, ""))
End Sub
Das komische ist: Es funktioniert alles wunderbar, bis ich das Fenster (während das proggy läuft) verschiebe. Dann steht in der textbox plötzlich ne ellenlange (nicht immer die gleiche) Zahl und die Fehlermessage lautet:
"overflow"
Was zum geier ist da los? liegt es am replace-Befehl?
-
Am replace-Befehl liegt es nicht. Ich hab auch deine Methode probiert.
Mist ich hab vergessen, dass sich der Aufbau mittlerweile geändert hat:
Ich bewege im Moment mit dem Prozessor einen Servo und übermittle immer die aktuelle Position an den COM1.
Hier die Subrouting im Prozessor, die den Servo bewegt und die Daten sendet:
Code:
Sub Rnb_servo(byval Servonummer As Byte , Byval Go_to_pos As Byte)
Local Schritt As Integer
If Curr_pos < Go_to_pos Then
Schritt = 1
Else
Schritt = -1
End If
For Curr_pos = Curr_pos To Go_to_pos Step Schritt
Open "comd.7:9600,8,n,1" For Output As #2
Print #2 , "#s" ; Chr(servonummer) ; Chr(curr_pos)
Close #2
Print Curr_pos
Waitms 10
Next
End Sub
-
Hm, also wenn das wirklich nur auftaucht, wenn man das Formular verschiebt dann solltest du mal folgendest testen:
- tritt gleicher Fehler auch bei der compilierten (.exe) Datei auf ?
- ist das Programm vllt. auch vor dem Verschieben nicht mehr stabil und hängt, der Fehler wird erst bei Aktion sichtbar ?
- wird das ganze somit wirklich unmittelbar mit dem Verschieben zusammenhängen ?
- Mir ist nur ein Fehler in dem Zusammenhang bekannt, dessen Lösung lautet Auto-Redraw Eigenschaft des Formulars auf true setzen.
-
Mir fällt sonst grad noch ein, dass es vllt. nicht unmittelbar an dem Programm liegen könnte sondern unmittelbar an den kommenden Daten oder an der Schnittstelle ???
Evt. anderen Rechner prüfen...
-
Ich hätte nie daran gedacht, dass es daran liegen könnte:
Ich hab eine VScroll-Bar mit reingebaut und den Wert der übergeben wurde durch die Scroll-Bar dargestellt. Mit Scroll-Bar freckt mir das Proggy ständig ab, aber ohne machter des ohne mit der Wimper zu zucken. Warum ist das so? ist die Übertragungsgeschwindigkeit zu schnell für die Scroll-Bar? (auch die ProgressBar funktioniert nicht.)
mfg
jagdfalke
-
Das könnte man ausprobieren, indem man Pausen einbaut. Ist denn die ober und Untegrenze der Scroll-Bar passende eingestellt ?