PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 Telegramm????



kalletronic
25.11.2008, 21:34
Hi Leute,

hab mal wieder was zusammengeschustert und wollte euch mal fragen ob man das so gut gehn lassen kann oder ob ich da was verbessern kann.
Es soll so eine Art Telegramm für die RS232 werden, ich möchte es dazu verwenden, um Daten von meinem Rechner zum Bot zuschicken und umgekehrt. ich hoffe ich habs gut genug beschrieben :-k
Hier mal der Code



'
'Befehle über RS232 / RS485
'Erstellt 10.04.2008 By Kalle
'
'Befehlszusammensetzung:
' se06255xxx
' ^ ^ ^ ^
' | | | |
' | | | Checksumme
' | | Aktion z.B bei Servos Position (hier 255)
' | Bei mehreren Geräten gleichen Typs z.B se06... für Servo 6
' Belehlstyp z.B. se für Servo

$regfile = "m32def.dat"
$crystal = 16000000


Declare Sub Notaus()

Enable Interrupts



'*** Variablendeklaration ***
Dim Befehl As String * 10
Dim Befehllaenge As Byte
Dim Typ As String * 2
Dim Nummer As String * 2
Dim Aktion As String * 3
Dim Fehler As String * 10
Dim Checksumme As String * 3


Dim Nummerbyte As Byte
Dim Kanal(16) As Byte
Dim Aktionbyte(4) As Byte

Dim Fehlerlaenge As Byte
Dim Adrbyte As Byte
Dim Varcrc As Byte
Dim Checkbyte As Byte

'*** Hauptprogramm ***

Do

Input Befehl

Varcrc = Crc8(befehl , 7) 'Checksumme berechnen
Checksumme = Right(befehl , 3) 'Checksumme aus Zeichenkette auslesen
Checkbyte = Val(checksumme)
If Varcrc = Checkbyte Then 'Wenn Checksummen gleich ...
Befehllaenge = Len(befehl)
If Befehllaenge > 0 Then
Gosub Befehlserkennung '... Zeichenkette auswerten
End If
Else
Fehler = "ERRChec"
Call Notaus()
End If

Fehlerlaenge = Len(fehler)
If Fehlerlaenge > 0 Then
Print Fehler
Fehler = ""
End If
Loop




'*** Unterprogramme ***

Sub Notaus()
'Befehle für NotAus hier einfügen
End Sub


'*** Zeichenkette asuwerten ***

Befehlserkennung:

Typ = Left(befehl , 2) 'sucht 1. und 2. Zeichen von links (Typ)
Nummer = Mid(befehl , 3 , 2) 'sucht 3. und 4. Zeichen von links (Nummer)
Aktion = Mid(befehl , 5 , 3) 'sucht 5., 6. und 7. Zeichen Zeichen (Aktion)
If Befehllaenge <> 10 Then Fehler = "ERRLang"

Return

'*** Aktion Ausführen ***

Ausfuehrung:

Return



Freue mich schon auf Kritik

Gruß Kalle

marvin42x
26.11.2008, 11:13
wenn es ein Telegramm sein soll wird es eine Adresse brauchen und eventuell einen Absender. Also das, was Du jetzt im Beispiel als Servo bezeichnest und als Untergruppe die 06
kann auch sein, dass du eine Bestätigung brauchst ob es angekommen ist.
Es gibt für diese Strecke Mikro – PC über RS232 ein Telegramvorschlag der etwas aufwendiger ist, aber sicher als Anregung dienlich sein kann.
Hier der Link:
http://www.marvins-lab.roboterbastler.de/index.html
Dort gibt es auch Links in die Wiki, in der das auch noch mal ausführlich beschrieben wird.

Netter Gruß

kalletronic
26.11.2008, 12:58
Hi, danke für die Antwort, ich werds mir mal ansehn

Gruß Kalle

kalletronic
16.01.2009, 16:29
Hi Leute,

ich hatte grad ne neue Idee für ein "Telegramm", es sollte so aussehn:

Adresse!Aktion!Typ!Eigenschaft!Wert!eventuell Checksumme$
für Adresse: Main(PC) mc1(Controller)...
für Aktion: Get oder Set
für Typ: Mot(Motor), Ser(Servo)...
für Eigenschsft: Speed, Position,...
für Wert: den Wert

meine Frage nun, wie kann ich herausfinden wann die einzelnen Parameter beginnen bzw aufhören? Als Trennzeichen hab ich das ! und als Endzeichen das $.

Das Grundprogramm für den empfang wollte ich so realisieren:

