Forum: PC-Programmierung runtime error in VB


von Max S. (masterjekkt)


Lesenswert?

Hallo Leute,

Ich bin nahezu mit meinem Projekt fertig, wäre da nicht immer dieser 
blöde Runtime Error in VB6. Ich habe mir einen digitalen Signalgenerator 
gebastelt der nach dem DDS-Prinzip arbeitet und möchte ihn mit einem 
.exe-Programm das ich in VB6 geschrieben hab über USB auf dem Laptop 
ansteuern.
Auf dem Laptop ist ein Virtual Com Port Driver für das USB-Modul auf der 
Platine installiert und die Verbindung ist in Ordnung. Vorher habe ich 
das Senden von Daten über ein Testprogramm in VB getestet. Mit nur 1 
Byte klappt das wunderbar, kommt alles schön und gut bei meinem Atmega32 
an.

Nun zum Signalgenerator, wenn ich dem uC nur die Signalform mit meinem 
Hauptprogramm übermittle, zeigt das Oszilloskop auch das eingestellte 
Signal an, ob Sinus, Rechteck, Dreieck oder Sägezahn, alles in Ordnung. 
Aber bei der Frequenzeinstellung bekomme ich fast jedesmal einen 
"Runtime Error 13" in VB. Die Daten die für die Frequenz an den uC 
gesendet werden müssen betragen 32 Bit, diese habe ich allerdings in 4 x 
8 Bit aufgeteilt, schön von LSB zu MSB und übertrage diese inkl. der 
Signalform als ASCII-Zeichen. Bei 10 kHz, 10001 Hz und 75 kHz bekomme 
ich diesen Laufzeitfehler jedoch nicht, jedoch sind "kleine" 
Frequenzabweichungen auf dem Oszillo zu sehen.

Das versteh ich nicht, dauernd dieser runtime error und dann bei nur 3 
verschiedenen Frequenzen klappts. Wenn ich allerdings die 32 Bit nicht 
in eine Hex-Zahl und dann in ASCII-Zeichen umwandle, sondern sofort in 
einen String dann gibt es gar keinen runtime error mehr, jedoch ist die 
Frequenz dann völlig falsch.
Die Hardware meiner Schaltung funktioniert, das Programm auf dem uC 
auch.
Ich dachte es würde vlt am USB-Kabel liegen, das ist ungefähr 2m lang 
und nicht abgeschirmt, so dass Störungen von umliegenden Netzteilen etc 
einen Einfluss haben können.

Ansonsten, hier ist der VB-code:
1
Option Explicit
2
3
Private Sub MSComm1_OnComm()
4
5
MSComm1.Settings = "9600,n,8,1"
6
7
End Sub
8
9
Private Sub Command1_Click()
10
11
Dim FREQF As String
12
Dim WF As String
13
Dim FREQ As Long
14
Dim ADD As Long
15
Dim ADDS As String
16
17
Dim s1 As String
18
Dim s2 As String
19
Dim s3 As String
20
Dim s4 As String
21
22
WF = Combo1.Text
23
Select Case WF
24
    Case "Sinus"
25
        FREQF = "0"
26
    Case "Rechteck"
27
        FREQF = "1"
28
    Case "Dreieck"
29
        FREQF = "2"
30
    Case "Sägezahn"
31
        FREQF = "3"
32
    Case Else
33
        FREQF = "0"
34
End Select
35
36
FREQ = CLng(Text1.Text)
37
38
If FREQ > 100000 Then
39
    FREQ = 100000
40
Else
41
If FREQ < 1 Then
42
    FREQ = 1
43
End If
44
End If
45
46
ADD = (FREQ * (2 ^ 32) * 15) / 16000000
47
48
Label4.Caption = FREQ
49
50
ADDS = Hex(ADD)
51
52
While Len(ADDS) <> 8
53
    ADDS = "0" + ADDS
54
Wend
55
56
Label3.Caption = ADDS
57
58
s1 = Right$(ADDS, 2)
59
s2 = Mid$(ADDS, 5, 2)
60
s3 = Mid$(ADDS, 3, 2)
61
s4 = Left$(ADDS, 2)
62
63
MSComm1.CommPort = 8
64
MSComm1.PortOpen = True
65
66
MSComm1.Output = Chr$(s1) & Chr$(s2) & Chr$(s3) & Chr$(s4) & Chr$(FREQF)
67
68
MSComm1.PortOpen = False
69
70
End Sub
71
72
Private Sub Form_Activate()
73
74
Combo1.AddItem ("Sinus")
75
Combo1.AddItem ("Rechteck")
76
Combo1.AddItem ("Dreieck")
77
Combo1.AddItem ("Sägezahn")
78
79
End Sub

mfg Max

von Route_66 (Gast)


