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
constuinte8_ttest[]=
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?
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
intmain()
2
{
3
charc;
4
charreceivedString[80];
5
unsignedcharreceivedCnt;
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
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.
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.