tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
2411
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Johson Johson ist offline Rookie
    Registriert seit
    Sep 2009
    Beiträge
    6
    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
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Willkommen im Forum!

    Es wäre hilfreich zu wissen, welcher Fehler auftritt?
     

  3. #3
    Johson Johson ist offline Rookie
    Registriert seit
    Sep 2009
    Beiträge
    6
    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.
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Johson Johson ist offline Rookie
    Registriert seit
    Sep 2009
    Beiträge
    6
    Zitat Zitat von deepthroat Beitrag anzeigen
    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.
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Johson Beitrag anzeigen
    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.
    Zitat Zitat von Johson Beitrag anzeigen
    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?
    Zitat Zitat von Johson Beitrag anzeigen
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Johson Johson ist offline Rookie
    Registriert seit
    Sep 2009
    Beiträge
    6
    Zitat Zitat von deepthroat Beitrag anzeigen
    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?

    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
    Geändert von Johson (03.09.09 um 16:54 Uhr)
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Johson Beitrag anzeigen
    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
    Zitat Zitat von Johson Beitrag anzeigen
    CRIS?
    ... ist eine Rechnerarchitektur, so wie Intel 386, PowerPC, SPARC etc.
    Zitat Zitat von Johson Beitrag anzeigen
    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.
    Zitat Zitat von Johson Beitrag anzeigen
    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....mpiler_install
    Zitat Zitat von Johson Beitrag anzeigen
    Hat CRIS ausschliesslich was mit axis zutun?
    Ja.
    Zitat Zitat von http://www.mjmwired.net/kernel/Documentation/cris/
    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.
    Zitat Zitat von Johson Beitrag anzeigen
    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ß
    Geändert von deepthroat (03.09.09 um 17:26 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Johson Johson ist offline Rookie
    Registriert seit
    Sep 2009
    Beiträge
    6
    Zitat Zitat von deepthroat Beitrag anzeigen
    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....mpiler_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 .
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Johson Beitrag anzeigen
    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?
    Zitat Zitat von Johson Beitrag anzeigen
    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?
    Zitat Zitat von Johson Beitrag anzeigen
    Und ja, ich habe hier nur einen Intel PIII .
    So wie es aussieht möchtest du eine Lochstreifenkarte auf einem Abakus ausführen....

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    Johson Johson ist offline Rookie
    Registriert seit
    Sep 2009
    Beiträge
    6
    Zitat Zitat von deepthroat Beitrag anzeigen
    Und die Beispielprogramme sind dir auch aufgefallen?
    Ja die sind mir aufgefallen, aber das habe ich schon versucht dem support vom moxa zu erklären. Ich muss eine Application unter Linux schreiben. Dazu brauche ich die termios.h, die unteranderem die Baudraten zur Verfügung stellt. Somit ist die Windows.h nicht wirklich hilfreich.

    Aber trotzdem erstmal Danke.
     

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Johson Beitrag anzeigen
    Ja die sind mir aufgefallen, aber das habe ich schon versucht dem support vom moxa zu erklären. Ich muss eine Application unter Linux schreiben. Dazu brauche ich die termios.h, die unteranderem die Baudraten zur Verfügung stellt. Somit ist die Windows.h nicht wirklich hilfreich.
    Ich rede nicht von den Windows Beispielen, sondern von den Beispielen, die beim Linuxtreiber dabei sind - siehe Link
    - msterm A simple terminal program which is useful in testing serial
    ports.

    - muestty Device configuration tool for MUE series PCI Express
    multiport board(CP-102E, CP-102EL, CP-132EL, CP-132EL-I,
    CP-114EL, CP-114EL-I).
    The tool provides two functions to set and get inerface
    and terminator resistor on the device.
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  13. #13
    malloc1980 malloc1980 ist offline Grünschnabel
    Registriert seit
    Nov 2009
    Beiträge
    1
    Hey Johson!

    hast du mittlerweile deinen RS485 Treiber am laufen? Ich bin grad selbst dabei
    was zu finden wie ich Daten von RS485 lesen und schreiben kann. Allerdings für
    powerpc Architecture.
    Dabei hab ich in der ioctls.h die beiden Defines

    #define TIOCGRS485 0x542e
    #define TIOCSRS485 0x542f

    gefunden. Zusätzlich braucht man eine Struktur (serial_rs485) die in include/linux
    /serial.h zu finden ist. Allerdings wenn ich die entsprechenden includes einbinde
    bekomme ich Error Meldung dass die Struktur nicht gefunden werden kann ebenso
    die Defines.

    Vielleicht bist du ja ein Stück weiter und kannst mir helfen...oder vielleicht auch
    jemand anderes hier?

    Danke schön mal für eure Hilfe

    Grüße
    Frank
     

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 11.01.06, 09:32
  2. Antworten: 9
    Letzter Beitrag: 03.11.04, 11:57
  3. Welches Linux, und Java Programmierung unter Linux
    Von Mc Nanuk im Forum Linux & Unix
    Antworten: 14
    Letzter Beitrag: 19.10.04, 15:01
  4. Antworten: 0
    Letzter Beitrag: 30.05.02, 23:07