Lesenswert?

Runtime Errors kommen nicht von USB-Kabeln!

von Max S. (masterjekkt)


Lesenswert?

Davon bin ich ja auch nicht fest ausgegangen. Und doch, Laufzeitfehler 
können auch extern auftreten, jedenfalls so dass die Übertragung nicht 
sauber stattfindet. Ein paar uS Zeitverschiebung wärend des Sendens 
genügt schon. Das muss also nicht direkt am Programm liegen.
Ausserdem war das noch keine Antwort auf mein Problem..

von Route_66 (Gast)


Lesenswert?

Wenn deine Software externe Signale nicht korrekt behandelt und mit 
einem Runtime Error abschmiert dann ist immer die Software Schuld!!!

von ahnungslos (Gast)


Lesenswert?

(VB6 ist schon so lange her bei mir)

Run Time Error 13 sagt (glaube ich) "type mismatch", dass heisst, bei 
irgendeiner Zuweisung stimmen die Datentypen nicht.

Ich vermute hier:

  ADDS = Hex(ADD)

(Sagt dir nicht der Debugger wo genau der Fehle auftritt?). Kan die 
Hex-Funktion 1234.567 in Hex umwandeln?


Und noch 2 Anmerkungen:

>Private Sub MSComm1_OnComm()
>   MSComm1.Settings = "9600,n,8,1"
>End Sub

Die Settings gehören nicht ins OnComm Ereignis, sondern irgendwo zum 
Programmstart.

>MSComm1.CommPort = 8
 ...und das auch.

>MSComm1.PortOpen = True
>MSComm1.Output = Chr$(s1) & Chr$(s2) & Chr$(s3) & Chr$(s4) & Chr$(FREQF)
>MSComm1.PortOpen = False

Und ob der Port hier schon wieder geschlossen werden kann? Ist den immer 
Sichergestellt, dass alles zu Sendende auch schon gesendet wurde? 
Eigentlich öffnet/schliesst man den Port nicht ständig vor/nach dem 
Senden.

###

von Max S. (masterjekkt)


Lesenswert?

ahnungslos wrote:
> (VB6 ist schon so lange her bei mir)
>
> Run Time Error 13 sagt (glaube ich) "type mismatch", dass heisst, bei
> irgendeiner Zuweisung stimmen die Datentypen nicht.
>
> Ich vermute hier:
>
>   ADDS = Hex(ADD)
>
> (Sagt dir nicht der Debugger wo genau der Fehle auftritt?). Kan die
> Hex-Funktion 1234.567 in Hex umwandeln?

Nein sagt er nicht, einfach nur Type Mismatch und das wars. Beim 
Umwandeln rundet er automatisch auf oder ab. Das hab ich mit nem 
separaten Label getestet welches mir die Hex-Zahl anzeigt.

> Und noch 2 Anmerkungen:
>
>>Private Sub MSComm1_OnComm()
>>   MSComm1.Settings = "9600,n,8,1"
>>End Sub
>
> Die Settings gehören nicht ins OnComm Ereignis, sondern irgendwo zum
> Programmstart.

Hat nichts an der Sache geändert :S

>>MSComm1.CommPort = 8
>  ...und das auch.

Geht nicht, wenn ich den Port öffne kommt eine Meldung "Invalid Port 
Number". Muss also beim Öffnen des Ports geschehen.

>>MSComm1.PortOpen = True
>>MSComm1.Output = Chr$(s1) & Chr$(s2) & Chr$(s3) & Chr$(s4) & Chr$(FREQF)
>>MSComm1.PortOpen = False
>
> Und ob der Port hier schon wieder geschlossen werden kann? Ist den immer
> Sichergestellt, dass alles zu Sendende auch schon gesendet wurde?
> Eigentlich öffnet/schliesst man den Port nicht ständig vor/nach dem
> Senden.

Ich habe jetzt 2 Command Buttons eingefügt, mit dem einen öffne, mit dem 
anderen schliesse ich den Port. Doch wenn ich nach dem Öffnen auf "Send" 
klicke kommt immer noch derselbe runtime Fehler.

von ahnungslos (Gast)


Lesenswert?

Aber der Debugger muss dir eigentlich die Stelle zeigen (-> natürlich 
nicht die EXE starten, sondern das Programm in der IDE laufen lassen). 
Es wird dann direkt die Zeile markiert, an der der Fehler auftritt.

Da kannst du dein Programm ja auch step-by-step durchlaufen und siehst 
dann den Fehler.

Und btw: Runtime-Errors sind immer Programmierfehler. Und zur 
Fehlervermeidung würde ich keine implizite Typwandlung machen, sondern 
die Wandlung immer explizit angeben.

Z. B.:

>ADDS = Hex(ADD)

 ADDS = Str(Hex(ADD))

