Hallo Leute,
habe beim schreiben mit Keil uvision 4 ein problem....
vvollte einen gespeicherten int vvert der in der Variable unsigned int
sekunde gespeichert vvird an den PC senden..
dazu habe ich erstmal die Funktion geschrieben:
void send_z(unsigned int zahl)
{
SBUF = zahl;
while(TI == 0);
TI = 0;
}
und den Aufruf:
send_z(sekunde);
aber beim compilieren kommt folgender Fehler:
pro.c(57): error C236: 'send_z': different length of parameter lists
vvie behebe ich dieses Problem ? Oder vvas mache ich falsch??
danke..
Kennt die aufrufende Stelle die "Signatur" von send_z, z.B gleiche
Source, vorher definiert, bzw. H-File inkludiert,
oder rätselt der Compiler mit "intsend_z()" herum, wie er es macht, wenn
er eine Funktion bei Aufruf zum ersten mal sieht?
Es interessiert natürlich keinem Menschen, was in Zeile 57 steht.
Gleiches gilt für die Definition (typ) von sekunde.
Also: Alle mit einer funktionierenden Glaskugel bitte vortreten!
Ja in dieser Zeiler oder besser gesagt ab dieser Zeile steht das was ich
vorher geschrieben hatte:
void send_z(unsigned int zahl)
{
SBUF = zahl;
while(TI == 0);
TI = 0;
}
aber bei mir geht es ja gerade um diesen Fehler "different length of
parameter lists" ob ich da irgendwas vertauscht habe?
Also wenn ich ein char Zeichen sende mit folgender Funktion:
void send(unsigned char wert)
{
SBUF = wert;
while(TI == 0);
TI = 0;
}
und dann als Aufruf
send('A');
dann wird dieses Zeichen auch gesendet..
nur muss ich in meinem Fall eine Variable, die als int definiert ist
senden..
dabei dachte ich mir ich könnte das so ähnlich machen wie beim Char,
jedoch kam dann die folgende Fehlermeldung aus dem ersten Post.
Sorry wenn ich mich blöd ausdrücke und sorry an meinem Laptop fehlt die
W taste...
Du hast vermutlich noch irgendwo ein include file, in dem der Prototyp
für
void send(unsigned char wert)
mit weiteren Parametern definiert wurde. Das passt dann nicht so gut
zusammen...
achso, in deinem letzten Post stand es ja auch.
"send_z()" gibt's wohl schon als Prototyp mit anderen Parametern.
Wenn du es in send() umbenennst gehts.
Dann wäre noch die Frage, ob man mit "SBUF = x" überhaupt mehr als 8-Bit
senden kann...
Evtl. machst du es besser so:
int wert = 12345;
unsigned char c1 = (wert >> 8);
unsigned char c2 = (wert & 0xff);
send(c1);
send(c2);
in sekunden steht ein per lichtschranke ermittelter wert , der immer
zwischen 1 und 10 liegt... auf dem display des microkontrollers zeigt es
diesen auch korrekt an, aber im terminal programm nicht.
Easylife schrieb:> weil es im terminal binär ankommt.>> unsigned char c1, c2, c3;> c1 = '0' + (sekunden / 10);> c2 = '0' + (sekunden % 10);> c3 = 0x0a; // new line> send(c1);> send(c2);> send(c3);
danke easylife klappt so!!
nun klappt das aber nur bei sekunden oder wie?
Bei millisekunden gibt der dann aber z.B. j7 aus..
c1 = '0' + (msekunden / 10);
c2 = '0' + (msekunden % 10);
c3 = 0x0a; // new line
send(c1);
send(c2);
send(c3);
Herrminator schrieb:> Easylife schrieb:>> weil es im terminal binär ankommt.>>>> unsigned char c1, c2, c3;>> c1 = '0' + (sekunden / 10);>> c2 = '0' + (sekunden % 10);>> c3 = 0x0a; // new line>> send(c1);>> send(c2);>> send(c3);>> danke easylife klappt so!!>> nun klappt das aber nur bei sekunden oder wie?> Bei millisekunden gibt der dann aber z.B. j7 aus..
dicker, dann schreib doch nicht, dein wert ist sekunden zwischen 0 und
10, sondern milisekunden zwischen 0 und 10000.
versuche mal zu verstehen, was mein code macht.
"sekunden / 10" ergibt die zehnerstelle
"sekunden % 10" ergibt die einerstelle (siehe modulo operator)
wenn du da irgend eine zahl >10 einsetzt, kommt natürlich bullshit raus.
'0' + x
ergibt einen Ascii Code. Günstigerweise liegen die Ziffern direkt
hintereinander, so dass ('0'+5) das Zeichen '5' ergibt.
hast du sprintf() zur verfügung?
dann gehts so:
ja habe beides, also sekunden und ms
die ausgabe sollte dann so aussehen 6:30 also (sek:ms),
habe jetzt für die ms die version mit digit genommen. und siehe da die
ausgabe ist jetz 06:00300 aber das reicht mir schon völlig.. richtig
dickes danke an dieser stelle schonmal an dich!!