$regfile = "m32def.dat"
$crystal = 16000000 'Quarzfrequenz
$baud = 9600


Config Serialin = Buffered , Size = 30





Dim Telegramm As String * 30

Enable Interrupts
Print "Start"
Do
'get a char from the UART
If Ischarwaiting() = 1 Then 'was there a char?
Input Telegramm
Print Telegramm 'print it
End If
'wait 1 second

Loop



Danke im Voraus für eure Hilfe

Gruß Kalle

kalletronic
16.01.2009, 17:07
Habs grad selbst herausgefunden, trotzdem danke !

$regfile = "m32def.dat"
$crystal = 16000000 'Quarzfrequenz
$baud = 9600


Config Serialin = Buffered , Size = 30


Dim Ar(6) As String * 7
Dim Bcount As Byte
Dim Telegramm As String * 30
Dim E_adr As String * 7
Dim E_aktion As String * 7
Dim E_typ As String * 7
Dim E_property As String * 7
Dim E_wert As String * 7
Dim E_check As String * 7
Dim I_wert As Integer
Dim B_wert As Byte
Dim I As Byte

Enable Interrupts
Print "Start"
Do
'get a char from the UART
If Ischarwaiting() = 1 Then 'was there a char?
Input Telegramm
Print Telegramm 'print it

Bcount = Split(telegramm , Ar(1) , "!") 'Aufteilen des Telegramms auf Arryes

E_adr = Ar(1)
E_aktion = Ar(2)
E_typ = Ar(3)
E_property = Ar(4)
E_wert = Ar(5)
E_check = Ar(6)


End If
Loop

kalletronic
24.01.2009, 16:28
Hi Leute

kann mir mal jemand sagen warum das so nich funktioniert?
Wenn ich das ganze mit dem Terminal Emulator von Bascom teste geht es zwar, aber die Variable Ar(5) bleibt leer, bzw verschiebt sich nach Ar(6)
Versuch ichs mit dem VB-Programm geht es beim 1. mal nach dem Reset und beim 2. mal wird das halbe Telegramm "verschluckt".
ich hock jetzt schon fast 2 Tage dran und bin jetzt voll am verzweifeln.
Hier mal das bascom-Programm und das VB-Programm als rar-Archiev:



$regfile = "m32def.dat"
$crystal = 16000000 'Quarzfrequenz
$baud = 9600

Config Pinc.7 = Output
Config Serialin = Buffered , Size = 30

Const My_adr = "mc1"

Dim Ar(6) As String * 5
Dim Bcount As Byte
Dim Telegramm As String * 30
Dim E_adr As String * 5
Dim E_aktion As String * 5
Dim E_typ As String * 5
Dim E_property As String * 5
Dim E_wert As String * 5
Dim E_check As String * 5
Dim I_wert As Integer
Dim B_wert As Byte
Dim I As Byte

Enable Interrupts
Print "Start"

Portc.7 = 1
Sound Portd.7 , 400 , 450
Do

'get a char from the UART
If Ischarwaiting() = 1 Then 'was there a char?
Sound Portd.7 , 400 , 450
Input Telegramm
Print "angekommen" 'nur zu testzwecken
'Portc.7 = 1
'Waitms 200
'Portc.7 = 0 'print it

Bcount = Split(telegramm , Ar(1) , "!") 'Aufteilen des Telegramms auf Arryes

'Print Ar(1)
If Ar(1) = My_adr Then
E_adr = Ar(1)
E_aktion = Ar(2)
E_typ = Ar(3)
E_property = Ar(4)
E_wert = Ar(5)
E_check = Ar(6)
Else
E_adr = ""
E_aktion = ""
E_typ = ""
E_property = ""
E_wert = ""
E_check = ""
End If

End If

If Len(ar(1)) > 0 Then
For I = 1 To Bcount 'Telegramm und Arreys löschen
Print Ar(i) ; I
Ar(i) = ""
Next
End If
Telegramm = ""
Loop[/code]

Pyro-Mike
25.01.2009, 21:52
Ich glaub, ich hab was gefunden, was dir vielleicht hilft:
Aus der Bascom Hilfe

It is also important to know that the individual elements of the array need to be big enough to store the string part.

For example when the array has 5 elements and each element may be 10 characters long, a string that is 11 bytes long will not fit. Another element will be used in that case to store the additional info.

kalletronic
26.01.2009, 20:38
Hi

@Pyro-Mike das kanns eigendlich nich sein, da mein längster string max 5 zeichen enthält...