(Ich glaube Str() ist die Syntax). So kann mann immer sehen, was gemacht 
wird.

von Max S. (masterjekkt)


Lesenswert?

Nun der Fehler liegt immer in dieser Zeile:

MSComm1.Output = Chr$(s1) & Chr$(s2) & Chr$(s3) & Chr$(s4) & Chr$(FREQF)

Habe die Zeichen auch einzeln schon mal ausgegeben:

MSComm1.Output = Chr$(s1)
MSComm1.Output = Chr$(s2)
.
.
.

Hilft auch nix. Aber ich möchte wissen was genau der Fehler ist, in 
welcher Zeile er liegt ist ja schon gut aber noch keine Lösung wert.

>ADDS = Str(Hex(ADD))

Gibt er komischerweise auch einen runtime error an, obwohl ADDS dann ja 
noch immer ein string ist. Mit CStr() funzt es auch nicht.

von ahnungslos (Gast)


Lesenswert?

Dann gib' dir doch mal direkt vor der Zeile

>MSComm1.Output = Chr$(s1) & Chr$(s2) & Chr$(s3) & Chr$(s4) & Chr$(FREQF)

den Inhalt der Variablen (s1,s2,s3,s4,FREQF) per MsgBox aus um zu sehen, 
was drinnen steht.

MsgBox("s1 = " & s1)
MsgBox("s2 = " & s2)
MsgBox("s3 = " & s3)
MsgBox("s4 = " & s4)
MsgBox("FREQF = " & FREQF)
MSComm1.Output = Chr$(s1) & Chr$(s2) & Chr$(s3) & Chr$(s4) & Chr$(FREQF)

(Ich hoffe, die Syntax für MsgBox stimmt so...)

A.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

>MSComm1.Output = Chr$(s1) & Chr$(s2) & Chr$(s3) & Chr$(s4) & Chr$(FREQF)


Du möchtest doch die Zeichen aneinanderketten und nicht logisch 
verknüpfen, oder? In Basic werden Zeichenketten mit "+" verbunden, das 
könnte die Ursache für deine Fehlermeldung sein.

Frank

von Max S. (masterjekkt)


Lesenswert?

Frank Esselbach wrote:
>>MSComm1.Output = Chr$(s1) & Chr$(s2) & Chr$(s3) & Chr$(s4) & Chr$(FREQF)
>
>
> Du möchtest doch die Zeichen aneinanderketten und nicht logisch
> verknüpfen, oder? In Basic werden Zeichenketten mit "+" verbunden, das
> könnte die Ursache für deine Fehlermeldung sein.
>
> Frank

Nein, mit dem "&" möchte ich die Zeichen nur hintereinander schicken, 
nicht verketten.

@ ahnungslos (Gast) ich habe s1-s4 und FREQF per msgbox ausgegeben, kein 
Problem. Z.B. bei 1500 Hz und Rechteck: s1 = F6, s2 = 28, s3 = 5C, s4 = 
00 und FREQF = 01. So wie VB das auch übertragen soll, was es aber nicht 
tut.

von Gast (Gast)


Lesenswert?

ADD = (FREQ * (2 ^ 32) * 15) / 16000000

In Long geht maximal 2^31 rein. Wieso rechnet man das nicht mit Doubles 
und konvertiert das ganze dann mit Grenzwertbetrachtung nach Long?

Gast

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

> Nein, mit dem "&" möchte ich die Zeichen nur hintereinander schicken,
> nicht verketten.

Probier' es bitte trotzdem mal: ersetze die "&" durch "+" und schreibe 
hier, was passiert.

Frank

von Max S. (masterjekkt)


Lesenswert?

Frank Esselbach wrote:
>> Nein, mit dem "&" möchte ich die Zeichen nur hintereinander schicken,
>> nicht verketten.
>
> Probier' es bitte trotzdem mal: ersetze die "&" durch "+" und schreibe
> hier, was passiert.
>
> Frank

Funzt auch nicht. Danke trotzdem.

von Max S. (masterjekkt)


Lesenswert?

Gast wrote:
> ADD = (FREQ * (2 ^ 32) * 15) / 16000000
>
> In Long geht maximal 2^31 rein. Wieso rechnet man das nicht mit Doubles
> und konvertiert das ganze dann mit Grenzwertbetrachtung nach Long?
>
> Gast

Dann frag ich mich wieso es bei 10000 Hz klappt und bei z.B. 1 Hz nicht. 
Der Formel nach erhält man bei 10000 einen grösseren Wert als bei 1.

von dave (Gast)


Lesenswert?

ich verwende das Comm-control normalerweise auf dieser Art:

Private Sub Form_Load()
  With MSComm1
    .CommPort = 8
    .Settings = "9600,n,8,1"
    .RThreshold = 1
    .SThreshold = 1
    .PortOpen = True
  End With
