www.mikrocontroller.net

Forum: PC-Programmierung runtime error in VB


Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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:
Option Explicit

Private Sub MSComm1_OnComm()

MSComm1.Settings = "9600,n,8,1"

End Sub

Private Sub Command1_Click()

Dim FREQF As String
Dim WF As String
Dim FREQ As Long
Dim ADD As Long
Dim ADDS As String

Dim s1 As String
Dim s2 As String
Dim s3 As String
Dim s4 As String

WF = Combo1.Text
Select Case WF
    Case "Sinus"
        FREQF = "0"
    Case "Rechteck"
        FREQF = "1"
    Case "Dreieck"
        FREQF = "2"
    Case "Sägezahn"
        FREQF = "3"
    Case Else
        FREQF = "0"
End Select

FREQ = CLng(Text1.Text)

If FREQ > 100000 Then
    FREQ = 100000
Else
If FREQ < 1 Then
    FREQ = 1
End If
End If

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

Label4.Caption = FREQ

ADDS = Hex(ADD)

While Len(ADDS) <> 8
    ADDS = "0" + ADDS
Wend

Label3.Caption = ADDS

s1 = Right$(ADDS, 2)
s2 = Mid$(ADDS, 5, 2)
s3 = Mid$(ADDS, 3, 2)
s4 = Left$(ADDS, 2)

MSComm1.CommPort = 8
MSComm1.PortOpen = True

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

MSComm1.PortOpen = False

End Sub

Private Sub Form_Activate()

Combo1.AddItem ("Sinus")
Combo1.AddItem ("Rechteck")
Combo1.AddItem ("Dreieck")
Combo1.AddItem ("Sägezahn")

End Sub

mfg Max

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Runtime Errors kommen nicht von USB-Kabeln!

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Route_66 (Gast)
Datum:

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

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

###

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank Esselbach (Firma: Q3) (qualidat)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank Esselbach (Firma: Q3) (qualidat)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Gast (Gast) war schneller

Autor: Max Stephany (masterjekkt)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
is1=(ADD AND &H0FF)
is2=((ADD/&H100) AND &H0FF)
is3=((ADD/&H10000) AND &H0FF)
is4=((ADD/&H1000000) AND &H0FF)

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na dann

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber immer erst auf den niedlichen USB-Kabeln rumhacken!

Autor: Max Stephany (masterjekkt)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.