HI! Ich versuche seit einigen Tagen an meinen Roboter einen Slave-Prozessor anzuschließen. Das funktioniert auch ganz gut, bis auf das auslesen der Kommandos. Also: Mein Master-Prozessor (Mega16) sendet über UART mehrstellige Textkommandos (z.B.: "res", "mot" usw.) an den Slave-Prozessor(AT90S4433). Ich kann, wenn ich 1 Zeichen verschicke, (zb. "r") das wunderbar mit Inkey() auslesen. Das funktioniert auch prima. Nun suche ich einen Befehl oder einen Codeschnipsel, der das gleiche tut wie Inkey, nur für mehr als ein Zeichen, dass ich oben erwähnte Befehle auswerten kann. Versteht ihr, wie ich das meine? Ich programmiere mit BASCOM AVR. Leute helft mir bitte! Das bringt mich noch zur Weißglut. Liebe Grüße, Tobi
vielleicht hilft ein wenig pseudocode am Weg zur Lösung: einst$ = "" while (1) do c$ = inkey() if ( c$ <> "" ) einst$ = einst$ + c$ if right$(einst$) = "res" call do_res einst = "" end if right$(einst$) = "mot" call do_mot einst = "" end end grüsse leo9
Hi, leo9 Im Moment geht's mir nur ums einlesen. Der Rest ist das kleinere Problem. Mann kann die Befehle ja dann mit switch oder select, oder wie auch immer das heißt, aussuchen, nur man muss sie vorher erst mal haben. :) Ich habe das so schonmal getestet, wie du das aufgeschrieben hast, aber es hat nicht funktioniert. Entweder war ich zu doof oder... Trozdem vielen vielen vielen DANK!!!!!! Jeder Zipfel ist im Moment Gold wert! Liebe Grüße, Tobi!
Hi, wieso versendest du ganze Strings? Bau Dir doch lieber ein Protokoll auf .... Damals hab ich alles ueber Inputbin gemacht .... Beispiel : Inputbin startbyte, befehl, crc, endbyte Wenn du moechtest suche ich es zu heute abend raus. Mfg Dirk
Setzte doch einfach einen Interrupt auf URXC (z.B. On URXC RecRXC). Damit verpasst Du kein Zeichen und mußt auch nicht ständig pollen. In der Interruptroutine kannst Du dann die Befehlswörter zusammensetzen z.B. (RecBYTE = UDR) Gruß, Toni
HI Dirk! Wie das funktioniert, ist eigentlich egal. Hauptsache, meine Motoren und Servos lassen sich gut und präzise ansteuern... Ich hätte halt ein Protokoll auf Strings aufgebaut. Das wäre SUPERTOLL wenn du mir einen Ausschnitt aus deinem Code schicken könntest!!!!!!!!!!!!!!!!! TO BE CONTINUED... Liebe Grüße und Danke!!!!!, Tobi
Hi BASCOM ist zwar nicht mein Ding, aber: der Input-Buffer fasst nur ein Byte, da kannst du also keine drei Byte langen Texte rauslesen. Also musst du (wie oben hervorragend gezeigt) jedes Zeichen einzeln auslesen und zu deinem gewünschten String zusammenbasteln. Allerdings frage ich mich was das soll? Reicht nicht ein Byte zur Unterscheidung der Befehle? Warum stopfst du den AVR mit Strings zu? Seine Stärken liegen im Byte-orientierten Arbeiten und nicht in der "Tectverarbeitung". Sicher, in einer Hochsprache wie BASCOM sieht das alles einfach aus, aber hast du mal darüber nachgedacht, wie umfangreich die Abarbeitung wird? Da werden noch und nöcher Ressourcen verschwendet. Vorschlag: Nimm ein Zeichen (ASCII-Wert) als eindeutige Kennung für Befehle, ein Folgezeichen, welches den Befehl eindeutig identifiziert, und dann, falls erforderlich, noch die Parameter. So brauchst du nur regelmäßig den Empfangsbuffer auslesen und auf "Befehlskennung" prüfen. Erst wenn diese eintrifft aktivierst du die Auswertung, die dann den Rest einliest und abarbeitet. MfG, Heinz
Hi, anbei mal der Codeausschnitt Inputbin Temp1 If Temp1 <> Sync Then Goto _start Else Inputbin Temp2 , Device , Commando , Lencommando ' Get Commando For Count = 1 To Lencommando Inputbin Temp1 Cbytes(count) = Temp1 Next Count Inputbin Crc If Temp2 <> Adress Then Goto _start End If End If Gosub Crccalc If Crc <> Temp1 Then Print "CErr"; Response = &H00 Responsestr = "" Gosub Sendresponse Goto _start Else Gosub Devicecheck End If Responsestr = "" Goto _start End Recievecommando: Inputbin Temp2 , Device , Commando , Lencommando For Count = 1 To Lencommando Inputbin Temp1 Cbytes(count) = Temp1 Next Count Inputbin Crc Return Sendresponse: Printbin Sync Printbin Adress; Printbin Device; Printbin Response; Lenresponse = Len(responsestr) Printbin Lenresponse; Temp1 = 63 Temp1 = Temp1 Xor Adress Temp1 = Temp1 Xor Device Temp1 = Temp1 Xor Response Temp1 = Temp1 Xor Lenresponse If Lenresponse > 0 Then For Count = 1 To Lenresponse Temp1str = Mid(responsestr , Count , 1) Printbin Temp1str Temp1 = Temp1 Xor Asc(temp1str) Next Count End If Printbin Temp1 Return Crccalc: Temp1 = 63 Temp1 = Temp1 Xor Temp2 Temp1 = Temp1 Xor Device Temp1 = Temp1 Xor Commando Temp1 = Temp1 Xor Lencommando For Count = 1 To Lencommando Temp1 = Temp1 Xor Cbytes(count) Next Count ' Print "Calculated CRC: " ; Temp1 Return Devicecheck: Select Case Device Case &H11 : Gosub Commandcheck11 'Device I2CDialer 'Case &H12 : Gosub Commandcheck12 'Case &H13 : Gosub Commandcheck13 Case Else : Response = &H01 Responsestr = "" Gosub Sendresponse Goto _start; End Select Return Commandcheck11: Select Case Commando Case &H10 : Gosub D11c10 'Case &H11 : Gosub D11c11 Case Else Response = &H02 Responsestr = "" Gosub Sendresponse Goto _start; End Select Gosub Sendresponse Mfg Dirk
Hi, anbei nochmal ein code wie ich mehrere strings eingelesen hab Mfg Dirk
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.