Page 1 of 1

Serielle Schnittstelle RS232 unter Linux Programmieren, benötige Hilfe

Posted: 05. Sep 2006 15:02
by Linux-Fan
Hallo,

ich möchte gerne die serielle Schnittstelle unter Linux nutzten.
Dazu habe ich auch ein gutes Tutorial gefunden was dies für DOS erklärt.
Hier mal der Link dazu: http://www.franksteinberg.de/progss.htm

Nun möchte ich das ganze aber unter Linux nutzten und nicht unter DOS.
Wie kann ich dies realisieren?

Hier ist der Programmcode in DOS: http://www.franksteinberg.de/SOURCE/COMBLINK.BAS

Code: Select all

'-- comblink.bas ----------------------------------------------- >>fst'04<< -
' - gibt abwechsend High-Pegel auf TxD und DTR/RTS von COM1 aus
' - an die entsprechenden Pins angeschlossene LEDs blinken abwechselnd
' - Anschlussschema&#58;             &#40;  Pinbelegung  Sub-D Stecker  &#41;
'   * Widerstand 1 kOhm an Masse &#40;9-Pol = Pin 5, 25-Pol = Pin  7&#41;
'   * langes Bein LED1 an TxD    &#40;9-Pol = Pin 3, 25-Pol = Pin  2&#41;
'   * langes Bein LED2 an DTR    &#40;9-Pol = Pin 4, 25-Pol = Pin 20&#41;
'   * langes Bein LED3 an RTS    &#40;9-Pol = Pin 7, 25-Pol = Pin  4&#41;
'   * alle kurzen Beine an den Widerstand
' - funktioniert alternativ auch mit den Modem-LEDs &#40;soweit vorhanden&#41;
'-- V 20040111 ------------------------------- http&#58;//www.FrankSteinberg.de -
		
CLS
LOCATE 4, 1
PRINT " LED-Wechselblinker fuer COM1       >> BENUTZUNG AUF EIGENE GEFAHR <<"
PRINT " Unter DOS oder im DOS-Modus ausfuehren!"
LOCATE 12, 1
PRINT " Datenformat-Register  Bit 6 &#40;break TxD&#41; = "
PRINT " Modem-Steuer-Register Bit 0 &#40;DTR&#41;       = "
PRINT " Modem-Steuer-Register Bit 1 &#40;RTS&#41;       = "

BAdr% = &H3F8        'Basisadresse COM1; COM2 = &H2F8
DFR% = BAdr% + 3     'Adresse des Datenformat-Registers  &#40;Offset 3&#41;
MSR% = BAdr% + 4     'Adresse des Modem-Steuer-Registers &#40;Offset 4&#41;


'Bit3 &#40;MasterInterrupt&#41; setzen; alle anderen Bits loeschen
'&#40;erm”glicht Zugang zum COM-Port unter Win95/98&#41;&#58;
OUT MSR%, 8

DO WHILE INKEY$ = ""
 OUT &#40;DFR%&#41;, INP&#40;DFR%&#41; OR 64    'Bit 6 &#40;Wert 64&#41; setzen     = TxD
 OUT &#40;MSR%&#41;, INP&#40;MSR%&#41; AND 252  'Bit 0+1 &#40;Wert 1+2&#41; l”schen = DTR+RTS
 LOCATE 12, 45&#58; PRINT "1"
 LOCATE 13, 45&#58; PRINT "0"
 LOCATE 14, 45&#58; PRINT "0"
 SLEEP 1
 OUT &#40;DFR%&#41;, INP&#40;DFR%&#41; AND 191  'Bit 6 &#40;Wert 64&#41; l”schen    = TxD
 OUT &#40;MSR%&#41;, INP&#40;MSR%&#41; OR 3     'Bit 0+1 &#40;Wert 1+2&#41; setzen  = DTR+RTS
 LOCATE 12, 45&#58; PRINT "0"
 LOCATE 13, 45&#58; PRINT "1"
 LOCATE 14, 45&#58; PRINT "1"
 SLEEP 1
LOOP
Diesen möchte ich nun unter Linux nutzten.
Wie bekomme ich daraus ein unter Linux lauffähige Kommandozeilenprogramm?

Danke für die Hilfe

Linux-Fan

Posted: 05. Sep 2006 19:02
by Janka
Wenn du DTR etc. von Hand kontrollieren willst, musst du dazu einfach die passenden ioctl()-Aufrufe verwenden. Guck mal hier:

http://www.lafn.org/~dave/linux/Serial- ... -HOWTO.txt

Sektion 7 beschreibt, was du suchst.

Janka

Posted: 11. Sep 2006 16:37
by Linux-Fan
Hallo Janka,
Janka wrote:Wenn du DTR etc. von Hand kontrollieren willst, musst du dazu einfach die passenden ioctl()-Aufrufe verwenden. Guck mal hier:
http://www.lafn.org/~dave/linux/Serial- ... -HOWTO.txt
Sektion 7 beschreibt, was du suchst.
Danke für den Link.

Leider komme ich damit noch nicht wirklich weiter.

Ich suche noch ein paar Muster oder HowTo zu dem Thema.

Danke Linux-Fan.

Posted: 11. Sep 2006 18:24
by Janka
So ähnlich sollte das aussehen:

Code: Select all

#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main &#40;int argc, char* argv&#91;&#93;&#41;
&#123;
  int fd,i;
  
  /* 1. seriellen Port öffnen */
  fd=open&#40;"/dev/ttyS0",O_RDWR&#41;;

  /* 10 mal */
  for &#40;i=0;i<10;i++&#41;
  &#123;
    /* DTR an, schlafen */
    ioctl&#40;fd, TIOCMBIS, TIOCM_DTR&#41;
    sleep&#40;1&#41;;

    /* DTR aus, schlafen */
    ioctl&#40;fd, TIOCMBIC, TIOCM_DTR&#41;
    sleep&#40;1&#41;;
  &#125;

  /* Port schließen, Ende */
  close&#40;fd&#41;;
  return 0;
&#125;

Posted: 11. Sep 2006 19:29
by Linux-Fan
Hallo,

danke für die Hilfe!

Wenn ich das im www richit gelsesn habe ist es so das verschieden PC´s die RS232 Schnittstelle beim booten testen oder Stnadartmässig auf HIGH setzten, ist dem Korrekt so? Wenn ja lässt sich soetwas abfangen, so das nur HIGH gesetzt wird durch das kleine eigene Programm?

Danke Linux-Fan.

Posted: 16. Sep 2006 23:40
by Janka
Der Ruhepegel von RS232 ist +12V. Das nennt man dann "Space". Wenn man ein "Mark" macht, sind das dann -12V.
Die Spannung auf 0 zu setzen ist nicht vorgesehen.
Wenn du LEDs anschließt, drehe einfach deren Polung, um sie bei -12V leuchten zu lassen.

Nochwas: jeder LED sollten eine Dioden 1N4148 *anti*parallel geschaltet werden, da LEDs nur eine Sperrspannung von ca. 5V haben und deshalb bei der jeweils falschen Polung des RS232-Signals (==aus) kaputt gehen können.

Janka

Posted: 17. Sep 2006 12:56
by Linux-Fan
Hallo Janka,

das bedeutet das ich um ein Relay damit zu steuern noch eine Diode dazwischen schalten muß?

Muß bei der LED auch eine zusätzliche Diode eingebaut werden wenn ein entsprechender Vorwiederstand verwedet wird?

Ich habe es hiermit ausgerechent: LED-Vorwiderstandsrechner
http://www.elektronik-kompendium.de/sit ... 109111.htm

MfG