String empfangen

Bonze

Neues Mitglied
16. Jan. 2010
516
0
0
Altenkirchen (Pfalz)
Sprachen
  1. BascomAVR
ich würde gerne einen string vom pc empfangen und dann auf mein tft ausgeben,

Code:
Dim Text As String * 50
Text = "standart text"

Do
If Ischarwaiting() = 1 Then
   Text = Text + Chr(udr)
End If
loop

hab auch schon alles ausprobiert was ich ausem net gefunden hab ,.
 
Hallo Bonze,

ich hab' wenig mit Bascom gemacht, aber wie schickst du die Daten vom PC aus (mit CR&LF), wie ist deine Pufferung auf BASCOM-Seite?
So wie ich es sehe, liest du nur ein einzelnes Zeichen ein (do...loop Schleife)

Ich hab' hier im Forum (Hardware/U(S)ART)eine Routine beschrieben (inklusive der Einbindung), die prima funktioniert.


Schönen Abend noch
Werner
 
Hallo Bonze!

Soweit es mir bekannt ist.......
Wenn du eine Eingabe vom PC empfangen und abspeichern möchtest dann solltest du bedenken, dass die Zeichen im ASCII-Format übermittelt werden.

Du musst dann die Werte einzeln empfangen..... und die Zeichen der Reihe nach in deinen String ablegen.


Ach so....
Wenn du deinen String mit "String * 50" dimensionierst und im Code lediglich die Zeichen "aufaddierst" dann musst vor der nächsten Übertragung sicherstellen, dass der String auch wieder leer ist. Ansonsten stehen die nächsten Zeichen irgendwo mitten drin.

Schöne Grüße,
Cassio
 
Hi Bonze,

mit "50 Zeichen" dimensionierst du nur einen Puffer von maximal 50 (49) Zeichen. Wieviele Zeichen tatsächlich drinstehen, kommt auf das "Endekennzeichen" an. (EDIT: genauer gesagt, auf die Position des "Endekennzeichens" innerhalb des Puffers.)

In Bascom wird der String nullterminiert (also mit #0 als Endekennzeichen abgeschlossen - deswegen auch nur 49 "nutzbare" Zeichen).

LG
Werner
 
Nochmal ich,

da liegt auch "das/ein Problem": falls Bascom einen kompletten String einlesen soll, muss es ja ein Stringabschlusszeichen vom PC empfangen bzw. kennen, damit es deinen String nullterminieren kann :stupido2: .


LG
Werner
 
Und nochmal ich,

weil ich eigentlich mehr in Assembler programmiere, hab' ich mir mal das Assemblat (die Bascom Übersetzung) angeschaut.
Dort wird beim Programmstart/Reset der RAM-Bereich mit Nullen initialisiert. Wenn du jetzt immer nur ein einzelnes Zeichen einliest, steht dahinter automatisch ein #0 als Endekennzeichen. Damit hast du immer einen gültigen String von einem Zeichen Länge.


LG
Werner
 
ja das löst mein problem aber immernoch nicht,

wie kann ich jetzt alle zeichen lesen ?
EDIT:
ok soweit bin ich schonmal funzt,
Code:
 While Ischarwaiting() = 1
   'If Ischarwaiting() = 1 Then
      If Text = "standart text" Then
         Text = ""
      End If
         Text = Text + Chr(udr)
   'End If
   Wend
jetzt möcht ich nurnoch diesen komischen "Dominostein" am ende meines strings abschneiden,.
 
Hi Bonze,

lies' mal in einer Schleife jeweils ein Zeichen ein und addiere es zum String. Falls es chr(13) ist ersetze es durch chr(0), wonach du aufhören kannst.

Muss mal nachschauen, wie's in BASCOM syntaktisch geht.
Wie gesagt, ich hab's in Assembler geschrieben, weil ich Hochsprachen-Stringmanipulationen für extrem schwerfällig halte.

LG
Werner
 
so da wären wir :D
hehe, funktioniert, wie ich aufs erste testen konnte
wär ja nich so als würd ich mich nich auskennen, hab irgendwie dran gehangen mit dem text = text+chr(UDR)
so
Code:
Dim Buffer As String * 50
Dim Text As String * 50
Text = "standart text"

'uart interrupt aktivieren
Enable Urxc
On Urxc Empfangen
Enable Interrupts

Do
   Set Led1
   'Goto Scrollen
      Xyz = Xyz + 3.5
      Yzx = Yzx - 3.5

Call Lcdtext(text , Xyz , 5 , 5 , Red , Black )
Call Lcdtext(text , Yzx , 20 , 2 , Red , Black )

Reset Led1

Loop
End

Empfangen:
   If Udr = 13 Then
      Text = Buffer
      Buffer = ""
   Else
      Buffer = Buffer + Chr(udr)
   End If
Return

EDIT:
ok zu früh gefreut, der letzte Buchstaben wird immer abgeschnitten, und mir scheints als würde mein string jetzt andersrum zusammengebaut als ich das möchte, bzw der "Dominostein" ist jetzt auf der anderen Seite ,.
 
ja, toll, musste nicht in de string einbauen, ich teste im moment via putty, , muss ja irgendwie den string senden bzw auf ein endzeichen prüfen?
 
Versuch' mal das hier (hab's zumindest syntaktisch geprüft) in deriner empfangen-Routine:

