String über Uart empfangen STM32<--->Arduino

Gast #2938665
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?
Gast #2938670
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.
Gast #2938896
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?
Gast #2938920
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?
#2938926
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.,
#2938928
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?
#2938933
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)
Gast #2938936
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.
Gast #2938947
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?
#2938952
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.
Gast #2939034
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
}
#2939070
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren