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


von Tobi (Gast)


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

von leo9 (Gast)


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

von Tobi (Gast)


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!

von Dirk (Gast)


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

von Toni (Gast)


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

von Tobi (Gast)


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

von Heinz (Gast)


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

von Dirk (Gast)


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

von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.