Programmierung unter Linux


Programmierung unter Linux

von mega-hz » Do 25. Dez 2008, 17:47
Hi,

für meinen Server benötige ich ein kleines Programm, welches eine
INF-Datei einliest und zu angegebenen Uhrzeiten Bit 0-7 vom LPT Port
ein- oder ausschaltet!
Ziel ist es, via einer Ralyskarte am LPT Port Dinge automatisch ein- und ausschalten zu lassen!

Kennt sich jemand da aus und könnte mir eine solche Routine schreiben?

Gruß,
Wolfram.

Re: Programmierung unter Linux

von cas » Do 25. Dez 2008, 21:40
mega-hz hat geschrieben:Hi,

für meinen Server benötige ich ein kleines Programm, welches eine
INF-Datei einliest und zu angegebenen Uhrzeiten Bit 0-7 vom LPT Port
ein- oder ausschaltet!
Ziel ist es, via einer Ralyskarte am LPT Port Dinge automatisch ein- und ausschalten zu lassen!

Kennt sich jemand da aus und könnte mir eine solche Routine schreiben?

Gruß,
Wolfram.


Hallo Wolfram,

ich denke zum Testen bräuchte der Programmierer das Relay zum Test.

Behalte im Hinterkopf das Linux kein Echtzeitsystem ist, d.h. der Hardwarezugriff kann mit Verzögerung geschehen.

LPT Zugriff kann von vielen Programmiersprachen geschehen, z. B. C, C++, Forth oder Python

Die IO-Port FAQ hat ein kleines Beispielprogramm in C, vielleich schon genug für Dich -> http://www.faqs.org/docs/Linux-mini/IO- ... mming.html

Ich würde ein Programm machen, welches den Status der Bits (ein oder aus) per Parameter enthält, und dieses Programm dann per CRON-Job zu den gegebenen Uhrzeiten aufrufen.

Ciao

Carsten

von mega-hz » Fr 26. Dez 2008, 22:00
@cas:

könnte ich diese Routine schon zum setzen einzelner Bits am LPT nehmen?
----------------
/*
* example.c: very simple example of port I/O
*
* This code does nothing useful, just a port write, a pause,
* and a port read. Compile with `gcc -O2 -o example example.c',
* and run as root with `./example'.
*/

#include <stdio>
#include <unistd>
#include <asm>

#define BASEPORT 0x378 /* lp1 */

int main()
{
/* Get access to the ports */
if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);}

/* Set the data signals (D0-7) of the port to all low (0) */
outb(0, BASEPORT);

/* Sleep for a while (100 ms) */
usleep(100000);

/* Read from the status port (BASE+1) and display the result */
printf("status: %d\n", inb(BASEPORT + 1));

/* We don't need the ports anymore */
if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);}

exit(0);
}

/* end of example.c */
------------------------------------

Woher bekomme ich die oben aufgeführten include dateien?
Und wie gehe ich am besten vor, unter ner (putty)konsole auf meinem Server?
Mit nem Texteditor diese Datei erstellen, z.B. in /home speichern und dann?

Gruß,
Wolfram.

von cas » Sa 27. Dez 2008, 00:14
mega-hz hat geschrieben:@cas:

könnte ich diese Routine schon zum setzen einzelner Bits am LPT nehmen?
----------------
/*
* example.c: very simple example of port I/O
*
* This code does nothing useful, just a port write, a pause,
* and a port read. Compile with `gcc -O2 -o example example.c',
* and run as root with `./example'.
*/

#include <stdio>
#include <unistd>
#include <asm>

#define BASEPORT 0x378 /* lp1 */

int main()
{
/* Get access to the ports */
if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);}

/* Set the data signals (D0-7) of the port to all low (0) */
outb(0, BASEPORT);

/* Sleep for a while (100 ms) */
usleep(100000);

/* Read from the status port (BASE+1) and display the result */
printf("status: %d\n", inb(BASEPORT + 1));

/* We don't need the ports anymore */
if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);}

exit(0);
}

