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..
Ich weigere mich das zu kommentieren, bevor du deine "W"-Taste repariert hast.
Herrminator schrieb: > vvie behebe ich dieses Problem ? Oder vvas mache ich falsch?? Ich würde statt 2x v einfach w drücken...
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!
Vielleicht steht der Aufruf send_z(sekunde) auch nicht in einer Funktion?
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...
...muss auch nicht mal ein include von dir sein. Evtl. gibt's halt die Funktion "send()" schon woanders. Nenn deine Funktion doch einfach mal um.
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);
Easylife schrieb: > int wert = 12345; > unsigned char c1 = (wert >> 8); > unsigned char c2 = (wert & 0xff); > send(c1); > send(c2); habe es jetzt so gemacht: unsigned int asdf; unsigned char c1,c2; asdf = sekunden; c1= (asdf >> 8); c2 = (asdf & 0xff); send(c1); send(c2); nun sendet er mir aber folgendes ఀ:ఀ
??? welchen wert hast du denn in "sekunden". ist der <= 32767 ? was erwartest du als output, etwas lesbares?
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.
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);
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:
1 | #include <stdio.h> |
2 | #include <string.h> |
3 | |
4 | (...)
|
5 | |
6 | char buf[10]; |
7 | int i; |
8 | sprintf(buf, "%d\n", msekunden); |
9 | for (i=0; i<strlen(buf); i++) |
10 | send(buf[i]); |
falls nicht, dann so:
1 | int divider; |
2 | int digit; |
3 | |
4 | divider = 10000; |
5 | for(i=0; i<5; i++) { |
6 | digit = msekunden / divider; |
7 | send('0'+digit); |
8 | msekunden -= digit * divider; |
9 | divider /= 10; |
10 | }
|
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!!
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.