RS485 unter Linux termios.h

Johson

Grünschnabel
moin ich brauche da mal eine rat.

ich versuche seid tagen die RS485-Schnittstelle unter linux ( C Language ) zu implementieren. ich habe hier zu mich an dieses Bsp. gehalten

http://developer.axis.com/wiki/doku.php?id=rs485

struct rs485_ctrl {
unsigned short rts_on_send;
unsigned short rts_after_sent;
unsigned int delay_rts_before_send;
unsigned short enabled;
};

// ...

// Set the port in 485 mode
ctrl485.rts_on_send = 0;
ctrl485.rts_after_sent = 1;
ctrl485.delay_rts_before_send = 0;
ctrl485.enabled = 1;
status = ioctl(fd, TIOCSERSETRS485, &ctrl485);
if (status) {
printf("ERROR PORT 1! TIOCSERSETRS485 failed %i\r\n", status);
return -1;
}


Über die struktur soll die Schnittstelle für RS485 konfiguriert werden. und über die Funktion ioctl(fd, TIOCSERSETRS485, &ctrl485); gesetzt werden. Mein Problem ist, das der Wert von TIOCSERSETRS485 nicht erkannt wird. Dieser sollte in asm/ioctls.h drin stehen. was er aber nicht tut. daher habe ich ihn selber festgelegt.

#define TIOCSERSETRS485 0x5461
#define TIOCSERWRRS485 0x5462

Allerdings gibt die Funktion ioctl(fd, TIOCSERSETRS485, &ctrl485); immer einen Fehler aus. Hat einer schon Erfahrungen gesammelt?

Gruss
 
hallo,

die ioctl- Funktion gibt entweder 0 für success oder -1 für failt zurück. meine vermuttung ist, dass der Wert #define TIOCSERSETRS485 0x5461 nicht gesetzt werden kann.
 
Hi.

Es ist unsinnig den Wert zu definieren, wenn dieser nicht bereits in der Headerdatei drin steht. Selbstverständlich kann die ioctl Funktion damit nichts anfangen.

Die TIOCSERSETRS485 Konstanten sind ausschließlich für die CRIS Architektur definiert. Welche Architektur benutzt du?

Gruß
 
Hi.

Es ist unsinnig den Wert zu definieren, wenn dieser nicht bereits in der Headerdatei drin steht. Selbstverständlich kann die ioctl Funktion damit nichts anfangen.

Die TIOCSERSETRS485 Konstanten sind ausschließlich für die CRIS Architektur definiert. Welche Architektur benutzt du?

Gruß


Da geb ich dir völlig, eine Funktion die -1 als Fehler zurück gibt macht nicht viel Sinn. ioctl is aber nun eine systemfunktion aus sys/ioctl.h und dort ist der Fehlercode -1 nun mal festgelegt. Ich habe den Fehler aber mal mit perror() ausgelesen. Und perror() gibt Invalid Argument zurück. Sagt mir also jetzt was? ....Enweder hat die Übergabe in der Funktion nicht geklappt und der Wert ist ungültig.

Da ich aber auch nicht weiss, ob ich die PCI Karte richtig unter Linux konfiguriert habe,
habe ich erstmal eine Support-Anfrage an den Hersteller moxa.com gestellt

Ich werde berichten.
 
Da geb ich dir völlig, eine Funktion die -1 als Fehler zurück gibt macht nicht viel Sinn. ioctl is aber nun eine systemfunktion aus sys/ioctl.h und dort ist der Fehlercode -1 nun mal festgelegt.
Du hast da was missverstanden. Ich sprach über die Konstanten die du selbst festgelegt hast. Es ist unsinnig das zu tun, denn die ioctl Funktion kann damit nichts anfangen.
Ich habe den Fehler aber mal mit perror() ausgelesen. Und perror() gibt Invalid Argument zurück. Sagt mir also jetzt was? ....Enweder hat die Übergabe in der Funktion nicht geklappt und der Wert ist ungültig.
Letzteres. Wie soll das denn funktionieren? :confused:
Ich werde berichten.
Welche Architektur verwendest du? Hast du das denn vor CRIS kompiliert? Hast du das entsprechende SDK verwendet? \edit: Diese Angaben solltest du natürlich auch in deiner Supportanfrage einfließen lassen; kurzum: was genau hast du überhaupt gemacht?

Gruß
 
Du hast da was missverstanden. Ich sprach über die Konstanten die du selbst festgelegt hast. Es ist unsinnig das zu tun, denn die ioctl Funktion kann damit nichts anfangen.

Letzteres. Wie soll das denn funktionieren? :confused:

Welche Architektur verwendest du? Hast du das denn vor CRIS kompiliert? Hast du das entsprechende SDK verwendet? \edit: Diese Angaben solltest du natürlich auch in deiner Supportanfrage einfließen lassen; kurzum: was genau hast du überhaupt gemacht?

Gruß

Oh.. so langsam werde ich schlauer... Mit der ioctl-Funktion will ich quasi den RS485 Standard bekannt geben. Denn über die struct aus meinen ersten Thread will - muss - ich die Enable - Leitung steuern. Ich hoffe du kennst den RS485 Standard. ;-)

