Hallo Leute!
Folgendes:
Schicke aus MATLAB einen String (mit RS232) an einen Mega32 in der Form:
A1.23455"2.34565"3.45678"3.67988"9.34827"3.23478"Z.
Die Zahlen sind nur Beispiele, ihr seht es sollen also 6 double Werte
interpretiert werden. 'A' und 'Z' fungieren als "Erkennungszeichen"
(Anfang, Ende) das '"' dient als Trennungszeichen.
Unten also der Code (klappt alles) aber hier kurz das Problem (ohne
Bezug zum Code) formuliert:
Ich habe ein 2d Feld z.B
ich möchte nun dieses in das Array
wandeln.
Hätte ich folgendes
geht die problemlos mit
1 | *tempPtr = array;
|
2 | double wert;
|
3 | wert = atof(tempPtr);
|
Aber wie mit einem [m]x[n] array ?
Nach langem Lesen und rumprobieren hab ich nichts gefunden, deshalb
dacht ich, ich frag mal.....
Alternativ könnte ich im Code (in der Interrupt Funktion oder auch in
Main) ein switch case Geschichte schreiben und jeden einzelnen double
Wert dann in eine eingene Variable konvertieren, da ich aber in
Anschluss noch ne Menge Code brauche möchte ich so speichersparsam wie
möglich schreiben.
(Wie es einem Anfänger wie mir nur eben möglich ist) ;)
Also schon mal danke fürs anlesen und
viele Grüße !
Realisiert habe ich das folgendermaßen:
(stelle nur den für das Problem wesentlichen Code hinein...)
UDR RX Complete IR Funktion:
1 | //Uart Empfang abgeschlossen. Interrupt Funktion. Wird jedes mal aufgerufen, wenn Zeichen empfangen....
|
2 | ISR(USART_RXC_vect)
|
3 | {
|
4 | //udr schützt/speichert den aktuellen Inhalt des Empfangsregisters UDR...
|
5 | udr = UDR;
|
6 | puffer[i] = udr;
|
7 | i=i+1;
|
8 | }
|
der Inhalt von puffer[i] wird in main dann folgendermaßen verarbeitet:
1 | //Falls "Abschlusszeichen"
|
2 | if(udr=='Z')
|
3 | {
|
4 | //...wird dies durch die entsprechenden LED signalisiert...
|
5 | PORTC=0b11111111;
|
6 | //...leeren des Empfangsregisters
|
7 | UDR = 0;
|
8 | //...Interrupts aus (nicht unterbrechen !)
|
9 | cli();
|
10 | //...bis ende des Empfangspuffers puffer erreicht..
|
11 | for(j=0;j<i;j++)
|
12 | {
|
13 | //Zwischenspeichern..
|
14 | buffer=puffer[j];
|
15 | char_senden(buffer);
|
16 | //...und das entsprechende Zeichen senden
|
17 | }
|
18 | o=l=m=n=0;
|
19 | //puffer durchzählen...
|
20 | for(j=0;j<i;j++)
|
21 | {
|
22 | //zwischenspeichern...
|
23 | buffer=puffer[j];
|
24 | //falls eine Zahl oder Punkt in die entsprechende Zeile packen
|
25 | if ( isdigit(buffer)|| (buffer == '.'))
|
26 | {
|
27 | val_puffer[o][l] = buffer;
|
28 | l = l+1;
|
29 |
|
30 | }
|
31 | //falls "Trennungszeichen" (") nächste Zeile im Feld
|
32 | if (buffer == '"')
|
33 | {
|
34 | //hier der Knackpunkt...
|
35 | //ich kann die erste "Zeile" des Arrays konvertieren, bei den weiteren scheitert es...
|
36 | const char *tempPtr = double_puffer;
|
37 | //konvertierung in double...
|
38 |
|
39 | val[o] = atof(tempPtr);
|
40 | o=o+1;
|
41 | k=l+1;
|
42 | l=0;
|
43 | }
|
44 | }
|
45 | j=0;
|
46 | //Zum debuggen: Inhalt von val_puffer[][] ausgeben zum Überprüfen..
|
47 | //Das hie ist UNWESENTLICH
|
48 | chars_senden("####");
|
49 | for(m=0;m<o;m++)
|
50 | {
|
51 | for(n=0;n<k;n++)
|
52 | {
|
53 | char_senden('{');
|
54 | int_senden(m);
|
55 | char_senden(';');
|
56 | int_senden(n);
|
57 | char_senden('}');
|
58 | buffer = val_puffer[m][n];
|
59 | char_senden(buffer);
|
60 | }
|
61 | }
|
62 | double_senden(val[0]);
|
63 | //den Zähler wieder auf Null setzen (kein Überlauf)
|
64 | i=0;
|
65 | m=0;
|
66 | //globale Interrupts wieder zulassen
|
67 | sei();
|
68 | udr=0;
|
69 | PORTC=0x00;
|
70 | }
|