Code:
If UDR = 13 Then
  Text = Buffer
  Buffer = ""
Else
  if UDR <> 10 Then Buffer = Buffer + Chr(UDR)
End If

LG Werner
 
mh ne, also habs im moment so stehn passiert nichts wenn ich auf absenden drücke,
Code:
 If Udr = 10 Then                                         'bei enter
      Text = Buffer
      Buffer = ""
      Xyz = 0
      Yzx = 0
   Else                                                     'bei jedem anderen zeichen ausser enter
      Buffer = Buffer + Chr(udr)
   End If

aber der domino stein kann ja enter nicht sein,
ich teste per realterm und schicke nach dem string nochn LF hinterher (also CHR10),das letzte zeichen wird trotzdem abgeschnitten ?!
 
so, mein code sieht jetzt so aus und soweit ich das sehen funktioniert er auch ,.
Code:
Empfangen:
   If Udr = 10 Then                                         'Wenn text ends(3) /LF(10) in UDR steht string beenden
      Text = Buffer
      Buffer = ""
      Print Text
   Else
      If Udr <> 13 Then                                     'bei Cr nicht in string schreiben
         Buffer = Buffer + Chr(udr)
      End If
   End If
Return

is zum Mäuse melken, ganz 100%ig funktionierts dann auch nich,.
 
Hallo Bonze,

hast Du Dir in BASCOM mal die Funktion INPUT angesehen und im nächsten Schritt die Compilereinstellung $serialinput?

Es könnte sein, dass Du damit besser zurecht kommst.

Grüße,
Markus
 
Ja und .... verstehe ich nicht .... ggf. kann man das doch wegfiltern ....
 
Hallo Bonze,

1.) Welche Baudrate und Taktfrequenz hast du eingestellt?
Es ist zwar wenig wahrscheinlich, aber du benutzt in der Interruptroutine das Empfangsregister (UDR) direkt, ohne es in einer Variablen zwischenzuspeichern. Der AVR hat nur ein 2-Byte Fifo (inklusive UDR) und wenn die Daten zu schnell kommen bzw. deine Verarbeitung zu langsam ist, könntest du Probleme bekommen.
Es liegt an der Art des Aufrufs der Interruptroutine, dass viel Overhead erzeugt wird; z.B. werden ALLE 32 Register gepusht und gepoppt - ich hoffe, auch das Statusregister. Das sind schon mindestens 2*(32+2)*2=136 (siehe unten) Taktzyklen, ohne dass irgendetwas "gemacht wird"!
Wenn dein AVR mit 4 MHz läuft, sind das schon 34 µs. Bei einer Baudrate von 19200 Bits/s kommst du schon fast an eine Bitlänge (52 µs) heran. Wenn du die Standardeinstellungen (8N1) benutzt, hättest du theoretisch noch 9 Bitlängen zur eigentlichen Verarbeitung Zeit.
So wie du das UDR benutzt (und so wie ich es verstanden habe), nützt dir das 2.-Fifo Byte nämlich nichts - durch den Lesezugriff auf UDR wird das Register wieder frei gegeben und das nächste übertragene Byte landet wieder dort.

Auch wenn's nicht so aussieht, so eine Übertragung ist nicht so unkompliziert, wie sie auf den ersten Blick aussieht. Man muss schon einiges an Hintergrundwissen haben - weil man stolpert immer wieder darüber (z.B. wenn du zu dem internen 1 MHz Oszillator wechseln würdest).

Die Pufferung, wie sie dir Markus vorgeschlagen hat, ist mehr als sinnvoll, wenn du auf Hochsprachenebene programmieren willst.


2.) Was hast du gegen Assembler ? < schau mal hier >
Die Routine funktioniert, ist schnell und du kannst genau sehen, was sie macht. Du könntest sogar die Taktzyklen abzählen oder zumindest recht gut abschätzen (was in einer Hochsprache relativ schlecht geht).


LG
Werner

P.S./EDIT: wenn das übertragene Zeichen direkt im UDR (bzw. dem freien Fifo-Register) zusammengebastelt wird (was ich nicht weiß), dann wäre die Übernahme in einer Variablen sogar zwingend erforderlich

P.P.S. Habe in der Bascom-Hilfe nachgelesen unter PUSHALL: es sind die Register R0-R5, R7,R10,R11 and R16-R31, also 7 weniger
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)