CRIS?

Das fehlt mir glaubig? Denn unter asm/ioctls.h ist

#define TIOCSERSETRS485 0x5461
#define TIOCSERWRRS485 0x5462

nicht aufgeführt. Daher kann ich wohl vergebens versuchen die Werte selber zu konfigurieren. Woher kann ich jetzt CRIS beziehen? Ich dachte, wenn ich GCC komplett installiere, sind alle Header Files vorhanden. Habe GCC 4.1.0 (Suse Linux 10.1) installiert. Hat CRIS ausschliesslich was mit axis zutun?

Kannst du mir jetzt da weiterhelfen? Denn die Karte (CP 134U - moxa.com) funktioniert wohl einwandfrei. Gibt es denn für Linux auch eine Art SDK wie unter Windows? Oder meinst damit eigentlich GCC? Sorry wenn ich so blöd frage?

Gruss
 
Zuletzt bearbeitet:
Oh.. so langsam werde ich schlauer... Mit der ioctl-Funktion will ich quasi den RS485 Standard bekannt geben. Denn über die struct aus meinen ersten Thread will - muss - ich die Enable - Leitung steuern. Ich hoffe du kennst den RS485 Standard. ;-)
Nö. :-D
... ist eine Rechnerarchitektur, so wie Intel 386, PowerPC, SPARC etc.
Das fehlt mir glaubig? Denn unter asm/ioctls.h ist

#define TIOCSERSETRS485 0x5461
#define TIOCSERWRRS485 0x5462

nicht aufgeführt.
Von welcher asm/ioctls.h Datei sprichst du? Die unterscheiden sich je nach Architektur.
Woher kann ich jetzt CRIS beziehen? Ich dachte, wenn ich GCC komplett installiere, sind alle Header Files vorhanden.
Das hat nichts mit GCC zu tun. asm/ioctls.h ist ein Systemheader aus dem Linux-Kernel. Standardmäßig wird der Header für deine Architektur, die du benutzt auch unter /usr/include installiert, allerdings vermute ich mal du verwendest einen Intel PC? Dann bräuchtest du erstmal einen Cross-Compiler der als Targetsystem die CRiS Architektur hat. Siehe http://developer.axis.com/wiki/doku.php?id=axis:compiler_install
Hat CRIS ausschliesslich was mit axis zutun?
Ja.
http://www.mjmwired.net/kernel/Documentation/cris/ hat gesagt.:
CRIS is an acronym for 'Code Reduced Instruction Set'. It is the CPU
architecture in Axis Communication AB's range of embedded network CPU's,
called ETRAX. The latest CPU is called ETRAX 100LX, where LX stands for
'Linux' because the chip was designed to be a good host for the Linux
operating system.
Kannst du mir jetzt da weiterhelfen? Denn die Karte (CP 134U - moxa.com) funktioniert wohl einwandfrei.
Also hast du den Treiber installiert? http://www.moxa.com/support/download.aspx?d_id=1662

Gruß
 
Zuletzt bearbeitet:
Nö. :-D

... ist eine Rechnerarchitektur, so wie Intel 386, PowerPC, SPARC etc.

Von welcher asm/ioctls.h Datei sprichst du? Die unterscheiden sich je nach Architektur.

Das hat nichts mit GCC zu tun. asm/ioctls.h ist ein Systemheader aus dem Linux-Kernel. Standardmäßig wird der Header für deine Architektur, die du benutzt auch unter /usr/include installiert, allerdings vermute ich mal du verwendest einen Intel PC? Dann bräuchtest du erstmal einen Cross-Compiler der als Targetsystem die CRiS Architektur hat. Siehe http://developer.axis.com/wiki/doku.php?id=axis:compiler_install

Ja.

Also hast du den Treiber installiert? http://www.moxa.com/support/download.aspx?d_id=1662

Gruß

Super... ich dachte ich hätts jetzt. Wenn CRIS von Axis kommt, frage ich mich, warum mir der Support von moxa nichts erzählt. denn die Treiber liefern Sie ja mit und installiert habe ich se auch.

Wenn ich CRIS jetzt über einen Cross Compiler zum laufen bekomme, kann ich es denn ganz normal nutzen unter gcc? oder gibs da abhängigkeiten zu axis.

Und ja, ich habe hier nur einen Intel PIII .
 
Super... ich dachte ich hätts jetzt. Wenn CRIS von Axis kommt, frage ich mich, warum mir der Support von moxa nichts erzählt. denn die Treiber liefern Sie ja mit und installiert habe ich se auch.
Und die Beispielprogramme sind dir auch aufgefallen?
Wenn ich CRIS jetzt über einen Cross Compiler zum laufen bekomme, kann ich es denn ganz normal nutzen unter gcc? oder gibs da abhängigkeiten zu axis.
Nochmal: CRiS ist eine Architektur, also Hardware. Die cross-compilierten Programme sind nur auf einer CRiS Hardware lauffähig. Die du vermutlich nicht hast?
Und ja, ich habe hier nur einen Intel PIII .
So wie es aussieht möchtest du eine Lochstreifenkarte auf einem Abakus ausführen.... ;-)

Gruß
 
Zurück