Wie steuert man eine LED über die ser. Schnittstelle?

blacklight

New Member
Hallo,

ich suche Jemanden/eine Seite, der erklärt/wo für einen C/C++ und *BSD Neuling erklärt wird, wie man mit FreeBSD eine LED steuern kann (mittels RTS, DTR oder TxD Leitung).

"Leidensweg":

Ich wollte meinem FreeBSD (5.1) Router vieleicht mal ein Display (HD44780) verpassen, konnte mich aber noch nicht entscheiden, ob ich eins aus Gold/Platin will oder doch eher das diamantenbesetzte Display ;).

Wollte also erstmal aus Zeit/Kostengründen eine/zwei LED's an der seriellen Schnittstelle ansprechen, vor Monaten mal auf einer HP recht einfach dargestellt gefunden.

Gesagt getan, 2 LED's mit einem Vorwiderstand an Masse(Pin5) und RTS (Pin7) gelötet (so dass bei -12V die eine, bei +12V die andere LED leuchtet).

Für Windows nach eingen Minuten bis Stunden endlich mal was zum testen gefunden, nicht zu glauben, aber auf
http://www.faustweb.de/download/download_soft.htm ein Excel-VBA-Makro gefunden, das sogar ohne größere Probleme die RTS-Leitung ansprach und jeweils rotes/grünes Licht erzeugt wurde.

Weil das unter Windows mit einem fertigen Tool nicht mein Ziel war, versuchete ich danach es auf einer FreeBSD 5.1 Maschine.
Da ich im Prinzip kein C/C++ programieren kann, konnte ich die wenigen gefundenen Beispiele für *BSD oder Linux nicht umsetzen.
Nach weiterem gezieltem suchen fand ich die Seite
http://www.franksteinberg.de/progss.htm
wieder (siehe oben) . Ich finde, sie geht recht gut auf die "Low-Level" benutzung der seriellen Schnittstelle ein, erfreulicherweise per ASM, C ,Pascal und Basic.
Leider setzt die Seite die Beispiele aber nur für MS-DOS um (und mal für Linux).

irgendwann bin ich auf outportb() gestoßen, ist aber soweit ich erfahren hab nicht unter FreeBSD einsetzbar, aber outb() soll das gleiche machen und unter FreeBSD geben. Aber wie gesagt, ich nix kann C (nur etwas Javaspielerei).

Durch zufall/Try'n'Error kam ich drauf, dass man per
# echo "blabla" > /dev/cuaa0 (als root)
einmal nach dem booten die leuchtende LED wechseln, d.h. die Spannung umdrehen. Das ist aber irgendwie unpraktisch, weil es erst nach einem Reboot wieder funktioniert.


ich hoffe also, dass ich mich nur sehr dumm angestellt hab, und es eine recht einfache Lösung gibt, oder aber, dass jemand einen Quelltex hat, der unter FreeBSD das macht.

schon mal thx im Vorraus
 
so, auf einem anderen Board wurde mir auf den Ansatz
#include <stdio.h>
int main() {
int a=0x1; // irgendwas
FILE *fd = fopen("/dev/cuaa0","wb");
putc(a,fd); // irgendwas schreiben
fclose(fd);
return(0); }

zu folgendem geraten:

#include <sys/ttycom.h>
ioctl(fd, TIOCSDTR); // DTR setzen
ioctl(fd, TIOCCDTR); // DTR zurücksetzen

ist zwar nicht RTS, aber es geht.
 
Zum ansprechen von seriellen Dingen verwende ich ganz gerne perl mit Device::SerialPort, ich glaube aber nicht das du das in den Ports findes du musst es dir also direkt von www.cpan.org herunterladen.
Gute Beispiele wie man's verwendet findest du mit "perldoc Device::SerialPort"

Hier ein sub das via isdn-serial karte mit einer Hicom Anlage spricht

sub dialnumber
{
my($SOURCE, $DEST, $DEVICE)=@_;
my $ob = Device::SerialPort->new ($DEVICE, "", '/var/spool/lock/LCK..cuaa2') ||
die "Can't open $DEVICE: $!";
$ob->baudrate(38400) || die "fail setting baudrate";
$ob->parity("none") || die "fail setting parity";
$ob->databits(8) || die "fail setting databits";
$ob->stopbits(1) || die "fail setting stopbits";
$ob->handshake("none") || die "fail setting handshake";
$ob->write_settings || die "no settings";
$ob->write("ate1\r");
$ob->write("at&m22\r");
$ob->write("atd7567$SOURCE$DEST\r");
sleep 1;
$ob->close || die "failed to close";
undef $ob;
}
 
Zurück
Oben