/* end of example.c */
------------------------------------

Woher bekomme ich die oben aufgeführten include dateien?
Und wie gehe ich am besten vor, unter ner (putty)konsole auf meinem Server?
Mit nem Texteditor diese Datei erstellen, z.B. in /home speichern und dann?

Gruß,
Wolfram.


Die routine sollte als Grundlage reichen, aber ich kann Dir nicht Linux C-Programmierung im Dialog über das Forum beibringen (das wäre für uns beide frustrierend da zu langsam).

Ich sehe 2 Möglichkeiten:

a) Du arbeitest Dich durch die FAQs (http://www.faqs.org/faqs) oder ein gutes Buch (z. B. http://www.wrox.com/WileyCDA/WroxTitle/ ... ption.html , das freie PDF aus dem Buch sollte Deine Fragen von oben beantworten)

b) Du öffnest SSH (Port 22) zu Deinem Entwicklungs-Rechner, installierst "screen", und wir schauen uns die Aufgabe zusammen auf dem Server an (d.h. ändern das Programm, compilieren es und testen es aus)

Aus Sicherheitsgründen möchte man nicht den C-Compiler und alle Programme zum übersetzen (die GCC Toolchain) auf einem Server haben (das ist eine Einladung für Cracker), sondern man compiliert und testet auf einem Entwicklungssystem, und wenn das Programm läuft, dann kopiert man das fertige Programm auf den Server.

Ciao

Carsten

von mega-hz » So 28. Dez 2008, 00:25
Nach einem laaaangen Telefongespräch sowie gleichzeitiger Online
Hilfe mit CAS schalten nun meine Relays am Server!
Habe einiges von Linux und C-Programmierung, Compelierung usw.
dazugelernt!

Hier das Listing, welches dafür sorgt, daß meine Relays-Karte am LPT
zu bestimmten Zeiten (gesteuert via CRON, eine Art Taskplaner)
Sachen wie Treppen-LED-Nachtbeleuchtung, Aquarium-Lampe und Nacht-Beleuchtung, den SAT-Receiver meiner Tochter usw. ein- und ausschaltet:

#include <stdio>>
#include <unistd>
#include <sys>

#define BASEPORT 0x378 /* lp1 */

int main(int argc, char * argv[])
{

int value;

value = atoi(argv[1]);
printf("Setze Wert auf %i \n", value);

/* Zugriff zum LPT-Port? */
if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);}

/* Ausgabe des in "value" ergebenen Wertes an den LPT-Port */
outb(value, BASEPORT);

/* Nach Gebrauch schliessen wir den Port wieder */
if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);}

exit(0);
}

Die CRON Config sieht so aus:

# Wolframs Relays Steuerung

# Treppen Nachtbeleuchtung = Bit 0 (1)
# Michelle SAT-Receiver = Bit 1 (2)
# Aquarium Leuchtstoffröhre = Bit 2 (4)
# Aquarium Nachtbeleuchtung = Bit 3 (8)
# = Bit 4 (16)
# = Bit 5 (32)
# = Bit 6 (64)
# = Bit 7 (128)
#
00 07 * * * /home/mega-hz/relays/setport 7
00 08 * * * /home/mega-hz/relays/setport 6
00 17 * * * /home/mega-hz/relays/setport 3
00 20 * * * /home/mega-hz/relays/setport 11
00 00 * * 1-5 /home/mega-hz/relays/setport 9 (von Mo-Fr ist ab 00:00 Uhr der SAT-Receiver von der Schüssel getrennt ;-) )

#0-59/2 * * * * /home/mega-hz/relays/setport 83 (war nur zum testen)
#1-58/2 * * * * /home/mega-hz/relays/setport 255(minütliches umschalten)


Vielen Dank für die sehr hilfreiche Unterstützung CAS!!!

Hier noch ein Bild, auf dem man die USV,den neuen (P4-2Ghz) Server, die 2 500GB USB Platten (blaue LEDs) und die Relaykarte (rote LEDs) sehen kann:

Bild

Gruß,
Wolfram.