C#-Anfänger

06.03.2008, 17:54 |
C# : LPT-Eingänge lesen -> wie? (Elektronik) |
hallo alle zusammen!
dies ist mein erster beitrag.
ich bin in der 10. klasse realschule. als technikprüfung habe ich mir eine alarmanlage ausgesucht.
wir haben zuvor schon ein transistor-interface für den lpt-anschluss gebaut (habe ich schon mehrmals gemacht)welches ich schon um 3 eingänge für die alarmanlage erweitert habe.
zum programmieren benzuten wir c#.
mein programm soll so aussehen:
-warten...
-wenn signaleingang prüfen welcher pin (einfach nur auslesen welchen wert der port hat)
ab hier kein problem mehr!
-je nach wert bestimmte aktion ausführen z.b. ausgabe über interface
............
ich habe schon programmiert:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace ParallelPort2
{
class Program
{
[DllImport("inpout32.dll", EntryPoint = "Out32" ]
public static extern void Output(int adress, int value);
[DllImport("inpout32.dll", EntryPoint = "Inp32" ]
public static extern void Input(int adress, int value);
static void Main(string[] args)
{
.............
ich weiss jetzt nur nicht, wie ich den wert der eingänge auslese.
bitte um hilfe |
Zwinkerle
06.03.2008, 18:43
@ C#-Anfänger
|
C# : LPT-Eingänge lesen -> wie? |
Der nächste....
-- Don't feed Trolls!!! |
Elektronix
06.03.2008, 20:11
@ C#-Anfänger
|
C# : LPT-Eingänge lesen -> wie? |
» namespace ParallelPort2
» {
» class Program
» {
» [DllImport("inpout32.dll", EntryPoint = "Out32" ]
» public static extern void Output(int adress, int value);
» [DllImport("inpout32.dll", EntryPoint = "Inp32" ]
» public static extern void Input(int adress, int value);
»
»
» static void Main(string[] args)
» {
» .............
» ich weiss jetzt nur nicht, wie ich den wert der eingänge auslese.
»
» bitte um hilfe
Steht da nicht was von » public static extern void Input(int adress, int value); -- Und die Grundgebihr is aa scho drin. DOS is jo nett.. |
stefan.pn

06.03.2008, 21:16
@ Elektronix
|
C# : LPT-Eingänge lesen -> wie? |
Hi,
Stichwort pointer.
Du machst einen Pointer vom Typ integer denk ich mal, und setzt die Adresse auf die des Parallelen Ports. Diese ist bei den meisten PCs gleich, und kann dem BIOS entnommen werden.
Wenn du dich in diese Richtung im Internet umsiehst, wirst du sicher fündig.
Viel Spaß noch!
lg
Stefan |
SchwindKreis
07.03.2008, 00:46 (editiert von SchwindKreis am 07.03.2008 um 00:47)
@ stefan.pn
|
C# : LPT-Eingänge lesen -> wie? |
» Stichwort pointer.
»
» Du machst einen Pointer vom Typ integer denk ich mal, und setzt die
» Adresse auf die des Parallelen Ports. Diese ist bei den meisten PCs
» gleich, und kann dem BIOS entnommen werden.
Vermutlich soll das Statusregister (Basisadresse+1) ausgelesen werden, nicht das Datenregister (Basisadresse). Falls nicht, setzt das bestimmte Einstellungen am Parallelport (BIOS) voraus, die längst nicht von jeder Programmierumgebung (und älteren Ports) unterstützt werden. In diesem Fall wäre die Hardware allerdings auch deutlich komplizierter, es ist also unwahrscheinlich. Der Zeiger sollte aber theoretisch auf Typ "Byte" zeigen (unsigned char *zeiger), weil der Parallelport in Bytes "denkt".
Allerdings sollte man tunlichst vermeiden, direkt auf die Hardware zuzugreifen, es sei denn, man programmiert für reines DOS oder einen Kerneltreiber (der sich dann aber auch korrekt im System registrieren muß). Ansonsten sollte man immer Funktionen benutzen, die vom Betriebssystem oder Zusatzbibliotheken systemkonform bereitgestellt werden, weil Fehler mitunter katastrophal sein können (wenn man z.B. versehentlich auf dem Festplattencontroller herumtrampelt).
Da der OP in C# (kenne ich nicht, weil Micro$oft-spezifisch und teils mit Patenten belastet, also für mich unbrauchbar) programmiert, kann ich da nicht viel zu sagen, allerdings schreibt er ja, daß es bereits Ausgaberoutinen für den Parallelport gibt, also gibt es ganz sicher auch entsprechende Eingaberoutinen.
Anscheinend wird eine Bibliothek (inpout32.dll) benutzt, die die Hardware "verbotenerweise" direkt anspricht. Mit:
[DllImport("inpout32.dll", EntryPoint = "Out32"; )]
public static extern void Output(int adress, int value);
[DllImport("inpout32.dll", EntryPoint = "Inp32"; )]
public static extern void Input(int adress, int value);
werden anscheinend zwei Funktionen deklariert und mit der o.g. Bibliothek verlinkt. Die benutzt man dann ganz normal, mit Adresse und Wert als Parameter.
Falls zum Einlesen der Statusport benutzt wird, genügt die Basisadresse+1 als "address", also etwa:
const int basisadresse=0x378;//port Basisaddresse, an verwendeten PC anpassen!
const int statusport=basisadresse+1;//so braucht man bei anderer Basisadresse nur eine Zeile zu ändern
int wert;
Input(statusport,wert);//wert enthält jetzt die Statusbits
Allerdings sieht die Deklaration fehlerhaft aus:
[DllImport("inpout32.dll", EntryPoint = "Inp32"; )]
public static extern void Input(int adress, int value);
Man müßte entweder einen Zeiger oder eine Referenz für den Rückgabeparameter "value" benutzen, es sei denn, C# kennt solche Dinge nicht und jede Variable ist eine Referenz.
Auch sollte der OP nachsehen, ob die Wertparameter (besonders bei "Output" ) tatsächlich vom Typ "int" sind (sollten "byte" oder "unsigned char" sein). Falls ja, und die Ausgaberoutine schreibt auch einen int (normalerweise 4 Bytes), kann das zu Überraschungen führen, weil man beim Parallelport dann alle drei Register (Daten, Status und Steuerung) und eine weitere Speicherstelle unbekannter Funktion beschreibt. Falls die Bibliothek keine byteweise Ausgabe hergibt, hat man ein Problem (wahrscheinlich wird das trotzdem "funktionieren", ist aber trotzdem falsch).
Zum Ausfiltern der relevanten Bits benutzt man logische Operatoren, in diesem Falle "UND" ( & ) statt beim Setzen "ODER" ( | ). (oder wie auch immer die Operatoren in C# heißen mögen):
if(wert&64)//ACK (pin 10) set (= Alarm)
Nervengas_Freisetzen();
else
Kaffee_Kochen();
Hierbei findet dieselbe binäre Bitverschiebung statt wie beim Setzen der Ausgänge: 1,2,4,8,16 usw. für Bits 1,2,3,4,5...
Die Pinbelegung ist:
Bit 8 Pin 11 (invertiert)
Bit 7 Pin 10
Bit 6 Pin 12
Bit 5 Pin 13
Bit 4 Pin 15
Bits 1 bis 3 sind nicht belegt. |
hws

59425 Unna, 07.03.2008, 08:31
@ C#-Anfänger
|
Du wirst nicht direkt auf die Ports zugreifen KÖNNEN .. |
wenn du nicht noch unter Win98 oder älter programmierst. Neuere Betriebssysteme lassen so einen Zugriff (aus Sicherheitsgründen) nicht zu.
Die Tips mit Pointern setzen und selbst direkt zugreifen werden also nix bringen (ausser Fehlermeldung)
Dazu hast du schließlich die DLL, aber solltest mal nachsehen, wie die passend aufgerufen wird.
Diese DLL (gleicher Namen) gibts z.B. auch für Visual Basic. Scheint Lancos wohl in mehrere Sprachen portiert zu haben.
hws |
enton
07.03.2008, 09:41
@ C#-Anfänger
|
C# : LPT-Eingänge lesen -> wie? |
Eventuell ist das Elko nicht der richtige Platz für diese Frage.( Hast ev. schon an den Antworten mit den Zeigern erkannt, die es ja in C# bekanntlich nicht gibt, außer bei ganz wenigen ausnahmen):
Probiers mal hier: http://www.c-sharp-forum.de/
Da hab ich als immer schnelle und gute Antworten bekommen.
Gruß Enton -- Da säuft man den ganzen Tag und wird trotzdem nicht für voll genommen  |
enton
07.03.2008, 09:55
@ hws
|
Du wirst nicht direkt auf die Ports zugreifen KÖNNEN .. |
» Diese DLL (gleicher Namen) gibts z.B. auch für Visual Basic. Scheint
» Lancos wohl in mehrere Sprachen portiert zu haben.
Das ist die gleiche. Das schöne am .Net Framework ist, das es unabhängig von der Sprache ist. Alle Sprachen im .Net Framwork haben 2 Kompiler. Der erste übersetzt es in die Common Intermediate Language. Und der 2. dann in den Maschienenkode. Die Common Intermediate Language ist eine .Net Universalsprache. Egal ob das Programm in Visual C# oder Visual C++ usw. geschrieben wurde, nach dem Kompilieren sind sie alle gleich. So kann man z.B. auch bestehende Projeke in einer anderen Sprache weiterschreiben. -- Da säuft man den ganzen Tag und wird trotzdem nicht für voll genommen  |
hws

59425 Unna, 07.03.2008, 13:03
@ enton
|
Du wirst nicht direkt auf die Ports zugreifen KÖNNEN .. |
Da es unter VB4 und Win98se OHNE .NET läuft, KANN es wohl kein .NET sein.
Das uralte VB4 kannte sowas nämlich noch nicht.
hws |
enton
07.03.2008, 14:58
@ hws
|
Du wirst nicht direkt auf die Ports zugreifen KÖNNEN .. |
» Da es unter VB4 und Win98se OHNE .NET läuft, KANN es wohl kein .NET sein.
»
» Das uralte VB4 kannte sowas nämlich noch nicht.
Was ich damit sagen wollte, ist das die DLL die in dem C# Programm benutzt wurde, nur einmal in VisalBasic5 geschrieben wurde, und jetzt von allen .Net Programmen benutzt werden kann. Also z.B. auch von C#.( Ich hab diese LTP Ansteuerung mit der gleichen DLL auch mal irgendwan ich C# gemacht.) -- Da säuft man den ganzen Tag und wird trotzdem nicht für voll genommen  |