Hallo der übersichtlichkeitshalber möchte ich folgenden Code so schreiben: char alarm1[255]="\x1B[2JAlarm1:OFF\x1B[15CAlarm11:OFF\x1B[15CAlarm21:OFF\n \x1B[2JAlarm2:OFF\x1B[15CAlarm12:OFF\x1B[15CAlarm22:OFF\n "; sobald ich aber nicht alles auf der gleichen zeile schreibe, meldet der compiler logischerweise fehler..... wie kann ich dem compiler sagen das die 2. und 3. zeile alles zusammengehört? gruss tronic
der befehl \x1B[2J von der 2. zeile wegdenken... ist orginal nicht so.. aber tut ja nichts zur frage..
Anführungszeichen ans Ende und an den Anfang jeder Zeile. Das Semikolon nur am Ende der letzten Zeile.
> gibts 16bit charvariablen?
wchar_t, ist in der avr-libc nicht implementiert.
Willst du Chinesisch oder Japanisch schreiben?
wie sinnvoll ist eigentlich mein Code, bzw. wie kann ich an Speicherplatz sparen (momentan ohne Interrupt - aber das ändre ich schon noch)? #include <avr/io.h> #include <util/delay.h> void ini() { DDRD = 0xFE; //RX als Eingang wählen DDRC = 0xFF; DDRB = 0xFF; PORTD=0x00; //Pullup aktivieren, bzw. auf Null setzen UCSRB |= ( 1 << RXEN ); // RX einschalten UCSRB |= ( 1 << TXEN ); // TX einschalten UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 ); // Asynchron 8N1 UBRRH = 0; UBRRL = 51; //Baudrate 19200 für 16MHz } int main (void) { ini(); uint8_t c; //8bit Variable definiert char alarm1[255]="\x1B[2JAlarm01:OFF\x1B[15CAlarm11:OFF\x1B[15CAlarm21:OFF\r\ n" "Alarm02:OFF\x1B[15CAlarm12:OFF\x1B[15CAlarm22:OFF\r\n" "Alarm03:OFF\x1B[15CAlarm13:OFF\x1B[15CAlarm23:OFF\r\n" "Alarm04:OFF\x1B[15CAlarm14:OFF\x1B[15CAlarm24:OFF\r\n" "Alarm05:OFF\x1B[15CAlarm15:OFF\x1B[15CAlarm25:OFF\r\n"; char alarm2[255]= "Alarm06:OFF\x1B[15CAlarm16:OFF\x1B[15CAlarm26:OFF\r\n" "Alarm07:OFF\x1B[15CAlarm17:OFF\x1B[15CAlarm27:OFF\r\n" "Alarm08:OFF\x1B[15CAlarm18:OFF\x1B[15CAlarm28:OFF\r\n" "Alarm09:OFF\x1B[15CAlarm19:OFF\x1B[15CAlarm29:OFF\r\n" "Alarm10:OFF\x1B[15CAlarm20:OFF\x1B[15CAlarm30:OFF\r\n"; while(1) { while (!(UCSRA & (1<<RXC))); //warten auf RXC = 1 c=UDR; for(c=0;c<255;c++) {while (!(UCSRA & (1<<UDRE))); UDR=alarm1[c];} for(c=0;c<255;c++) {while (!(UCSRA & (1<<UDRE))); UDR=alarm2[c];} } return 0; }
> wie kann ich an Speicherplatz sparen
Deine Texte sind alle gleich:
an einer bestimmten Bildschirmposition steht der Text "Alarm"
gefolgt von einer laufenden Nummer, gefolgt von einem ":"
und wahlweise dem Text "OFF" bzw, "ON".
Du wirst mir doch nicht erzählen wollen, dass du die Texte
nicht zur Laufzeit erzeugen kannst, während du in einer
Schleife durch die Alarmbits durchgehst:
Die Zeilennummer der Alarmmeldung mit der Nummer x ist
offensichtlich x % 10, während die Spaltenposition
x / 10 * irgendeine_Konstante beträgt.
#define ESC "\x1B"
void Transmit( char* String )
{
while( *String ) {
while( !(UCSRA & (1<<UDRE)) )
;
UDR = *String++;
}
}
int main()
{
char Buffer[20];
int i;
...
Transmit( ESC "1B[2J" );
for( i = 0; i < 30; ++i ) {
sprintf( Buffer, ESC "%d;%dH", ( i + 1 ) % 10,
( i + 1 ) / 10 * 20 );
Transmit( Buffer );
sprintf( Buffer, "Alarm%02d:", i + 1 );
Transmit( Buffer );
if( Alarm[i] )
Transmit( "ON" );
else
Transmit( "OFF" );
}
...
}
Falls dir sprintf im Programm zu viel aufträgt, kann man
auch itoa bei etwas eingeschränkter Funktionalität
stattdessen verwenden. sprintf ist ziemlich teuer, das
relativiert sich allerdings wenn man die ganzen
Formatiermöglichkeiten gebrauchen und einsetzen kann.
Auf jeden Fall: Was bringt dir dein vorgefertigter
Totalstring? Der kostet nur Platz, und das Problem dass je
nach festgestelltem Zustand das OFF durch ON ersetzt werden
muss hast du auch nicht gelöst.
hmm, danke vielmal, hab mir schon ma überlegt das ja "alarm:" immer wieder vorkommt und ma das daher so vereinfachen könnte, doch so über sprintf hab ich noch nie was versucht, na mal probiern...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.