Ich weiß grad nicht mehr weiter. Wollte wie oben angegeben einen ATMega8
dazu bewegen Strings, welche er per RS232 erhält, zu zerhacken und die
Schnipsel entsprechend zu verarbeitet. Ein String über RS232 soll dabei
folgende Form haben: <Startbyte><Adresse><kommando><Optionale
Parameter><CR>. Bisher habe ich das ganze mit #001adr" getestet. Das
Zerhacken ist mir auch ganz gut gelungen, nur macht der µC danach was er
will. Später soll das Programm die Befehle über RS232 empfangen und über
eine Software UART passende kommandos über RS485 versenden (bin erst am
anfang;)). Hier erstmal der Code:
PrintA;" und ";Command'AusgabederTeilstringszurPrüfung
63
64
Else
65
New_command=""
66
67
EndIf
68
EndSub
Wie im Bild zu sehen zerlegt der AtMega den String scheinbar korrekt,
verarbeitet den dann aber nicht richtig weiter. Je nach lust und Laune
des Controllers tritt ein anderes Ereigniss für ein und den selben
Befehl ein. Erwartet habe ich eigentlich immer ein "Funktioniert 1".
Ich weiß grad keinen Rat mehr und hoffe das mir hier einer einen Tipp
geben kann was ich falsch gemacht habe/ anders machen sollte.
Juhu, ich hab rausgefunden woran das lag, war gestern wahrscheinlich
doch etwas zu müde:P. Falls mal jemand auch das Problem haben sollte:
In meinem Programmcode puffer ich ankommende Zeichen solange bis das
Zeichen <CR> empfangen wird. Ab da hüpfe ich mit interrupt in die Sub
Serial0charmatch(). Dort wird alles fein ausgeführt. Allerdings kehre
ich danach an genau die Stelle zurück, an der das Hauptprogramm vorher
unterbrochen wurde. Wenn das nun mitten im Code war erfolgt die
Auswertung der Variablen a und command nicht oder nicht korekt. Daher
erhielt ich nur äußerst selten eine korrekte Antwort.
Eine einfache Änderung am Code hilft jedoch damit das ganze wie
vorgesehen funktioniert:
1
Do
2
3
IfA<>""Then
4
IfA=AdresseThen'Adressprüfung
5
SelectCaseCommand'Selektionnachkommando
6
Case"ADR"
7
Print"Funktioniert 1"
8
Case"SBY"
9
Print"Funktioniert 2"
10
Case"RPM"
11
Print"Funktioniert 3"
12
CaseElse
13
Print"Case Else"
14
EndSelect
15
EndIf
16
17
A="":Command=""
18
EndIf
19
Loop
20
End
Ich kann mir aber denken das der empfang und das senden über die
serielle Schnittstelle eleganter gelöst werden könnte. Falls jemand dazu
ideen hat bitte posten:).
Matthias B. schrieb:> Ab da hüpfe ich mit interrupt in die Sub> Serial0charmatch().
Ich sehe zwar Enable Interrupts aber kein "ON interrupt label" in deinem
Programm.
Jup, da hast du recht. Ich hab das enable interruppts schon
eingeschrieben obwohl ich im Programm noch keine weiteren Interrupts
nutze. War sozusagen zur vorsorge weil ich später sicher noch nen Timer
nutzen werde. Das Serial0charmatch() wird automatisch angesprungen
sobald ein <CR> empfangen wurde.
Aber ich hab noch eine Frage: Ich nutze HTerm für die serielle
Kommunikation mit dem PC. Dort empfange ich immer noch ein <LF> vor dem
eigentlichen String der gesendet wurde (sieht man auch an den Bildern
oben). Woran kann das liegen bzw. wie kann man das verhindern?
Du empfängst nicht LF vor dem String. Das LF ist ein Überbleibsel aus
dem vorhergehenden String, der mit CR LF abgeschlossen wurde.
In Bascom, als auch in HTerm, kann man konfigurieren, wie ein Zeilende
gesendet werden soll.