string und variable senden

Gast #1268111
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
#1268128
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.
Gast #1268152
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 ...
#1268178
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
}

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