Forum: Mikrocontroller und Digitale Elektronik String über Uart empfangen STM32<--->Arduino


von Richard (Gast)


Lesenswert?

Hallo,

ich hab einen stm32 und möchte daten die von einem arduino gesendet 
werden empfangen und ausgeben (debug terminal über printf).

Das Arduino Board sendet im Format 
(https://github.com/a1ronzo/SparkFun-IR-Evaluation-Board/blob/master/IR_eval/main.c):
1
double Tf;
2
3
printf("%.2f Farenheit\n", Tf);


Meine STM32 schaut so aus:
1
.
2
.
3
.
4
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
5
6
  USART_InitStructure.USART_BaudRate = 38400;
7
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
8
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
9
  USART_InitStructure.USART_Parity = USART_Parity_No;
10
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
11
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
12
  USART_Init(USART2, &USART_InitStructure);
13
14
  USART_Cmd(USART2, ENABLE);
15
16
}
17
char text[40];
18
int SER_GetChar (void) {
19
20
  while (!(USART2->SR & 0x0020));
21
  return (USART2->DR & 0x1FF);
22
}


empfangen von etwas klappt aber ich denke ich mach das falsch, weil es 
ja ein string? ist der gesendet wird und ich das als int verarbeite:
1
int sensor;
2
sensor = SER_GetChar();
3
4
while{
5
.
6
.
7
sprintf (text, "%d", sensor);
8
.
9
.
10
//auf display ausgeben:
11
GLCD_DisplayString(7, 0, __FI, "Temperatur in Farenheit:");
12
GLCD_DisplayString(8, 0, __FI, (unsigned char *)text);
13
}


Wie bekomm ich das richtig hin 1:1 das selbe zu empfangen?

von Richard (Gast)


Lesenswert?

sorry, char text[40];  gehört über int sensor;. Zeile verrutscht.

von xfr (Gast)


Lesenswert?

SER_GetChar() liefert Dir nur ein einzelnes Zeichen. Du musst die 
Zeichen in einer Schleife lesen und nacheinander im Array text 
speichern, bis das letzte Zeichen ('\n') kommt. Danach muss noch ein 
'\0' angefügt werden, um den String zu terminieren. Außerdem solltest Du 
darauf achten, dass nicht über die Array-Grenze (40 Zeichen) hinaus 
geschrieben wird.

Danach kannst Du text auf dem LCD ausgeben, wie Du es schon dort stehen 
hast.

von Richard (Gast)


Lesenswert?

ok C/C++ hab ich nicht soviel Ahnung weil ich eher C# / Java 
programmiere aber das müsste ja dann so ausschauen:
1
string char2string(char * myCharArray)
2
3
string mystring; //mein string
4
5
//sollange bis "\n" in einem array element auftaucht
6
while ( int i=0; myCharArray[i] != "\n"; i++ )
7
{
8
9
strncat(mystring, myCharArray+ 1,1);
10
}
11
return mystring;

oder?

von Richard (Gast)


Lesenswert?

ok das mag keil nicht, weil Keil kein string kann in C

von Richard (Gast)


Lesenswert?

