Hallo radbruch,
ja Freude für mich, Dein code funktioniert ! Ich habe auch Deinen 2. Teil und eine Endlosschleife eingefügt. Leider habe ich den SerWrite-Befehl noch nicht gerafft: statt *2 wird nd ausgegeben und an das Ergebnis ein n angehängt. Enter braucht bei dreistelliger Zahl nicht eingegeben werden (Ergebnis kommt von selbst), aber bei nur zweistelliger, Ergebnis ist dann um 1 zu hoch, d.h. die Mathe-Syntax habe ich nur bruchstückhaft kapiert.
PHP-Code:
// asuro multipliziert dreistellige Zahl mit 2 mic 7.6.2012
// Die über die serielle Schnittstelle empfangene dreistellige Zahl wird üngeprüft
// mit zwei multipliziert und das Ergebniss wird zurückgesendet
// https://www.roboternetz.de/community/threads/58106-Mit-dem-asuro-rechnen
#include "asuro.h"
char zahl[3]; // drei Ziffern mit Index 0 bis 2
char ergebniss[4]; // das Ergebniss könnte vierstellig sein
unsigned char temp, i, uebertrag;
int main(void)
{
while(1)
{
Init();
SerWrite("\n\rasuro Taschenrechner\n\n\r", 25);
SerWrite("Bitte dreistellige Zahl eingeben\n\rund mit [Enter] absenden\n\r", 60);
SerRead(zahl, 3, 0); // drei Zeichen ohne Timeout einlesen
StatusLED(YELLOW);
i=2; // Index auf Einerstelle setzen
uebertrag=0; // noch kein Übertrag von der vorhergehenden Stelle
do
{
temp=zahl[i]-'0'; // Ziffer von ascii nach dezimal umrechnen
temp=temp*2+uebertrag; // mit 2 multiplizieren und Übertrag berücksichtigen
if(temp > 9) // Übertrag erkennen
{
uebertrag=1; // Übertrag auf nächste Stelle
temp=temp-10;
}
else
uebertrag=0; // kein Übertrag
ergebniss[i+1]=temp+'0'; // Wert in ascii-Ziffer umrechnen und speichern
}while(i-- != 0); // nächste Stelle berechnen
if(uebertrag) // erste Stelle berechnen (keine Prüfung auf führende Nullen)
ergebniss[0]='1'; // 1 wenn Übertrag...
else
ergebniss[0]=' '; // sonst Leerzeichen
SerWrite(zahl, 3); // Ergebniss ausgeben,
SerWrite("*2=", 3);
SerWrite(ergebniss, 4);
SerWrite("\n\r", 2);
//SerWrite(ergebniss, 4); // Ergebniss ausgeben
//SerWrite("\n\r",2);
StatusLED(RED); // Aufgabe erledigt und Programmende
}
while(1);
return(0);
}
Lesezeichen