www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mehrere Zeichen aus dem serielen Inputbuffer der AVRs lesen.


Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: leo9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dirk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

anbei nochmal ein code wie ich mehrere strings eingelesen hab

Mfg

Dirk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.