Serielle Kommunikation formatierung printf, scanf

Hallo zusammen,

ich war gerade dabei ein paar Zeilen Code für Arduino umzuschreiben.
Dabei bin ich auf folgende Probleme gestoßen, wo ich gerade nicht so recht weiß wie man das mit dem Arduino bewerkstelligt.

Es geht um eine Serielle Kommunikation über die ein Protokoll ausgetauscht werden soll. Das heißt, ich brauche teilweise formatierte "Strings" beim senden, als auch eine Formatierung der empfangenen Daten.

In dem ursprünglichen Projekt wurde mit fdevopen ein Kanal für stdio geöffnet, und man konnte mit printf bzw scanf die Daten formatiert senden und empfangen.

Beispiel:

fdevopen (uart_putchar, uart_getchar, 0);

int uart_putchar (char c){
	if (c == '\n')
		uart_putchar('\r');
	//Warten solange bis Zeichen gesendet wurde
	while(!(USR & (1<<UDRE)));
	//Ausgabe des Zeichens
	UDR = c;
	return (0);
};

int uart_getchar (void){
	while(!(USR & (1<<RXC)));
	return(UDR);
};

void Time (	unsigned char *year,unsigned char *month,
					unsigned char *day,unsigned char *hour,
					unsigned char *minute,unsigned char *secound){

	unsigned char tmp[30];
	unsigned int var[5];
	uart_clear();
	printf("at+cclk?\r\n");
	gets(tmp);
	scanf("+CCLK: \"%2d/%2d/%2d,%2d:%2d:%2d+  \"\r\n",&var[0],&var[1],
														&var[2],&var[3],
														&var[4],&var[5]);
	*year = var[0];
	*month = var[1];
	*day = var[2];
	*hour= var[3];
	*minute = var[4];
	*secound = var[5];
};


oder:

//Senden Nachrichten String
	for (tmp1 = 0;tmp1<tmp2;tmp1++){
		printf("%02X", nachrichtneu[tmp1]);
	};
	printf("%c",0x1a);



Jetzt habe ich erst festgestellt, das fdevopen gar nicht mit Arduino genutzt werden kann.
Also Serial.print und Serial.read....

Aber wie erledige ich jetzt die formatierung? Sprich welchen Ersatz gibt es für printf, gets bzw. scanf?

Schonmal vielen Dank!
VG
Matthias

Welcher Arduino?
Auf den AVR ist sprintf für Seriell nicht dabei.
Du könntest Dir mit sprintf oder besser snprintf helfen (Float ist per Standard auch nicht dabei). Zum Einlesen evtl. sscanf, also beide Male den Umweg über ein '\0'-terminiertes char-Array, dass die Zeichenkette aufnimmt, am Besten mit CR/LF als Endekennung.
Oder Du nimmst gleich einen ESP.

Gruß Tommy

printf tuts, bzw kann man nutzen.
Vielleicht anders, als in deiner Erfahrung, aber geht.
Ist alles da, was man dazu braucht
https://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html

Habe mal aus meiner Wühlkiste eine Vorlage zum weiterspielen rausgesucht:

#include <Streaming.h>
Print &cout = Serial;



int writeChar(char Character, FILE *)
{
  return !Serial.write(Character);
}

int readChar(FILE *)
{
   int c;
   while(-1 == (c=Serial.read()));
   return c;
}



FILE stdiostream;


void setup() 
{
  fdev_setup_stream(&stdiostream, writeChar, readChar, _FDEV_SETUP_RW);
  stdin = stdout = stderr = &stdiostream;

  
  Serial.begin(9600);

  byte value = 4;
  printf("testx 0x%02X\r\n",value);
  printf("testd %02d\r\n",value);
}

void loop()
{
  int test {0};
  scanf("%d",&test);
  cout << "test " << test << endl;
  while(Serial.available())Serial.read();
}
1 Like

Super!

Danke! Schaue ich mir morgen mal an. Heute kriege ich nix mehr auf die Reihe :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.