1
char char2string(char * myCharArray)
2
{
3
int j=0;
4
int i=0;
5
char mytext[20]; //mein string mit 20 elementen
6
  
7
//sollange bis "\n" in einem array element auftaucht
8
while (myCharArray[i] != '\n')
9
  {
10
  mytext[j] = myCharArray[i];
11
    j++;
12
    i++;
13
  }
14
15
return mytext;

main.c(119): error:  #29: expected an expression

warum?

von Karl H. (kbuchegg)


Lesenswert?

Richard schrieb:
> ok das mag keil nicht, weil Keil kein string kann in C


Nö. Nicht Keil.

In C gibt es schlicht und ergreifend keinen 'string' Datentyp.

String-Verarbeitung in C


Wenn du weiter in C programmieren willst, kommst du um Literatur nicht 
herum.
Mit deinen C# bzw. Java Kentnissen wirst du ansonsten schnell auf die 
Schnauze fallen. Vieles ist ähnlich, aber doch ganz anders. Und nur weil 
etwas syntaxmässig einigermassen gleich aussieht, heißt das nicht, dass 
es auch gleich behandelt wird.,

von Karl H. (kbuchegg)


Lesenswert?

Richard schrieb:
>
1
> char char2string(char * myCharArray)
2
> {
3
> int j=0;
4
> int i=0;
5
> char mytext[20]; //mein string mit 20 elementen
6
> 
7
> //sollange bis "\n" in einem array element auftaucht
8
> while (myCharArray[i] != '\n')
9
>   {
10
>   mytext[j] = myCharArray[i];
11
>     j++;
12
>     i++;
13
>   }
14
> 
15
> return mytext;
16
> 
17
>
>
> main.c(119): error:  #29: expected an expression

Eine Information fehlt noch:
welches ist die Zeile 119?
(markier die Zeile immer im Code)

Auf Anhieb sehe ich das jetzt nichts fehlerhaftes.

>
> warum?

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Auf Anhieb sehe ich das jetzt nichts fehlerhaftes.
>
>>
>> warum?

Das passt jetzt zwar nicht zur Fehlermeldung, aber:

1
char char2string(char * myCharArray)
(achte auf den Return Typ)
1
  char mytext[20];
und
1
  return mytext;

das passt nicht zusammen. Die Funktion sagt: Ich gebe einen einzelnen 
Character zurück. mytext ist aber kein einzelner Character. mytext ist 
ein Array!
(und nein, du kannst auch nicht das Array zurückgeben. Studier den Link, 
den ich dir gegeben habe. Gleich nachdem du dir bei Amazon einen 
Kernighan&Ritchie, vorzugsweise in der englischen Originalversion 
gekauft hast)

von Richard (Gast)


Lesenswert?

ahh stimmt sorry, ok hier der Fehler im Kommentar hinzugefügt.
1
extern char char2string(char *myCharArray); //prototyp
2
3
char char2string(char *myCharArray)
4
{
5
int j=0;
6
int i=0;
7
char mytext[20]; //mein string mit 20 elementen
8
  
9
//sollange bis "\n" in einem array element auftaucht
10
while (myCharArray[i] != '\n')
11
  {
12
  mytext[j] = myCharArray[i];
13
    j++;
14
    i++;
15
  }
16
17
return mytext;  //main.c(121): error:  #120: return value type does not match the function type


Etwas C kann ich noch von der uni, hab hier auch ein gutes Buch aber das 
müsste doch funktionieren.

von hele (Gast)


Lesenswert?

das ist ganz schlecht. zum error kann ich dir nix sagen zeilennummer 
würde helfen, aber mytext zeigt nach dem return auf ungültigen Speicher

von Karl H. (kbuchegg)


Lesenswert?

Richard schrieb:


> return mytext;  //main.c(121): error:  #120: return value type does not
> match the function type

Das ist jetzt aber eine ganz andere Fehlermeldung.
Und diesmal stimmt sie auch.
Siehe hier
Beitrag "Re: String über Uart empfangen STM32<--->Arduino"

von Richard (Gast)


Lesenswert?

ja 121 wäre die Zeile return mytext

wenn ich aber return mytext[] draus mache wie es ja eigentlich sein 
soll,
dann meckert er, "expected an expression" für return mytext[].
Das ist doch aber ein Ausdruck oder?

von Richard (Gast)


Lesenswert?

dank deinem Link, den ich erst jetzt bemerkt habe:
--> return *mytext;

jetzt gehts :D

von Karl H. (kbuchegg)


Lesenswert?

Richard schrieb:
> ja 121 wäre die Zeile return mytext
>
> wenn ich aber return mytext[] draus mache wie es ja eigentlich sein
> soll,
> dann meckert er, "expected an expression" für return mytext[].
> Das ist doch aber ein Ausdruck oder?

<frustriert>
Ich such dir doch nicht umsonst den Link raus, nur damit du dann nicht 
draufklickst und ein paar Seiten nicht lesen musst.

Steht alles dort.
Aber lesen musst du schon selber.
String Verarbeitung in C ist nicht so einfach, wie du denkst.

von Karl H. (kbuchegg)


Lesenswert?

Richard schrieb:
> dank deinem Link, den ich erst jetzt bemerkt habe:
> --> return *mytext;
>
> jetzt gehts :D

<Homer Mode>
N E I I I I N
</Homer Mode>

Lies alles! Von oben bis unten!
Dann erfährst du auch, warum es eben NICHT funktioniert. Selbst wenn es 
jetzt momentan so aussieht als ob.

von Richard (Gast)


Lesenswert?

du hast recht... ich bin jetzt mal am lesen und meld mich später

von Richard (Gast)


Lesenswert?

so gehts, nur erhalte ich am ende auf dem Display immer ein Zeichen das 
so ausschaut wie ein schwarz ausgefülltes rechteck []. Wenn ich 7 draus 
mache ist das Zeichen am Anfang

bsp.:
70.18F[]  //wenn text2, 8
[]70.18   //text2, 7   => "F" fehlt aber dafür blockzeichen am Anfang

Hier mein code:
1
uart_gets( text2, 8 );
2
3
extern void uart_gets(char* Buffer, uint8_t MaxLen); //prototyp
4
5
6
void uart_gets( char* Buffer, uint8_t MaxLen )
7
{
8
  uint8_t NextChar;
9
  uint8_t StringLen = 0;
10
 
11
  NextChar = SER_GetChar(); // Warte auf und empfange das nächste Zeichen
12
 
13
// Sammle solange Zeichen, bis:
14
// * entweder das String \n Ende Zeichen kam
15
// * oder das aufnehmende Array voll ist
16
17
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
18
    *Buffer++ = NextChar;
19
    StringLen++;
20
    NextChar = SER_GetChar();
21
  }
22
 
23
*Buffer = '\0'; //wegen c-string
24
25
}

von Karl H. (kbuchegg)


Lesenswert?

Und wie ist text2 definiert?

von Richard (Gast)


Angehängte Dateien:

Lesenswert?

text2 ist definiert als char text2[10];

Im debugger ist das ungewollte symbol/zeichen ein 0x0D ""

siehe bild.

von Richard (Gast)


Lesenswert?

0x0D ist CR carriage return ah aber wo kommt das her?

von Karl H. (kbuchegg)


Lesenswert?

Richard schrieb:
> text2 ist definiert als char text2[10];
>
> Im debugger ist das ungewollte symbol/zeichen ein 0x0D ""


0x0D ist ein Linefeed. Also ein Steuerzeichen. Kannst du ausfiltern. Die 
gets Funktion kann dieses Zeichen einfach ignorieren und nicht im String 
ablegen.
Ist fürs erste die einfachste Variante.

Dann solltest du deinen Aufruf so gestalten
1
   char text2[10];
2
3
   uart_gets( text2, sizeof(*text2) );

an der Stelle, an der du tatsächlich das Array noch als Array 'siehst', 
kannst du mit sizeof die Arraygröße feststellen. Es bringt nichts, wenn 
du gets anlügst. Wenn dein Array 10 Positionen groß ist und du daher 
einen String der Länge 9 da reinbringst, dann sag das auch der Funktion, 
damit sie den vorhandenen Platz maximal ausnutzen kann. Das heißt ja 
nicht, dass der String dann auch eine strlen von 9 haben MUSS. Das heißt 
ja nur, das er das KANN. Er kann auch kürzer sein (deswegen gibt es ja 
das \0 Zeichen)

von Richard (Gast)


Lesenswert?

danke!

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.