runtime error in VB

OP #1125401
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
OP #1125457
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..
Gast #1125508
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.

###
OP #1125564
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.
Gast #1125585
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.
OP #1125597
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.
Gast #1125603
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.
(Firma: Q3) #1125608
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
OP #1125616
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.
OP #1125636
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.
Gast #1125648
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
Gast #1125650
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
OP #1125670
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.
Gast #1125675
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
Gast #1125679
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"
OP #1125738
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
Gast #1125739
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?
Gast #1126576
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren