string und variable senden

Gast #1268111
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
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
>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 ...
Gast
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.