PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrere Datenpakete in verschiedene Variablen speichern?



strunz
10.09.2007, 07:44
Hallo Leute,

ich bin zZ an einem Projekt, bei dem ich Daten vom Rechner zum Controller schicken will.

Ich will jetzt zB die Zahl 2378 an den Controller senden, dieser soll die Zahl dann als 2,378 sek interpretieren.

Das senden und empfangen funktioniert soweit, aber der Controller "sieht" nur die "8" und speichert mir auch nur die acht in einer Variablen alles andere was davor kam überschreibt er einfach.

Wie kann ich die ganze Zahl abspeichern, bzw jede Zahl in einer extra Variablen (also 2in die Variable "a", 3 in "b", 7 in "c" und die 8 in "d").

Anbei mein jetziger Code:



$regfile = "m32def.dat"
$crystal = 4000000
$baud = 9600 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space

'####Initialisierung############################## ##############################

Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.4 , Db6 = Porta.5 , Db7 = Porta.6 , E = Porta.2 , Rs = Porta.1
Config Lcd = 16 * 2

Initlcd 'LCD initialisieren
Cursor On Blink 'Cursor an blinkend

Dim I As Byte
Dim K As Byte

Config Servos = 1 , Servo1 = Portb.0 , Reload = 10 'Servo-Funktion von Bascom konfigurieren
On Urxc Onrxd 'Interrupt-Routine setzen


Cls
Locate 1 , 1
Lcd "Warte auf"
Locate 2 , 1
Lcd "LabView..."

'####StartHP####################
Startt:
Do
Enable Urxc 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen
Loop


'####Lesen Interrupt wurde ausgelöst####

Onrxd:
I = Udr 'Byte aus der UART lesen und in I ablegen

Enable Urxc
Enable Interrupts

'####Empfangenes Byte#####################

Cls
Locate 1 , 1
Lcd "Empfangen:"
Locate 2 , 1
Lcd I

Waitms 500

Gosub Startt

End


Achja, ich er speichert mir die Zahlen im ASCII Format (Also anstatt der "0" die "48")

PicNick
10.09.2007, 08:56
Auweia.
1. Entferne bitte sofort das "waitms" und das "Gosub" aus der Interrupt-Routine, bevor es jemand sieht und ihn der Schlag trifft.

2. DEr Datenverkehr über die UART geht byte-weise, und du willst offenbar 4 Byte übertragen.
Also mußt du wohl auch erstmal 4 Byte empfangen, bis deine "2378" komplett und zum Herzeigen sind.

Schau mal rein:
https://www.roboternetz.de/wissen/index.php/Bascom_UART_Input

strunz
10.09.2007, 10:14
Stimmt, hast recht, das gosub brauche ichgarnicht wegen des aktiven Interrupts (oder?).

Und das waitms ist auch überflüssig.....

Hoffentlich wurde keiner verletzt :-)

Ich schau mir mal die Seite an.

Danke für die Rasche antwort...

for_ro
10.09.2007, 11:22
Hallo,
ich habe das etwa so gemacht:
Config Serialin = Buffered , Size = 20, Bytematch=13 '(oder10?) warten bis RETURN empfangen
.
.
.
Serial0CharMatch:
while IsCharWaiting()
'Einsammeln der character, z.B. mit Inkey() und dann weiterverarbeiten
wend
return

Wenn du es ganz sauber machen willst, setzt du in der Interrupt Routine nur ein Flag und machst dann das Einlesen mit der While-Schleife im Hauptprogramm

Gruß

Rolf

PicNick
10.09.2007, 12:27
Zur Info:
"IsCharWaiting() rechnet aus den Variablen von "Config serialin=" aus, ob Zeichen da sind. Einen Extra-Flag muß man eigentlich nicht machen.

for_ro
10.09.2007, 14:47
Ich denke, Serial0CharMatch ist eine Interruptroutine und streng nach dem Motto "Interrupt Routine so kurz wie möglich" wird das Einlesen und Verarbeiten nicht mehr in der Routine selbst gemacht. Ist doch auch nicht nötig, geht im HP genauso.
Wenn die Anzahl der Befehle, die über SerialIn kommen, steigt, wird auch die Verarbeitung aufwändiger. Dann möchte ich erst damit anfangen, wenn ich weiß, dass der Befehl komplett ist, bei mir ein RETURN am Ende. Dass kann ich so ganz gut steuern.

Gruß

Rolf