Hallo!
ich bin relativ neu mitm programmieren (ca 1a) und will einen String
über UART empfangen der ASCII-zeichen und Trennzeichen enthält, und die
Werte in ein Array[][] speichern, um die werte dann in Binärzahlen
umzuwandeln.
Wobei die Trennzeichen nicht mit ins Array sollen, sondern eben nur zur
Trennung da sind
Leider funzts's ni (avr-studio mit Jtag und Atmega 1281) da (vielleicht)
die entsprechenden for-schleifen cryptisch durchlaufen werden
die codeschnippsel gibts im anhang
was habe ich falsch gemacht(oder nicht verstanden)?
"(usart_rx[i]!='T')||(usart_rx[i]!='t')" ist immer true. Das würde nur
false werden, wenn usart_rx[i] gleichzeitig 'T' und 't' wäre.
"usart_rx[i-1]!='E'": da i bei 0 beginnt, greifst du hier auf
usart_rx[-1] zu.
PS: Ich habe nur einen kurzen Blick in den Sourcecode geworfen. Nimm es
mir nicht übel, aber angesichts der Charakteristik der Fehler werden im
Code sicher noch mehr sein.
...der die Charakteristik beschreibt, da der sendende AVR ca 100km
enfernt ist, und ET is das ende;-) Ich suche nach dem fehler in der
Bildung des Arrays, das die Werte für die Umwandlung in Binärzahlen
vorbereitet, und ich programmiere ca 9 monate in C.
Trotzdem, oder gerade deshalb, Danke!
oh oder gibt es in ASCII Start Transmission und End Transmission Tags?
Dann könnten auch die gemeint sein, aber mein problem ist, das das
Array[][] leer is
> oh oder gibt es in ASCII Start Transmission und End Transmission Tags?
Ja, gibt es.
> aber mein problem ist, das das Array[][] leer is
Den Grund, warum das Array leer ist, habe ich doch schon aufgezeigt:
1
if(usart1==('S'||'s')&&('t'||'T')){
> Was hier eigentlich steht, ist: if (usart1 == 1)
Und da usart1 vermutlich nie 1 ist, wird die for-Schleife auch nie
ausgeführt.
Das zu ändern wird dir aber nicht wirklich viel weiterhelfen, denn der
ganze Aufbau ist Murks, z.B. die Tatsache, dass du versuchst, alle
Zeichen in einem Interrupt einzulesen. Du solltest im Interrupt immer
nur ein Zeichen einlesen. Am besten wirfst du den kompletten
Interrupt-Code weg und machst dir nochmal intensiv Gedanken darüber.
mag ja sein das die interrupt routine mist is, lässt sich ja ändern,
aberdie Anderen zwei funktionen sind wichtiger, da ich die Daten von
ASCII in Binär umwandeln will.
Aber Hilfe hatte ich mir anders vorgestellt denn Hilfe ist nicht nur
Fehler zeigen!
total umständlich (von mangelnder Übersicht gar nicht zu reden...)
Wenn du der Funktion ascii_to_binary einen String in Form von
"1234567890;" übergibst, kannst du das in einer Schleife wesentlich
einfacher realisieren:
1
uint32_tascii_to_binary(uint8_tascii[])
2
{
3
uint32_tbinary=0;
4
unignedchari=0;
5
6
7
while(ascii[i]!=';')
8
{
9
binary=binary*10+(ascii[i++]-'0');
10
}
11
returnbinary;
12
}
Das Einlesen solltest du lieber erst mal per Polling (ohne ISR) machen.
die einzelnen werte isolieren kann.
Daher dachte ich ja zwei verschachtelte for schleifen zu nehmen die ein
2D-Array füllen, wobei der eine index für die zahl steht und der andere
für die stelle. wie der UART-string zustande kommt ist noch ca 1 woche
unwichtig^^
das lässt sich dann auch einfach ändern, wenn ichs wirklich brauche.
>Daher dachte ich ja zwei verschachtelte for schleifen zu nehmen die ein>2D-Array füllen, wobei der eine index für die zahl steht und der andere>für die stelle.
WasfürnDing?
Welche Stelle willst du dir da merken?
Dein String ist relativ einfach zu zerlegen.
0. volatile unsigned char STRING[256]; // Array, in das die Daten vom
USART
// geschrieben werden
volatile unsigned char N = 0; // Schreibposition in STRING
volatile unsigned char Event = 0; // Ereignisübermittlungsvariable
1. Empfang per ISR:
Im Hauptprogrammm guckt man dann nach, ob ((Event & 0x01) != 0) ist.
Dann zerlegt man den String, indem man nach Zeichen sucht, die wie
Ziffern aussehen. Das sollte nur noch das ';' sein...
irgendwie kann man sich das mit deinem 2D-Array auch noch
vereinfachen...
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.