Hilfe bei fprintf......

Gast #112836
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
Gast #112838
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.
Gast #112840
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
Gast #112841
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

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