# RS485 unter Linux termios.h



## Johson (1. September 2009)

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


----------



## sheel (1. September 2009)

Willkommen im Forum!

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


----------



## Johson (2. September 2009)

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.


----------



## deepthroat (2. September 2009)

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ß


----------



## Johson (2. September 2009)

deepthroat hat gesagt.:


> 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.
> 
> ...




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.


----------



## deepthroat (2. September 2009)

Johson hat gesagt.:


> 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.


Johson hat gesagt.:


> 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? 


Johson hat gesagt.:


> 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ß


----------



## Johson (3. September 2009)

deepthroat hat gesagt.:


> 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?
> 
> ...



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


----------



## deepthroat (3. September 2009)

Johson hat gesagt.:


> 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


Johson hat gesagt.:


> CRIS?


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


Johson hat gesagt.:


> Das fehlt mir glaubig? Denn unter asm/ioctls.h ist
> 
> #define TIOCSERSETRS485 0x5461
> #define TIOCSERWRRS485 0x5462
> ...


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


Johson hat gesagt.:


> 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


Johson hat gesagt.:


> 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.





Johson hat gesagt.:


> 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ß


----------



## Johson (3. September 2009)

deepthroat hat gesagt.:


> Nö. :-D
> 
> ... ist eine Rechnerarchitektur, so wie Intel 386, PowerPC, SPARC etc.
> 
> ...



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 .


----------



## deepthroat (3. September 2009)

Johson hat gesagt.:


> 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?


Johson hat gesagt.:


> 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?


Johson hat gesagt.:


> Und ja, ich habe hier nur einen Intel PIII .


So wie es aussieht möchtest du eine Lochstreifenkarte auf einem Abakus ausführen.... ;-)

Gruß


----------



## Johson (4. September 2009)

deepthroat hat gesagt.:


> 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.


----------



## deepthroat (4. September 2009)

Johson hat gesagt.:


> 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
> ...


Gruß


----------



## malloc1980 (10. November 2009)

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


----------

