Ich habe hier kleine logische Verständnisprobleme:
Hier wird eine Struktur definiert mit dem Namen Zugriff.
Ich stelle mir ds so vor:
int x = (int test, char test_2) Zugriff
Also eine Variable Zugriff von Typ(int test, char test)
In main() wird die funktion aufgerufen mit der Adresse der Variable
com_var_1.
Also habe ich die Funktion mit den Adressen von Werten int test, char
test_2 aufgerufen?
In com_var_1
1
intmain(void)
2
{
3
funktion_mit_pcd_werten_fuehlen(&com_var_1);
4
}
In dieser Funktion befühle ich die Struktur Zugriff mit Werten, die ich
mit der Pointervariable *pointer an die Struktur übergeben.
1
funktion_mit_pcd_werten_fuehlen(COM_TYP*pointer)
2
{
3
(*pointer).baudrate=9600;
4
(*pointer).dataBits=8;
5
(*pointer).stopBits=2;
6
(*pointer).parity=1;
7
(*pointer).PCD_adress=77;
8
}
Das Resultat:
funktion_mit_pcd_werten_fuehlen(&com_var_1) holt sich die
Werte(Adressen) aus der Struktur.
funktion_mit_pcd_werten_fuehlen(COM_TYP *pointer) befühlt diese mit
konkreten Werten.
Ist das so richtig?
> Ist das so richtig?
Ja, wobei der Typ des Arguments com_var_1 aber COM_TYP * und nicht
Zugriff * sein muss.
Außerdem:
1
(*pointer).baudrate=9600;
schreibt man üblicherweise so:
1
pointer->baudrate=9600;
Das ist zwar semantisch das Gleiche, aber etwas übersichtlicher und
weniger Tipparbeit.
> funktion_mit_pcd_werten_fuehlen(COM_TYP *pointer) befühlt diese mit> konkreten Werten.
Ich habe das Gefüll, du solltest noch ein klein wenig an deiner
Rechtschreibung feilen ;-)
Hallo!
> Hier wird eine Variable definiert (com_var_1), die auf Struktur Zugriff
verweist.
> Also hat diese Variable alle in Stuct definierte Datentypen?
--> Na ja! Also Typedef definiert keine wirklichen Speicherbereich so
wie es Variablen tun. In erster Linie ist ein struct nur eine Art
Schablone, wie die Speicherbereiche einer Variable logisch zugeordnet
werden.
> Zugriff com_var_1;
--> Erst hiermit wird wirklich Speicher reserviert. An der Adresse von
der Variablen com_var_1 findest Du eine Struktur der Form "Zugriff",
sprich, erst 4 Byte (?) die test repräsentieren, gefolgt von 1 Byte das
test_2 darstellt.
> In main() wird die funktion aufgerufen mit der Adresse der Variable com_var_1.> Also habe ich die Funktion mit den Adressen von Werten int test, char test_2
aufgerufen?
--> Nein, es ist so wie Du davor geschrieben hast. Du rufst die Funktion
mit der Adresse von com_var_1 auf. Der Kompiler "weiß" jedoch, dass
diese Variable den Typ Zugriff ist und daher kann man darin
(*pointer).test verwenden. Der Kompiler übersetzt dann wie folgt:
> funktion_mit_pcd_werten_fuehlen(COM_TYP *pointer)> {> (*pointer).baudrate = 9600;> (*pointer).dataBits = 8;> (*pointer).stopBits = 2;> (*pointer).parity =1;> (*pointer).PCD_adress = 77;> }
Ok, Dein struct heißt dann eigentlich COM_TYP, oder? ;-)
Der Typ in der Variablen in main() als auch hier in dieser Funktion
sollte der Selbe sein - damit das funktioniert.
Also gehört dann eher sowas dazu:
1
typedefstruct
2
{
3
intbaudrate;
4
chardataBits;
5
charstopBits;
6
charparity;
7
charPCD_adress;
8
}COM_TYP;
Gruß Tuffke
P.S.: Es heißt befüLLen nicht befüHLen ... wobei das andere eigentlich
auch eine schöne Vorstellung ist ... :-D
Danke, konstruktive Kritik ist zur Kenntniss genommen!:)
Im nächsten Schritt will ich UART mit Daten füttern:
baudrate = 9600;
dataBits = 8;
stopBits = 2;
parity = 1;
main()
Aufruf der Funktion mit der Adresse von com_var_1, diese verweist auf
die Struktur mit Daten.
1
uart0_init(&com_var_1);
Die Funktion bekommt konkrete Werte (z.B dataBits = 8)
1
intuart0_init(COM_TYP*pointer)
2
{
3
unsignedchardataBits;
4
unsignedcharstopBits;
5
unsignedcharparity;
6
unsignedlongintbaudrate;
7
unsignedcharTemp;
8
9
Abfrage:WievieledataBits,lautDefinition8
10
........
11
12
if(dataBits==8)
13
Temp|=0x03;
14
elseif(dataBits==7)
15
Temp|=0x02;
16
else
17
return(1);
18
19
.......
20
21
RegisterU0LCRerhält8dataBits
22
U0LCR=Temp;
Leider liefert die Funktione int uart0_init( COM_TYP *pointer ) keine
richtigen Werte an die IF-Abfragen.
Wenn ich in der Funktion die Variablen Fest definiere z.B. :unsigned
char dataBits=8;
Dann werden die Register richtig gesetzt, Also es liegt nicht an den
Abfragen.
Hilfe.
Danke für die tolle Erkläreung.
Ja min struct-Type heißt COM_TYP
Diese Werte brauch ich eigenlich in der Funktin nicht zu deklarieren
1
unsignedchardataBits;
2
unsignedcharstopBits;
3
unsignedcharparity;
4
unsignedlongintbaudrate;
diese müssen doch durch COM_TYP *pointer an die Funktion übergeben
werden
int uart0_init( COM_TYP *pointer )
Das passiert aber nicht, der Compiler meldet:
Blinky.c(52): error: #20: identifier "dataBits" is undefined
Also erhält er die Werte nicht.
Gast schrieb:
> Danke, konstruktive Kritik ist zur Kenntniss genommen!:)>> Im nächsten Schritt will ich UART mit Daten füttern:>> baudrate = 9600;> dataBits = 8;> stopBits = 2;> parity = 1;>> main()> Aufruf der Funktion mit der Adresse von com_var_1, diese verweist auf> die Struktur mit Daten.>>>
1
uart0_init(&com_var_1);
>>> Die Funktion bekommt konkrete Werte (z.B dataBits = 8)>
>>
Mhm... also deine Datenstruktur die du übergibst muss natürlich
initialisiert sein. Also in dataBits muss konkret auch ein vernünftiger
Wert stehen.
Ansonsten sollte es keinen Unterschied machen, ob du die Werte lokal
definierst und dann zuweist oder global definierst und dann zuweist.
> Leider liefert die Funktione int uart0_init( COM_TYP *pointer ) keine> richtigen Werte an die IF-Abfragen.
Siehe oben.
> Wenn ich in der Funktion die Variablen Fest definiere z.B. :unsigned> char dataBits=8;> Dann werden die Register richtig gesetzt, Also es liegt nicht an den> Abfragen.
Richtig, der Fehler muss als bei der Übergabe deiner globalen
Datenstruktur an deine lokale Variable liegen.
Warum legst du eigentlich noch eine lokale Variable an? Du hast wohl
zuviel Stack oder wie? ;)
Gruß
>> Hilfe.
Eugen Spaß schrieb:
> Hab das Problem endllich gelöst und zwar der Zugriff auf die Variablen> muss so erfolgen:> pointer->Variable
Richtig. Aus dem ersten Codeschnippsel kam nicht heraus was du
tatsächlich falsch gemacht hast.
Noch eine kleine Anmerkung:
Mehrere returns innerhalb einer Funktion sind unschön und eine
potentielle Fehlerquelle. Gut, in dieser kleinen Funktion vielleicht
noch nicht, aber wenn man den Stil beibehält, fängt man sich früher oder
später Probleme ein.
Besser:
sich oben eine return Variable definieren. Diese dann im
Funktionsverlauf setzen (dort wo du direkt dein return gemacht hättest)
und dann am Ende EIN return.
Gruß
PS: Ist es Absicht, dass du bei parity und stop bit die gleichen Bits
setzt?!
>>> ucTemp = 0;> // Word Lenght Select> if (pointer->dataBits == 8)> ucTemp |= 0x03;> else if (pointer->dataBits == 7)> ucTemp |= 0x02;> else> return(1);>> // Stop Bit Select> if (pointer->stopBits == 1 )> ucTemp |= 0x00;> else if ( pointer->stopBits == 2 )> ucTemp |= 0x04;> else> return(1);>> // Parity Enable> if (pointer->parity == 0) //disable> ucTemp |= 0x00;> else if (pointer->parity == 1) //enable> ucTemp |= 0x04;> else> return(1);>> //Parity Select> if (pointer->parity == 'o')> ucTemp |= 0x00;> else if (pointer->parity == 'e')> ucTemp |= 0x10;> else if (pointer->parity == 1)> ucTemp |= 0x20;> else if (pointer->parity == 0)> ucTemp |= 0x30;> else