Forum: Mikrocontroller und Digitale Elektronik Hilfe bei fprintf......


von Danny (Gast)


Lesenswert?

Ich habe folgendes Problem:
Ich habe ein Touch-Display (EA-KIT 240-6 von Electronic Assemblly)
das über RS232 angesteuert wird. Soweit o.k., senden über UART
funktioniert mit damit:

void uart_nachricht(char* senden) {

for (; *senden != '\0'; senden++) {
    loop_until_bit_is_set(UCSRA, UDRE);
   UDR=*senden;
   }
   loop_until_bit_is_set(UCSRA, UDRE);
   UDR = 13;
}

Nur um das Display zu steuern (Makrofunktionen, Touchmakros, Text
positionieren,.....) brauche ich die fprintf-Funktionen.

fprintf(stdaux, "\x1BZL%c%c%s\x00", 7, 3, "Test");
[Beispiel aus der Doku vom Display:
kurz: \x1B = 'ESC'
      ZL= Zeichenfolge, linksbündig
      x-Position:7
      y-Pos.:3
      \x00= Endekennung für das Display]

Ich versuche es nun seit 3 Tagen und bin noch auf keinen grünen Zweig
gekommen. Vielleicht kann mir hier ja jemand helfen. Bevor Fragen
aufkommen: ich programmiere mit WinAVR und habe einen 90S8535.
Bin euch schonmal Dankbar für die Hilfe.....

Gruß Danny

von Danny (Gast)


Lesenswert?

Thread ohne Frage......guten Morgen.....
Also die Frage ist nun: wie muss der fprintf-Befehl für den µC
aussehen
damit er die Zeichen über UART rausgibt?

von Zotteljedi (Gast)


Lesenswert?

Ich kann Dir nur sagen, wie es in C aussieht, uCs habe ich damit noch
nicht programmiert.

Wenn Du sprintf hast, dann kannst Du damit wie mit fprintf arbeiten,was
rauskommt ist dann eine Zeichenkette, die Du an Deine andere Funktion
verfüttern kannst

char buf[32];
sprintf(buf, "Bla%c%s", 1, "bla");
uart_nachricht(buf);

wobei sprintf das ganze automatisch mit \0 terminiert. Steht Dir das
nicht zur Verfügung, mußt Du den String selbst zusammenzimmern, z.B.

char buf[32], *p = buf, *text="Test";
*(p++) = 0x1b;
*(p++) = 'Z';
*(p++) = 'L';
*(p++) = 7;
*(p++) = 3;
while (*text)
  *(p++) = *(text++);
*p = '\0';
uart_nachricht(buf);

aber falls Du kein sprintf hast, schreit es förmlich danach, das
nachzubauen, wobei es bei Ziffern natürlich ätzend wird. Hast Du aber
fprintf, wirst Du sicher auch sprintf haben, üblicherweise verwendet
das intern alles vsprintf.

von chrigu (Gast)


Lesenswert?

Hallo,
hast du schonmal probiert, das Display über den Terminal anzusteuern,
um zu prüfen, ob die Übertragung funktioniert?

von Danny (Gast)


Lesenswert?

Danke für die Hilfe, aber ich habs heute hinbekommen....
Das Display funktioniert einwandfrei.
Mein Problem war nicht das \x1b sondern das \x00. Das \x1b braucht
das
Display damit es weiß, wann ein Befehl kommt und das \x00 markiert
das
Befehlsende. Hab dann einfach so gelöst:
   ...
   {uart_send("\x1bZL%c%c%s",7,3,"TEST");     (OHNE \x00!!)
   loop_until_bit_is_set(USR, UDRE);
   UDR=0x00;
   ...
Damit funktioniert es. Geht aber auch mit:

   char buf[32];
   sprintf(buf, "\x1bZL%c%c%s", 7, 3, "Was auch immer");
   uart_nachricht(buf);
   loop_until_bit_is_set(USR, UDRE);
   UDR=0x00;

Hab nur noch nicht rausbekommen warum das nicht funktioniert:
   sprintf(buf, "\x1bZL%c%c%s\x00", 7, 3, "Was auch immer");

Wenn \x1b geht, warum dann nicht \x00?


Trotzdem Danke für die Hilfe!

Gruß Danny

von Franz (Gast)


Lesenswert?

Eine Frage, die hier etwas abschweift aber für mich derzeit ein
unlösbares Problem Darstellt:

Funktioniert der Zugriff auf com1 mit stdaux unter winXP nicht?

hab in etwa folgendes:

#include <stdio.h>
#include <string.h>

int main()
{
sprintf(toWrite,"\x1BDL");
fprintf(stdaux,toWrite);
}

Richtig, ich versuch auch auf das EA KIT270-7 zu schreiben!

mfg Franz

von Tobi (Gast)


Lesenswert?

wofür gibts wohl das forum pc-programmierung. da werden sie geholfen :)

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.