mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom UART zeichen auswerten


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Mario N. (mariotg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe ein kleine Problem

Ich bekomme von einem Gerät folgende daten gesendet:

<02><0D>
<0A>
TT=563ms OTL=0mm CC=1 OI=17413<0D>
<0A>
67868650<0D>
<0A>
  25IL 100% ST=0 RA=32 CL=_8 CS=__2 DIR=1 OD=120 FC=0<0D>
<0A>
<0D>
<0A>
<03>

gibt es eine einfach möglichkeit nur die Position der zahl 67868650 
(Barcode) auf einem LCD anzeigen zu lassen :-)

wäre über hilfe sehr dankbar

gruß Mario

Autor: c-hater (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Mario N. schrieb:

> gibt es eine einfach möglichkeit nur die Position der zahl 67868650
> (Barcode) auf einem LCD anzeigen zu lassen :-)

Wenn du die Stelle findest, wo eben diese Postion übermittelt wird: 
warum sollte das nicht möglich sein?

Autor: Volker (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Zwei mal CR in LF, dann kommt dein Wert

Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Was ist denn für die Position? Das wievielte Zeichen im Datensatz?

Ist doch so schön verpackt, geht fast von alleine.
Und wenn ich mich recht erinnere, hat doch gerade Basic rel. 
umfangreiche Stringfunktionen (braucht man hier aber eigentlich gar 
nicht).
Such das zweite 0x0a.

Autor: Mario N. (mariotg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja aber wie kann ich das machen :-( evtl ein beispiel ?

Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
charpos () sollte das richtige sein.

Autor: Mario N. (mariotg)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
es zählen doch nur die "normalen zeichen" als bit in einem String 
richtig ??

Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Bit?
Alle Zeichen zählen, ausser 0x00, das wäre das stringende.
Also auch 0x02,0x03,0x0d, 0x0a und 0x20.

Autor: Mariotg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke ja ich versuche das morgen mal

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Den Text etwas anders formatieren, und Du erkennst die Regelmäßigkeiten 
einfacher:
Start   <02>
Zeile 1 <0D><0A>
Zeile 2 TT=563ms OTL=0mm CC=1 OI=17413<0D><0A>
Zeile 3 67868650<0D><0A>
Zeile 4 25IL 100% ST=0 RA=32 CL=_8 CS=__2 DIR=1 OD=120 FC=0<0D><0A>
Zeile 5 <0D><0A>
Stop    <03>

Jede Zeile wird von der Zeichenfolge CR+LF (0d, 0a) abgeschlossen.

Du willst den Inhalt der dritten Zeile auswerten.

Autor: Mario N. (mariotg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das sehe ich ja leider brauche ich ein Beispiel wie ich da hin komme

habe leider kein bespiel gefunden dazu :-(

Start   <02>
Zeile 1 <0D><0A>
Zeile 2 TT=563ms OTL=0mm CC=1 OI=17413<0D><0A>
Zeile 3 67868650<0D><0A>
Zeile 4 25IL 100% ST=0 RA=32 CL=_8 CS=__2 DIR=1 OD=120 FC=0<0D><0A>
Zeile 5 <0D><0A>
Stop    <03>

wie kann ich in dem String in die dritte Zeile springen zur Anzeige bzw 
auf das zweite CR LF warten und den rest ausgeben


Ich habe das letzte mal vor 5 Jahren was mit Bascom gemacht darum bin 
ich im mom nicht mehr so ganz drinne

Controller wird ein Attiny2313 und der Hardware UART wird verwendet

wäre schön wenn jemand dazu ein paar Code schnipsel hätte wie ich da 
hinkomme

: Bearbeitet durch User
Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: ole (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Handbuch lesen führt zum Erfolg,
google auch.
Beides nicht Deine Stärke ;-(




INPUT

Der Befehl INPUT erwartet eine Zeichenfolge von der UART und schreibt 
diese in eine Variable. INPUT wartet so lange auf die Zeichenfolge bis 
CARRIAGE RETURN (CR) übermittelt wurde. Das Programm bleibt also stehen, 
bis CR über die UART rein kommt. Das ist ideal, wenn das Programm in der 
MainLoop nur kommuniziert. Es ist nicht ideal, wenn in der MainLoop auch 
noch andere Dinge erledigt werden sollten. Dafür gibt es andere Befehle 
wie INKEY oder ISCHARWAITING. Außerdem gibt es sogar die Möglichkeit, 
einen Interrupt auslösen zu lassen, wenn eine Zeichenfolge angekommen 
ist.

Dieses Beispiel wartet bis eine mit CR abgeschlossene Zeichenfolge 
übermittelt wurde und schickt diese über die UART zurück:

Dim Empfangen As String * 20

Do
   Input Empfangen
   Print "Empfangen: " ; Empfangen
Loop

End

Mit CONFIG INPUT kann man einstellen, welches unsichtbare Zeichen oder 
welche unsichtbare Zeichenfolge einen Empfang abschließt.

Autor: ole (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
traurig und hier noch die sekundengooglelösung.

https://avrhelp.mcselec.com/index.html?configinput.htm

Autor: Mario N. (mariotg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hab ich ja soweit verstanden aber ich möchte ja NUR das 2. CR LF 
haben also die Info danach nicht aber den Rest

und ja ich habe bereits Google benutzt und gesucht aber das richtige 
dazu leider nicht gefunden

Beitrag #5901953 wurde von einem Moderator gelöscht.
Autor: hmmmm (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Mario N. schrieb:
> Das hab ich ja soweit verstanden aber ich möchte ja NUR das 2. CR LF
> haben also die Info danach nicht aber den Rest
>
> und ja ich habe bereits Google benutzt und gesucht aber das richtige
> dazu leider nicht gefunden

Na sag mal, kannst Du nicht bis 2 zählen?
Langsam haut es hier dem Fass den Boden aus.


Sagt doch klar und deutlich:
"Bitte schreibt mir doch einer den funktionierenden Fünfzeiler hier hin,
ich habe meine Hausaufgaben nicht gemacht".

Der Thread kann geschlossen werden.

Autor: Mario N. (mariotg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NOCHMAL ICH BRAUCHE HILFE WIE ICH DEN 2. CR LF DIE INFO DANACH 
RAUSBEKOMME UND KEINE FERTIGEN CODE

Google hab ich benutzt aber leider nichts gefunden

aber ist ein Tolles Forum hier Ausser der Info vom Moderator Rufus war 
nichts wirklich hilfreich für mich bzw hat mich nichts weiter gebracht

Dann säge Dir doch mit Midstring, bzw. Leftstring, Rightstring die
Sachen aus dem empfangenen String heraus, dann hast Du doch, was Du
brauchst.

???? ABER WIE ????

und an


Na sag mal, kannst Du nicht bis 2 zählen?
Langsam haut es hier dem Fass den Boden aus.


Sagt doch klar und deutlich:
"Bitte schreibt mir doch einer den funktionierenden Fünfzeiler hier hin,
ich habe meine Hausaufgaben nicht gemacht".

Der Thread kann geschlossen werden.

EINFACH MAL LESEN BEVOR DU DUMM SCHREIBST !!!!!!!!!!!

Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, Leute gibts...
Naja - egal.

Autor: Karl M. (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Mario N. schrieb:
> ???? ABER WIE ????

Ich würde ja beim Hersteller nachsehen und dort mal das Forum und die 
Hilfeseiten bemühen.

Und das habe ich gefunden:

https://avrhelp.mcselec.com/index.html?mid.htm

Autor: Mario N. (mariotg)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Karl M. schrieb:
> Mario N. schrieb:
>> ???? ABER WIE ????
>
> Ich würde ja beim Hersteller nachsehen und dort mal das Forum und die
> Hilfeseiten bemühen.
>
> Und das habe ich gefunden:
>
> https://avrhelp.mcselec.com/index.html?mid.htm

hab ich gesehen aber wie kann ich dort eingeben das ich ab dem 2. CR 
anfangen will

Dim S As String * 15 , Z As String * 15
S ="ABCDEFG"
Z = Left(s , 5)
Print Z 'ABCDE
Z = Right(s , 3) : Print Z
Z = Mid(s , 2 , 3) : Print Z
End

das möchte ich doch nur wissen sry wenn ich mich undeutlich ausgedrückt 
habe :-/

die Länge ist wie gesagt variabel dadurch nicht nach einer festen 
position nutzbar

Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Du hast selbst NICHTS beigetragen, was du wie und warum versucht hast 
und was daran nicht geklappt hat. Immer nur Gegreine nach ner fertigen 
Lösung. Die gibts aber i.a. nicht, wenn erkennbar ist dass der TO selbst 
nichts tut. Dazu kommt, dass es hier nur wenige Basic-Programmierer 
gibt. Die meisten müssten sich erst wieder in Syntax und vorhandene 
Funktionen einlesen - nur damit du es bequem hast.

Ein array von 0 bis max. Ende durchzutickern, Zeichen zählen und 
anzuschauen. Falls es 0x0a ist auch dieses mit einem zweiten Zähler 
zählen. Falls du das zweite 0x0a findest bist du fertig. Dabei braucht 
man gar keine fertigen stringfunktionen (die anzuschauen und zu 
verstehen willst du ja offensichtlich nicht, machen letztendlich aber 
auch nichts anderes).
Was programmierst du denn überhaupt, wenn du solch einfachste 
Algorithmen nicht siehst und umsetzen kannst?

Es gibt viele Lösungswege, ich  habe gerade gesehen dass es bei Bascom 
auch ne split-Funktion gibt.

Autor: Karl M. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Hallo,

Dann würde ich eine Scanner, Tokeneiser, Parser schreiben,
der mir die Zahlen im Format [0..9]+8 , wie "67868650" findet.

Davor wären dann die Token TT, OTL, CC und OI mit ihren Werten <value>.
Ich nutze extra die gefundenen Werte {<value>}, so kann man einfacher 
verstehen, was ich meine.
Das "=" wird impliziert als Wertzuweisung für ein Token interpretiert.

TT  {563ms} ::= [0..9]+3"ms"
OTL {0mm}   ::= [0..9]+"mm"
CC  {1}     ::= [0..9]+
OI  {17413} ::= [0..9]+

XX  {67868650} ::= [0..9]+8 ; eine 8 stellige Zahl!

<0A>, <0D> kann man dem Token WhiteSpace (WS) zuordnen.
Hier eine Token für Trennzeichen usw.

WS ::= [<0A>,<0D>]+ ; das Zeichen CR und LF, evtl. noch weitere.
TAB ::= [<08>] ; das Zeichen Tabulator
SP ::= [<20>] ; das Zeichen Space

Was nun unter:
"25IL 100%"

zu verstehen ist, d.h. welche Daten das sind, ist mir nicht klar.
Deshalb das Token ??, das diesen Teilstring als Wert hat.

Für den Rest kann man den Token-Ansatz weiter verfolgen:

"ST=0 RA=32 CL=_8 CS=__2 DIR=1 OD=120 FC=0<0D>"

Es kommen folgende weitere Token dazu:
ST, RA, CL, CS, DIR, OD und FC.

Ihre möglichen Werte ergeben sich aus dem Ausdrücken:
ST  {0}   ::= [0..9]+
RA  {32}  ::= [0..9]+
CL  {_8}   ::= [_]*[0..9]+ ; mir ist nicht klar, ob das "_" optional 
ist, deshalb auch das [_]*, sonst wäre [_]+ richtig
CS  {__2}   ::= [_]*[0..9]+
DIR {1}   ::= [0..9]+
OD  {120} ::= [0..9]+
FC  {0}   ::= [0..9]+

ID  {<02>|<03>} ::= <[0][0..9]+>; ist so zu lesen, dass immer eine 0 
vorangestellt sein muss.

Mit deinem Beispiel ergeben sich die Token:
"<02><0D>
<0A>
TT=563ms OTL=0mm CC=1 OI=17413<0D>
<0A>
67868650<0D>
<0A>
  25IL 100% ST=0 RA=32 CL=_8 CS=__2 DIR=1 OD=120 FC=0<0D>
<0A>
<0D>
<0A>
<03>"

Die gefundenen Token:
ID WS TT OTL CC OI WS XX WS ?? ST RA CL CS DIR OD FC WS ID

Somit sucht man in der Token-Liste nach dem ersten ID, dann weiter bis 
zum XX und liest den Wert aus XX.value.

Wie man das einfach unter Bascom realisiert, kann ich der nicht 
erklären.
Da Bascom in meinen Augen keine moderne Programmiersprache ist.

Modern wäre, wenn man schreiben und der Compiler rechnen könnte:
a = (a+1) *3 +7 /5

Autor: Hä? (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Er benötigt fertigen Code.
Ist denn hier niemand dazu in der Lage?
Bekommt er fertigen Code, wird er zukünftig seine Grundschulprobleme 
selber lösen können.

Also bitte, was seid Ihr für schlechte Pädagogen.

Autor: Karl M. (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Hä? schrieb:
> Er benötigt fertigen Code.
> Ist denn hier niemand dazu in der Lage?
> Bekommt er fertigen Code, wird er zukünftig seine Grundschulprobleme
> selber lösen können.

Nach meiner Erfahrung nicht mit Bascom.

Autor: michael_ (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Mario N. schrieb:
> Start   <02>
> Zeile 1 <0D><0A>
> Zeile 2 TT=563ms OTL=0mm CC=1 OI=17413<0D><0A>
> Zeile 3 67868650<0D><0A>
> Zeile 4 25IL 100% ST=0 RA=32 CL=_8 CS=__2 DIR=1 OD=120 FC=0<0D><0A>
> Zeile 5 <0D><0A>
> Stop    <03>
>
> wie kann ich in dem String in die dritte Zeile springen zur Anzeige bzw
> auf das zweite CR LF warten und den rest ausgeben
>
Warum in die 3.Zeile springen?
Und nicht sofort die Byte auswerten?
In Assembler hab ich sowas gemacht. Kommt drauf an, ob BASCOM so schnell 
ist.
Für so eine popelige Anzeige reichen 2400.

> Ich habe das letzte mal vor 5 Jahren was mit Bascom gemacht darum bin
> ich im mom nicht mehr so ganz drinne
Ich habe das auch, aber sehr wenig damit gemacht.
Man müßte nachsehen, ob es eingehende Daten nach CRLF separieren kann.
Mal die Anwenderbeispiele durchforsten.

Karl M. schrieb:
> Hallo,
>
> Dann würde ich eine Scanner, Tokeneiser, Parser schreiben,
> der mir die Zahlen im Format [0..9]+8 , wie "67868650" findet.
.......

Man muß nicht mit Kanonen auf Spatzen schießen.

Karl M. schrieb:
> Da Bascom in meinen Augen keine moderne Programmiersprache ist.

Was meinst du mit "modern"?
Das ist Wischi Waschi, Nebel, unklar und undefiniert.
Viele Leute erfreuen sich mit BASCOM und machen tolle Sachen damit.
Ich finde sowieso, die Syntax hat sehr wenig mit Basic von 1985 zu tun.

Autor: Karl M. (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
michael_ schrieb:
> Was meinst du mit "modern"?

Habe ich dargestellt, bitte alles Zitieren!

Autor: Mario N. (mariotg)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
1. Ich brauche keinen der mir einen Fertigen code schreibt

2. wollte ich nicht eine neue Programmiersprache erlernen wenn es nicht 
auch so geht

3. der sinn eines Forum ist doch das man fragen kann wenn man etwas 
nicht versteht um es zu verstehen

4. Danke an die die geholfen haben :-) macht weiter so


jetzt kann der Thread geschlossen werden

Autor: Hä? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit den Informationen kann auch Hänschen das nun programmieren.

Wenn es läuft, zeig Deinen Code.

Bisher ist da von Dir absolut NIX gekommen.

Autor: Mario N. (mariotg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hä? schrieb:
> Mit den Informationen kann auch Hänschen das nun programmieren.
>
> Wenn es läuft, zeig Deinen Code.
>
> Bisher ist da von Dir absolut NIX gekommen.


Ich habe ein paar ideen wie es klappen könnte auch in basom

Ich werde sehen ob es sich so umsetzen lässt

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.

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