Archiv verlassen und diese Seite im Standarddesign anzeigen : probleme mit der seriellen verbindung
Ich hab hier ein Notebook mit serieller schnittstelle (genauer gesagt mit usb-seriell konverter) und eine c-control II auf meinem großen Roboter draufsitzen.
Das Programmieren der c-control funktioneirt auf diese art und weise perfekt, und auch der Empfang der , von der cc gesendeten daten funktioniert.
Nur wenn ich Zahlen (bytes) vom rechner aus an dei c-control senden will , dann kommt nur schrott dabei raus.
Im c-control Programmcode vewende ich zum auslesden der gesendeten daten im Moment den "get" befehl, aber auch bei input kommt nix gscheides dabei raus.
meine Frage :
wie muss ich ein byte (zahlen von 0 - 255) vom rechner aus senden , damit ich es in der c-control später in eine Byte-Variable auslesen (Print , get oder was anderes ? print ist doch nur für strings ???) und auswerten kann ?
so viele fragen auf ein mal ...
ich hoff , dass mir irgendjemand weiterhelfen kann ...
mfg
Michi
Amiwerewolf
27.06.2006, 00:56
hallo Michi (ich heiß übrigens auch so :-P )
also ich denke du hast nicht die C-Control 2 sondern die 1 (ist eigentlich eher Generation) weil du in basic programmierst.
also den input befehl kannst du vollig vergessen, weil er sich kaum auswerten lässt. besser ist da der befehl get, und put (von mir auch auch Print).
aber erstmal zum Put und Get.
mit den zahlen 0-255 definiest du eigentlich ein Zeichen, auch zeilenvorschub, escape, .... sind zeichen. einfach mal in google "Ascii Tabelle" eingeben.
Mal ein Beispielprogramm
<code>get 72 'sendet H
get 65 'sendet A
get 76 'sendet L
get 76 'sendet L
get 79 'sendet 0
</code>
genauso funtioniert es mit mit Put,
es wird allerdings immer nur ein Zeichen gelesen.
also der PC sendet <code>"HALLO"</code>, und du must 5 mal get benutzen.
ein <code>Print "AD1: ";port_ad1</code>
ist sinnvoll informationen lessbar im terminal auszugeben!
ein Print springt allerdings immer in die nächste zeile
meine erfahrung zeit ein handshake zeichen zu benutzen,
also in deinem fall nehmen wir ein "$" Zeichen her.
der PC sendet "$", mit get wird an der C-Control dann 36 emfangen
die C-Control sendet dann z.B. Print "HWOK" für Hardware ist da!
dann sendet der PC ein vordefinierten code, z.b. "e5Z"
dann 3 mal get in verschienden Vatiablen und dann zuweisen,
kleines beispiel:
<code>
#start
do
IF RXD THEN goto receiveddata
loop
#receiveddata
get handshake
if handshake <> 36 then goto start
Print "HWOK"
get a
get b
get c
byteport = a
DA1 = b
DA2 = c
goto start
</code>
das "IF RXD" frägt den ringpuffen nach einem vorhandenem byte ab und springt bei vorhanden in ein unterporgramm.
sonst wird die programmausführung am get angehalten.
ich geh jetzt ins bett gute nacht!
für mehr infos einfach posten!
gruß Michi
danke michi ...
ich hab mich n bisschen verschrieben . IChmein, ich hab die cc1 m-unit2,sorry.
Zuerst mal genauerses zumeinem Programm, ich glaub , ich hab das etwas undeutlich ausgedrückt ...
Ichhabhierein Beispielscript (von die-hard), mitdem man servos an port4und 5 steuern kann. Dieses script hab ich etwas umgeschrieben.
Um die servos anzusteuern , muss man mit dem sript nur nen integerwert zwischen 0 und 255 in byte[1] bzw.2 speichern.
Meine Absicht war, diese integerwerte über die serielle Verbindungan die cc zu senden, und dort in die Byte-variablen zu speichern.
Die eigentliche frage lautet alsokonkret:
wiesende ich ZAHLEN zwischen0 und 255 am gescheidesten auf die cc?
sorry ,dassich michso undeutlichausgedrückthab ...
ich hoff , mirkann trotzdem ncoh einer helfen
mfg
Michi
Suggarman
27.06.2006, 12:55
Ah, jetzt kommt Licht ins Dunkel....
Wenn Du eine 255 am PC sendest, dann mußt Du die C-Control 3 byte einlesen lassen. Du erhältst einen ASCII-Code. Wenn Du 48 davon abziehst, erhältst Du die Zahl selber. Nun noch eine mal 100, eine mal 10 und die dritte dazuaddieren und die erhältst die 255. Ich weiß im Moment nicht, in welcher reihenfolge die 3 Zahlen kommen. Viel Spaß beim Probieren.
mfg
Stefan
ah , thx , ich versuchs mal :)
mfg
michi
edit: tut auch , wenn man einfahc mit nem VB-programm das , in der ascii - tabelle dem wert zugewiesenen Zeichen sendet ...
ist aber komplizierter
DIE HARD
28.06.2006, 14:47
ah , thx , ich versuchs mal :)
mfg
michi
edit: tut auch , wenn man einfahc mit nem VB-programm das , in der ascii - tabelle dem wert zugewiesenen Zeichen sendet ...
ist aber komplizierter
Hallo....
In diesem Fall ist die INPUT Anweisung die bessere Wahl.
Das sollte so funktionieren, aber getestet hab ichs nicht.
Noch eine Info. Die alte OS Version 2.01 (2004) hat einen
Bug in der Input Routine. Aber davon solltest du nicht betroffen sein.
Welche OS Version hast du?
'--------------------------
'------ I/O PORTS ---------
'--------------------------
define SERVO1 port[4]
define SERVO2 port[5]
'--------------------------
'---- SYSTEM MEMORY -------
'--------------------------
define POS1 byte[1]
define POS2 byte[2]
'--------- SETTING AUTO SYSTEMCALL ----------------
SYS &HFD35
'--------- DRIVER PORTS TO OUTPUT -----------------
SERVO1=off:SERVO2=off
'--------------------------------------------------
'------ SETTING SERVO POSITIONS ---------
'------ ALTERNATING MIN/MAX POSITIONS ---------
'--------------------------------------------------
#b
INPUT POS1
INPUT POS2
goto b
'-------------------------------------------------
syscode "M20_SERVO_P4P5_PAGE0.s19"
thx =)
VB-code rechnerseitig:
i = ne andere variable mit irgendnem wert zwischen 0 und 255
MSComm1.Output = Chr(i)
@Die Hard : genau die Version hab ich ... 2.01, gekauft hab ich die cc Anfang 2005
mfg
Michi
DIE HARD
30.06.2006, 13:05
thx =)
VB-code rechnerseitig:
i = ne andere variable mit irgendnem wert zwischen 0 und 255
MSComm1.Output = Chr(i)
@Die Hard : genau die Version hab ich ... 2.01, gekauft hab ich die cc Anfang 2005
mfg
Michi
Ärgerlich, aber nicht schlimm. Guck hier:
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIII
'II WORKAROUND BUG "INPUT" (ser. Schnittstelle) by DIE HARD 09-04 I
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIII
' BETRIFFT BETRIEBSSYSTEM VERSION 2.01
'--------------------------------------------------------------------
' Die M 2.0 hat in diesem Teil des Betriebssystems einen Fehler
' Das Unterprogramm INPUTEMULATION übernimmt diese Funktion.
'---------------------------------------------------------------------
Define WERT word[1]
define INBYTE byte[4]
Wert=0
#loop
'input wert
gosub INPUTEMULATION 'ERSATZ FÜR INPUT
pause 50
Print "Ausgabewert"
Print wert
Goto loop
'-----------------------------------------------------------------
'---- UNTERPROGRAMM ZUM ERSATZ DER FUNKTION INPUT ---
'-----------------------------------------------------------------
#INPUTEMULATION
#INLOOP
get INBYTE
if INBYTE=&H2D then wert=-1 else WERT=1
if INBYTE=&H2D then get INBYTE
WERT=(INBYTE and &H0F)*WERT
#INLOOP2
get INBYTE:if INBYTE= &H0D then return
INBYTE=INBYTE and &H0F
if WERT<0 then WERT=WERT*10-INBYTE else WERT=WERT*10+INBYTE
goto INLOOP2
DANK =)
tut perfekt ...
thx euch allen & mfg
Michi
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.