www.mikrocontroller.net

Forum: Compiler & IDEs string und variable senden


Autor: ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
 
volatile int entfernung= 1000;
char entf[5];

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

void USART_TRANSMIT(unsigned char *str)
{
   while (*str != 0)
   {
    while(!(UCSRA & (1<<UDRE)));
          UDR = *str++;   
  }                       
}

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

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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:
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.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

// einen einzelnen char ausgeben
void UsartChar( unsigned char c )
{
  while( !(UCSRA & (1<<UDRE)) )
    ;
  UDR = c;   
}

// einen kompletten string ausgeben
void UsartString( unsigned char *str )
{
  while( *str != '\0' )
    UsartChar( *str++ );  
}

// einen int ausgeben
void UsartInt( int value )
{
  char text[10];

  itoa( value1, text, 10 );
  UsartString( text );
}

// ein komplettes Kommando ausgeben
void UsartCommand( int value1, int value2, int value3 )
{
  UsartChar( '#' );
  UsartInt( value1 );
  UsartChar( 'P' );
  UsartInt( value2 );
  UsartChar( 'T' );
  UsartInt( value3 );
  UsartChar( '\n' );
}

volatile int entfernung= 1000;

int main()
{
  UsartCommand( 5, entfernung, 1200 );
}

Autor: ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE für die vielen und perfekten Antworten!!!!

Werds gleich mal ausprobieren!!


Mfg ralph

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.