Forum: Mikrocontroller und Digitale Elektronik Empfangene Daten der UART vergleichen


von Eugen.S (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe da ein Problem und hoffe einer von euch kann mir den 
entscheidenden Tipp geben. Eigentlich kann es nicht so schwer sein und 
bin echt frustriert, dass ich nicht darauf komme.

Was ich machen möchte:

Ich lese mit Hilfe der Lib von Peter Danneger (im Anhand) ein String von 
bis zu 9 Byte ein. Diese werden in seine Lib im rx_buffer angelegt. 
Meine Idee war ein konstantes Array anzulegen und diese mit dem 
rx_buffer zu vergleichen. Dann das Ergebnis des Vergleich in einem 
String über rx wider heraus zu senden.

Frage 1:

Um an den Inhalt von rx_buffer zu kommen, muss ich meine Funktion zum 
Vergleichen in der UART0.c schreiben?

Fragen 2:

Wenn ich eine Konstante z.B.
1
const uinte8_t test [] =
2
{
3
   0x00,0x01,0x02,0x03,0x04
4
};

anlegen und über den Debugger dann schaue, steht da was ganz anderes 
drin. Ich verstehe nicht warum es so ist. Was kann mein Problem sein?

von Eugen.S (Gast)


Angehängte Dateien:

Lesenswert?

So sieht es bei meinem Array aus wenn ich Ihn nicht als konstant anlege.

von Peter Hacke (Gast)


Lesenswert?

Mal auf das + neben age geklickt?

von Eugen.S (Gast)


Lesenswert?

Die Werte vom age sind im Bild zu sehen.

von Karl H. (kbuchegg)


Lesenswert?

Eugen.S schrieb:

> Ich lese mit Hilfe der Lib von Peter Danneger (im Anhand) ein String von
> bis zu 9 Byte ein. Diese werden in seine Lib im rx_buffer angelegt.
> Meine Idee war ein konstantes Array anzulegen und diese mit dem
> rx_buffer zu vergleichen. Dann das Ergebnis des Vergleich in einem
> String über rx wider heraus zu senden.

Nein das funktioniert nicht.
Die UART Routinen verwalten einen Ringbuffer. Der geht dich nichts an. 
Du musst schon über die offizielle Funktionsschnittstelle gehen um dir 
dort die einzelnen Bytes zu holen und in einem eigenen Array 
zusammensetzen. Der von den UART Routinen verwaltete Ringbuffer ist nur 
dazu da, dein Programm in sofern zu entlasten, dass du kein Byte 
verlierst während dein Programm anderweitig beschäftigt ist und momentan 
keine Zeit hat, die eintrudelnden Bytes abzuholen. Dann werden sie von 
der Interrupt Routine in diesem Ringbuffer zwischengeparkt. Der ist 
sozusagen der Postkasten, in den der Briefträger deine Post steckt, wenn 
du nicht zu Hause bist und die Tür nicht öffnest.

Vergiss die Idee. Du hast 2 Funktionen. Die eine sagt dir, ob ein 
Zeichen vorrätig ist. Die andere holt dir das jeweils nächste Zeichen, 
wenn eines da ist. Mit denen arbeitest du. Was die UART Funktionen 
intern machen geht dich nichts an, und ist nicht dein Bier.
1
int main()
2
{
3
   char c;
4
   char receivedString[80];
5
   unsigned char receivedCnt;
6
   ....
7
8
   receivedCnt = 0;
9
10
   while( 1 )
11
   {
12
13
     if( ukbhit0() ) // es gibt ein nächstes Zeichen
14
     {
15
       c = ugetchar0();  // hole das Zeichen
16
17
       if( c == '\n' ) // das vereinbarte Ende der Übertragung, zb '\n'
18
       {
19
         receivedString[receivedCnt] = '\0';
20
         receivedCnt = 0;
21
22
         // mach was immer du mit dem String machen willst
23
         // zb
24
         if( strcmp( receivedString, "hallo" ) == 0 )
25
           uputs0( "Dir auch ein hallo\n" );
26
         else
27
         {
28
           uputs0( "Ich verstehe nicht, was du mit '" );
29
           uputs0( receivedString );
30
           uputs0( "' meinst!\n" );
31
         }
32
       }
33
34
       else  // kein Übertragungsende. Zeichen in den Buffer und somit
35
             // den String aufbauen
36
       {
37
         if( receivedCnt < sizeof(receivedString) )
38
         {
39
           receivedString[receivedCnt++] = c;
40
         }
41
       }
42
     }  // end if( ukbhit0() )
43
44
45
   }  // end while
46
}

: Bearbeitet durch User
von Eugen.S (Gast)


Lesenswert?

Hallo Karl Heinz,

wenn ich dich richtig verstanden habe, dann arbeite ich mit diesen 
Funktionen:
1
ukbhit0();      // 0 = rx buffer empty
2
ugetchar0();      // get received byte
3
utx0_ready();      // 0 = tx still busy
4
uputchar0();      // send byte

Alles was intern passiert, fasse ich nicht an.

Richtig?

von Karl H. (kbuchegg)


Lesenswert?

Eugen.S schrieb:
> Hallo Karl Heinz,
>
> wenn ich dich richtig verstanden habe, dann arbeite ich mit diesen
> Funktionen:
>
>
1
> ukbhit0();      // 0 = rx buffer empty
2
> ugetchar0();      // get received byte
3
> utx0_ready();      // 0 = tx still busy
4
> uputchar0();      // send byte
5
>
>
> Alles was intern passiert, fasse ich nicht an.
>
> Richtig?

Genau.
Ich hab dir im vorhergehenden Post noch ein Beispiel konstruiert.

von Eugen.S (Gast)


Lesenswert?

1
uputs0();

habe ich bewusst ausgelassen.

von Eugen.S (Gast)


Lesenswert?

Super, vielen DANK erstmal!

von Eugen.S (Gast)


Angehängte Dateien:

Lesenswert?

Habe noch eine Frage zu meinem Array Problem.
Wenn Ihr euch mal das Bild anschauen würden.
Wie kommt der Unterschied in den Array zustande, der eine hat{data} und 
der andere {prog} stehen? Was ist der Unterschied?

In meinem Fall hat der mit dem {prog} die falschen werde drin und der 
mit {data} die richtigen! Bei wurden von mit identisch aufgebaut nur mir 
anderen Werten.

von Karl H. (kbuchegg)


Lesenswert?

Eugen.S schrieb:
> Habe noch eine Frage zu meinem Array Problem.
> Wenn Ihr euch mal das Bild anschauen würden.
> Wie kommt der Unterschied in den Array zustande, der eine hat{data} und
> der andere {prog} stehen? Was ist der Unterschied?

Ich weiss nicht, was du da für eine Entwicklungsumgebung benutzt aber 
ich würde mal schätzen, dass das eine Array im Flash liegt und das 
andere im SRAM.

Daher denke ich, das ist ein Problem im Debugger, der das nicht 
berücksichtigt und dir mit der Adresse den SRAM Inhalt anzeigt, wenn er 
eigentlich den Flash Inhalt anzeigen sollte.

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.