Forum: Compiler & IDEs string und variable senden


von ralph (Gast)


Lesenswert?

hi

hab follgendes problem:

ich will so etwas über die serielle schnittstelle senden:

Usart_transmit("hier kommt ein wort: , variable, weiterer text");

um genau zu sein: Usart_transmit("#" variable "P" variable2 "T" 
variable3);
in der variable sollte eine zahl stehen  zb: 1200


also ich hab es folgendermaßen gelöst  funzt aber net:
1
 
2
volatile int entfernung= 1000;
3
char entf[5];
4
5
void main()
6
{
7
itoa(entfernung, entf, 10);
8
USART_TRANSMIT("#5P",entf,"T1000");
9
}
10
11
void USART_TRANSMIT(unsigned char *str)
12
{
13
   while (*str != 0)
14
   {
15
    while(!(UCSRA & (1<<UDRE)));
16
          UDR = *str++;   
17
  }                       
18
}
kann mir irgendwer helfen?  mit beistrich zwischen den strings geht es 
nicht   hab auch schon ersucht einen platzhalte einzubauen
("#5P %2,1c T123",entf); geht aber auch net --> da schreibt er nur alles 
zwischen den " .." hinaus aber setzt nicht die entfernung für den 
platzhalter ein

was mach ich falsch?

mfg ralph

von Mark B. (markbrandis)


Lesenswert?

Wenn Du USART_TRANSMIT() mit drei Parametern aufrufst, dann sollte die 
Funktion auch drei Parameter entgegen nehmen. Andererseits, wenn der 1. 
und 3. Parameter immer die gleichen sind, dann ruf die Funktion eben mit 
einem Parameter auf:
1
USART_TRANSMIT(entf);

und bastel den Rest innerhalb der Funktion vorn- und hintendran. So wie 
Du es im Text beschrieben hast, wären es zwei Parameter und 
vorn/dazwischen/hintendran werden immer dieselben Zeichen hineinkopiert.

von gast (Gast)


Lesenswert?

>USART_TRANSMIT("#5P",entf,"T1000");
und
>void USART_TRANSMIT(unsigned char *str)

passt eben nicht

du kannst nur einen kompletten string versenden
also must du den vorher zusammenkopieren

entweder mit sprintf(...) oder mit strcat(..) die strings+ werte zu 
einem srink kopieren dann in den uart




volatile int entfernung= 1000;
char entf[5];
char string[20];

void main()
{
itoa(entfernung, entf, 10);
strcat(string, "#5P");
strcat(string, entf);
strcat(string, "T1000");
USART_TRANSMIT(string);

  while(1)
    {
    }
}


alternativ müsste
sprintf(string,"#5P%lT1000",entfernung);  auch gehen
frisst aber mehr speicher weil die komplette sprintflib eingebunden wird



vom schreiben her vertu ich mich oft ^^
also net zu ernst nehmen hier .. is aber so ein weg vlt ...

von gast (Gast)


Lesenswert?

asso da du 3 variablen hast vlt anders ...

sprintf(string,"#%iP%iT%i",var1,var2,var3);
uart_send( string);


mit strcat wird das sonst rrecht lang ..dürfte aber immernoch kleiner 
werden wie sprint

von Karl H. (kbuchegg)


Lesenswert?

Du kannst natürlich auch den Weg weitergehen, den Mark bereits 
angedeutet hat und Funktionen zu deinem Nutzen einsetzen :-)

Zunächst mal schafft man sich ein Sammelsurium an Funktionen, die zb 
einzelne Character, komplette Strings und Integer ausgeben können. Dann 
benutzt man diese Funktionen um höhere Einheiten, zb ein komplettes 
Kommando auszugeben. Und plötzlich hast du dann eine Komfortfunktion, 
die du in main nur noch mit deinen 3 Werten aufrufen musst, und die 
genau das Gewünschte tut.

1
// einen einzelnen char ausgeben
2
void UsartChar( unsigned char c )
3
{
4
  while( !(UCSRA & (1<<UDRE)) )
5
    ;
6
  UDR = c;   
7
}
8
9
// einen kompletten string ausgeben
10
void UsartString( unsigned char *str )
11
{
12
  while( *str != '\0' )
13
    UsartChar( *str++ );  
14
}
15
16
// einen int ausgeben
17
void UsartInt( int value )
18
{
19
  char text[10];
20
21
  itoa( value1, text, 10 );
22
  UsartString( text );
23
}
24
25
// ein komplettes Kommando ausgeben
26
void UsartCommand( int value1, int value2, int value3 )
27
{
28
  UsartChar( '#' );
29
  UsartInt( value1 );
30
  UsartChar( 'P' );
31
  UsartInt( value2 );
32
  UsartChar( 'T' );
33
  UsartInt( value3 );
34
  UsartChar( '\n' );
35
}
36
37
volatile int entfernung= 1000;
38
39
int main()
40
{
41
  UsartCommand( 5, entfernung, 1200 );
42
}

von ralph (Gast)


Lesenswert?

DANKE für die vielen und perfekten Antworten!!!!

Werds gleich mal ausprobieren!!


Mfg ralph

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.