PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vb - Bascom -RS232



PASCALU
20.01.2008, 10:37
Hallo zusammen bin gerade am eine serielle übertragung vom vb zum rncotrol zu machen. KOmischerweise komme ich zu deisem Resultat
(Ist für ne schrittmotoransteuerung in vb ) code vom rncotrol
$regfile = "m32def.dat"
' bei Mega 16 $regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000 'Quarzfrequenz
$baud = 9600
Dim X As Integer
Dim Y As Integer
Dim Ilinksschritt As Integer
Config Porta.2 = Output
Config Porta.3 = Output
Config Porta.4 = Output
Config Porta.5 = Output
Links_a Alias Porta.2
Links_b Alias Porta.3
Links_c Alias Porta.4
Links_d Alias Porta.5
Ilinksschritt = 0
Do
Input "Zahl" , X
If X > 0 Then
Y = 0
For Y = 1 To X
Incr Ilinksschritt
If Ilinksschritt > 4 Then
Ilinksschritt = 1
End If
Select Case Ilinksschritt 'Schritt für Linken Motor
Case 1:
Links_a = 1
Links_b = 0
Links_c = 1
Links_d = 0
Case 2:
Links_a = 1
Links_b = 0
Links_c = 0
Links_d = 1
Case 3:
Links_a = 0
Links_b = 1
Links_c = 0
Links_d = 1
Case 4:
Links_a = 0
Links_b = 1
Links_c = 1
Links_d = 0
End Select
Waitms 10
Next Y
End If
If X < 0 Then
For Y = X To -1
Incr Ilinksschritt
If Ilinksschritt > 4 Then
Ilinksschritt = 1
End If
Select Case Ilinksschritt 'Schritt für Linken Motor
Case 1:
Links_a = 0
Links_b = 1
Links_c = 1
Links_d = 0
Case 2:
Links_a = 0
Links_b = 1
Links_c = 0
Links_d = 1
Case 3:
Links_a = 1
Links_b = 0
Links_c = 0
Links_d = 1
Case 4:
Links_a = 1
Links_b = 0
Links_c = 1
Links_d = 0
End Select
Waitms 10
Next Y
End If
Loop
und der im vb

Private Sub Command3_Click()
MSComm1.Output = "12" + vbCrLf
End Sub ( nur ein Teil davon)
Die erste Zahl wird richtig eingelesen als zwölf und der Schrittmotor wird angesteuert doch eine zweite zahl (Private Sub Command2_Click()
MSComm1.Output = "16" + vbCrLf) wird als null eingelesen. Weiss jemand warum? Mit dem bascom eigenen terminal läuft es perfekt

peterfido
20.01.2008, 13:20
Ich mache immer ein eigenes Protokoll drum, welches Übertragungsfehler abfängt.
Das sieht in etwa so aus:

1. Startbyte (festgelegt, wenn dieses kommt, dann wird der Einganspuffer geleert, >127)
2. Längenbyte(Gibt die Länge des Strings an)
3. Daten
4. Prüfbyte, wo das letzte Bit auf jeden Fall gelöscht ist (<128), damit es nicht irrtümlich als Startbyte erkannt wird)
5. Passt alles wir ein "OK" zurückgesendet >fällt bei Einwegkommunikation weg

Zum senden nehme ich Subs, welche das Protokoll automatisch generieren .

Vitis
20.01.2008, 13:41
Dein fehler ist, Du übergibst einen String mit den Zeichen "16" z.B.
Der soll in eine Integer-Variable. Du hast nun zwei Möglichkeiten,
entweder du konvertierst im Vorfeld Deinen Wert von String nach
ASCII-Code, zerlegst deinen Integer-Wert in 2 Byte, ergo high und low-byte und überträgst sie separat im ascii-code, setzt sie per makeint wieder zusammen (klar, Overlayvariablen gehen auch),

oder der Controller soll aus dem String einen
Wert machen. Die passende
Also erstmal ne String-Variable definieren

dim tempstring as string * 5 z.B.

dann den String abfragen

input "wert", tempstring

dann Typumwandlung

x= val (tempstring)

PASCALU
20.01.2008, 19:05
hmm die zweite variante scheint schon mal nicht zu funktionieren teste mal noch dei andere .. das seltsame ist , dass die erste zahl erkannt wird nur die 2. 3. usw nicht ..