End Sub

Private Sub Form_Unload(Cancel As Integer)
  MSComm1.PortOpen = False
End Sub

von ahnungslos (Gast)


Lesenswert?

versuch mal

sTest As String



sTest = Chr$(s1) & Chr$(s2) & Chr$(s3) & Chr$(s4) & Chr$(FREQF)
MsgBox (sTest)
MSComm1.Output = sTest


Und schreib mal das Ergebnis (inhalt von sTest), bei demes funktioniert 
und eines, bei dem es nicht funktioniert.

A

von Max S. (masterjekkt)


Lesenswert?

ahnungslos wrote:
> versuch mal
>
> sTest As String
>
>
>
> sTest = Chr$(s1) & Chr$(s2) & Chr$(s3) & Chr$(s4) & Chr$(FREQF)
> MsgBox (sTest)
> MSComm1.Output = sTest
>
>
> Und schreib mal das Ergebnis (inhalt von sTest), bei demes funktioniert
> und eines, bei dem es nicht funktioniert.
>
> A

BBB und dann ein Quadrat zum Schluss bei dem wo es geht. (10000 Hz)
Type Mismatch kommt sofort bei dem wo es nicht funktioniert ohne msgbox.

von Gast (Gast)


Lesenswert?

Hallo,
meiner Meinung ist der Type Mismatch in den Chr() aufrufen mit einem 
String, Chr() erwartet eine Zahl! Ein String muss zuerst in eine Zahl 
gewandelt werden, was mit einem Hexsting nicht geht!

Gast

von ahnungslos (Gast)


Lesenswert?

Na, da haben wir doch den Fehler:

War es nicht so, dass bei Chr$(x) das 'x' ein Integer ist (ASCCI-Wert)?

Chr$(33) ergibt "!"
Chr$(65) ergibt "A"

s1="65"
Chr$(s1) ergibt "A"

s1="A0"
Chr$(s1) ergibt "Runtime Error 13"

von ahnungslos (Gast)


Lesenswert?

@Gast (Gast) war schneller

von Max S. (masterjekkt)


Lesenswert?

Wie wandle ich s1-s4 in integer um? Mit z.B. s5 = Int(s1) und s5 = 
CInt(s1) funktionierts nicht.

von Gast (Gast)


Lesenswert?

is1=(ADD AND &H0FF)
is2=((ADD/&H100) AND &H0FF)
is3=((ADD/&H10000) AND &H0FF)
is4=((ADD/&H1000000) AND &H0FF)

von Max S. (masterjekkt)


Lesenswert?

Gast wrote:
> is1=(ADD AND &H0FF)
> is2=((ADD/&H100) AND &H0FF)
> is3=((ADD/&H10000) AND &H0FF)
> is4=((ADD/&H1000000) AND &H0FF)

Wow danke! Signalgenerator funzt jetzt zu 100%. Ohne eure Hilfe würde 
ich noch Wochen daran fummeln ohne dass sich was tut. Leider sind meine 
Kenntnisse in VB ziemlich eingeschränkt da ich mich mehr mit Elektronik 
beschäftige, ehrlich darauf wär ich jetzt nicht gekommen. Danke 
nochmals! :-)

mfg Max

von ahnungslos (Gast)


Lesenswert?

Wie ich es verstehe, willst du einen String senden. s1-s4 sind aber 
schon strings. Also:

MSComm1.Output = s1 & s2 & s3 & s4 & CStr(FREQF)


Aber was genau erwartet der Empfänger?

s1 = "65"

Soll jetzt "65" (00000110 00000101) , oder 65 (01000001) gesendet 
werden?

von ahnungslos (Gast)


Lesenswert?

na dann

von Route_66 (Gast)


Lesenswert?

Aber immer erst auf den niedlichen USB-Kabeln rumhacken!

von Max S. (masterjekkt)


Lesenswert?

Route_66 wrote:
> Aber immer erst auf den niedlichen USB-Kabeln rumhacken!

Dies war ja nicht mein fester Verdacht sondern nur eine Vermutung ;-)
Heutzutage muss man schon aufpassen mit was man arbeitet.

von ahnungslos (Gast)


Lesenswert?

Naja, bei einem "run time error" das USB-Kabel zu verdächtigen wäre etwa 
so, als ob man bei beim Erwischtwerden mit überhöhter Geschwindigkeit 
dem Reifen die Schuld gibt... ;-)

Ein "run time error" ist quasi das zur Laufzeit, was beim Programmieren 
der "syntax error" ist - und damit liegt die Schuld immer beim 
Programmierer. Das kann allerdings auch der Programmierer einer 
unsauberen programierten Komponente sein, die du verwendest.

A

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.