Serial Port Bit setzten
Serial Port Bit setzten
Moin
Nach langen erfolglosen Suchen probier ich mein Glück mal hier...
Ich hab am System ein Serial Port frei den ich für meine Schaltung nutzten möchte.
Daher suche ich ein Program bzw ne möglichkeit wie ich ein Bit am Port setzten/löschen kann sowie ein anderes auszulesen.
Die Serielle Schnittstelle besitzt ja 3 Ausgangspins (TX,RTS,DTR) und 5 Eingangspins (RX,DCD,DSR,CTS,RI).
Davon brauch ich jeweils nur 1 Eingang und 1 Ausgang und find so keine Lösung zum setzten.
stty brachte nix
setserial wurde ja durch stty abgelöst.....
Für die Console find ich so nix womit es geht....
Hab auch paar C Scripte gefunden aber die gingen bei mir gar nicht :/
Das System ist 2.6.32-5-kirkwood
Danke schonmal
Nach langen erfolglosen Suchen probier ich mein Glück mal hier...
Ich hab am System ein Serial Port frei den ich für meine Schaltung nutzten möchte.
Daher suche ich ein Program bzw ne möglichkeit wie ich ein Bit am Port setzten/löschen kann sowie ein anderes auszulesen.
Die Serielle Schnittstelle besitzt ja 3 Ausgangspins (TX,RTS,DTR) und 5 Eingangspins (RX,DCD,DSR,CTS,RI).
Davon brauch ich jeweils nur 1 Eingang und 1 Ausgang und find so keine Lösung zum setzten.
stty brachte nix
setserial wurde ja durch stty abgelöst.....
Für die Console find ich so nix womit es geht....
Hab auch paar C Scripte gefunden aber die gingen bei mir gar nicht :/
Das System ist 2.6.32-5-kirkwood
Danke schonmal
-
- Beiträge: 12
- Registriert: 04.02.2006 01:57:03
Re: Serial Port Bit setzten
Hi kaiand1,
keine Ahnung ob dir das weiterhilft, aber mit Python, das du sicher sowieso an Bord hast,
geht das so:
#!/usr/bin/python
import serial, os
ser=serial.Serial('/dev/ttyUSB0')
ser.setDTR(0)
ser.setRTS(0)
Das ist der Ausschnitt eines Scripts, das ich mal benutzt habe, allerdings mit USB<>RS232 Konverter.
Und, ja, es werden nur Ausgänge bedient, aber ich glaube, Eingänge sollten auch laufen.
Einfach mal nach pyserial suchen.
ruhrmensch
keine Ahnung ob dir das weiterhilft, aber mit Python, das du sicher sowieso an Bord hast,
geht das so:
#!/usr/bin/python
import serial, os
ser=serial.Serial('/dev/ttyUSB0')
ser.setDTR(0)
ser.setRTS(0)
Das ist der Ausschnitt eines Scripts, das ich mal benutzt habe, allerdings mit USB<>RS232 Konverter.
Und, ja, es werden nur Ausgänge bedient, aber ich glaube, Eingänge sollten auch laufen.
Einfach mal nach pyserial suchen.
ruhrmensch
- schorsch_76
- Beiträge: 2630
- Registriert: 06.11.2007 16:00:42
- Lizenz eigener Beiträge: MIT Lizenz
Re: Serial Port Bit setzten
In C/C++ kannst du mit
die serielle Schnittstelle öffnen und mit
Siehe dazu [1]
DSR/CTS beliebig setzen. Ich habe das dazu benutzt um über DSR/CTS einen I2C Bus zu betreiben (inkl. MAX232 Chip als Pegelumsetzer).
Gruß
schorsch
[1] http://linux.die.net/man/4/tty_ioctl
Code: Alles auswählen
fd = open("/dev/ttyS0", O_RDWR);
Code: Alles auswählen
int fd;
int serial;
void SetDSR(bool status)
{
ioctl(fd, TIOCMGET, &serial);
if (status)
serial|= TIOCM_DSR;
else
serial&= ~TIOCM_DSR;
ioctl(fd,TIOCMSETserial);
}
void SetCTS(bool status)
{
ioctl(fd, TIOCMGET, &serial);
if (status)
serial |= TIOCM_CTS;
else
serial &= ~TIOCM_CTS;
ioctl(fd,TIOCMSET,serial);
}
DSR/CTS beliebig setzen. Ich habe das dazu benutzt um über DSR/CTS einen I2C Bus zu betreiben (inkl. MAX232 Chip als Pegelumsetzer).
Gruß
schorsch
[1] http://linux.die.net/man/4/tty_ioctl
Re: Serial Port Bit setzten
Also mit pyserial hab ich da mal die beiden Beispiele von der Seite genommen
test_high_load.py und test_readline.py
da bekomm ich
Testing port: '/dev/ttyS0'
Send big strings, write/read order. ... ERROR
Send big strings, multiple write one read. ... ERROR
sowie
Testing port: '/dev/ttyS0'
Test readline with alternative eol settings (skipped for io based systems) ... ERROR
Test for line in s ... ERROR
Test readline method ... ERROR
Test readlines method ... ERROR
Test xreadlines method (skipped for io based systems) ... ERROR
Beim C Script
./s.c: line 7: syntax error near unexpected token `('
./s.c: line 7: ` fd = open("/dev/ttyS0", "O_RDONLY");'
Laut lpinfo -v ist mein Serialport aber vorhanden.
Die Sachen habe ich mit root probiert.
test_high_load.py und test_readline.py
da bekomm ich
Testing port: '/dev/ttyS0'
Send big strings, write/read order. ... ERROR
Send big strings, multiple write one read. ... ERROR
sowie
Testing port: '/dev/ttyS0'
Test readline with alternative eol settings (skipped for io based systems) ... ERROR
Test for line in s ... ERROR
Test readline method ... ERROR
Test readlines method ... ERROR
Test xreadlines method (skipped for io based systems) ... ERROR
Beim C Script
./s.c: line 7: syntax error near unexpected token `('
./s.c: line 7: ` fd = open("/dev/ttyS0", "O_RDONLY");'
Laut lpinfo -v ist mein Serialport aber vorhanden.
Die Sachen habe ich mit root probiert.
- schorsch_76
- Beiträge: 2630
- Registriert: 06.11.2007 16:00:42
- Lizenz eigener Beiträge: MIT Lizenz
Re: Serial Port Bit setzten
Um das Ding zu übersetzen, musst du das etwa so aufbauen
Hab grad keine Linuxkiste da, ist aus meinen Quellen + Anpassungen ![Wink ;)](./images/smilies/icon_wink.gif)
Zum übersetzen sollte der Befehl reichen...
Kann ich heut abend gern zuhause ausprobieren![Wink ;)](./images/smilies/icon_wink.gif)
Gruß
schorsch
Code: Alles auswählen
#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>
int fd;
int serial;
void SetDSR(bool status)
{
ioctl(fd, TIOCMGET, &serial);
if (status)
serial|= TIOCM_DSR;
else
serial&= ~TIOCM_DSR;
ioctl(fd,TIOCMSETserial);
}
void SetCTS(bool status)
{
ioctl(fd, TIOCMGET, &serial);
if (status)
serial |= TIOCM_CTS;
else
serial &= ~TIOCM_CTS;
ioctl(fd,TIOCMSET,serial);
}
void main(int argc, char* argv)
{
fd = open("/dev/ttyS0", O_RDWR);
SetDSR(true);
SetDSR(true);
getch(); // wait
close(fd);
}
![Wink ;)](./images/smilies/icon_wink.gif)
Zum übersetzen sollte der Befehl
Code: Alles auswählen
gcc main.c -o set-dsr-dts
Kann ich heut abend gern zuhause ausprobieren
![Wink ;)](./images/smilies/icon_wink.gif)
Gruß
schorsch
Re: Serial Port Bit setzten
Nach deinem Script bekomme ich da
main.c:8: error: expected ')' before 'status'
main.c:19: error: expected ')' before 'status'
main.c: In function 'main':
main.c:33: error: 'true' undeclared (first use in this function)
main.c:33: error: (Each undeclared identifier is reported only once
main.c:33: error: for each function it appears in.)
Ich hab noch ein USB 2 Parallel Adapter gefunden ein Dlock USB910 aber den erkennt der irgendwie nicht :/
main.c:8: error: expected ')' before 'status'
main.c:19: error: expected ')' before 'status'
main.c: In function 'main':
main.c:33: error: 'true' undeclared (first use in this function)
main.c:33: error: (Each undeclared identifier is reported only once
main.c:33: error: for each function it appears in.)
Ich hab noch ein USB 2 Parallel Adapter gefunden ein Dlock USB910 aber den erkennt der irgendwie nicht :/
- schorsch_76
- Beiträge: 2630
- Registriert: 06.11.2007 16:00:42
- Lizenz eigener Beiträge: MIT Lizenz
Re: Serial Port Bit setzten
Ok, das ist das Problem mit ungetestetem Code ![Wink ;)](./images/smilies/icon_wink.gif)
Hier der Code der Kompiliert und die Ausgänge setzt
Übersetzen mit
Das Programm setzt CTS/DSR wenn du dann eine Taste drückst, beendet sich das Program ![Wink ;)](./images/smilies/icon_wink.gif)
Evtl. Must du für dich noch den /dev/ttyS0 anpassen oder configurierbar machen...
Fehlerhandling st da auch nicht drin, etc pp![Wink ;)](./images/smilies/icon_wink.gif)
Gruß
schorsch
![Wink ;)](./images/smilies/icon_wink.gif)
Hier der Code der Kompiliert und die Ausgänge setzt
![Wink ;)](./images/smilies/icon_wink.gif)
Code: Alles auswählen
#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <iostream>
#include <cstdio>
int fd;
int serial;
void SetDSR(bool status)
{
ioctl(fd, TIOCMGET, &serial);
if (status)
serial|= TIOCM_DSR;
else
serial&= ~TIOCM_DSR;
ioctl(fd,TIOCMSET,serial);
}
void SetCTS(bool status)
{
ioctl(fd, TIOCMGET, &serial);
if (status)
serial |= TIOCM_CTS;
else
serial &= ~TIOCM_CTS;
ioctl(fd,TIOCMSET,serial);
}
int main(int argc, char** argv)
{
fd = open("/dev/ttyS0", O_RDWR);
SetDSR(true);
SetDSR(true);
// wait
std::cout << "Bitte Taste drücken zum beenden" << std::endl;
getchar();
close(fd);
return 0;
}
Code: Alles auswählen
gcc main.cpp -o tst -lstdc++
![Wink ;)](./images/smilies/icon_wink.gif)
Evtl. Must du für dich noch den /dev/ttyS0 anpassen oder configurierbar machen...
Fehlerhandling st da auch nicht drin, etc pp
![Wink ;)](./images/smilies/icon_wink.gif)
Gruß
schorsch