Serial Port Bit setzten

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
kaiand1
Beiträge: 29
Registriert: 11.03.2008 19:59:33

Serial Port Bit setzten

Beitrag von kaiand1 » 08.09.2010 23:44:16

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

ruhrmensch
Beiträge: 12
Registriert: 04.02.2006 01:57:03

Re: Serial Port Bit setzten

Beitrag von ruhrmensch » 09.09.2010 00:06:20

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

Benutzeravatar
schorsch_76
Beiträge: 2630
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Serial Port Bit setzten

Beitrag von schorsch_76 » 09.09.2010 08:42:27

In C/C++ kannst du mit

Code: Alles auswählen

fd = open("/dev/ttyS0", O_RDWR);
die serielle Schnittstelle öffnen und mit

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);
}
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

kaiand1
Beiträge: 29
Registriert: 11.03.2008 19:59:33

Re: Serial Port Bit setzten

Beitrag von kaiand1 » 09.09.2010 13:46:27

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.

Benutzeravatar
schorsch_76
Beiträge: 2630
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Serial Port Bit setzten

Beitrag von schorsch_76 » 09.09.2010 14:33:25

Um das Ding zu übersetzen, musst du das etwa so aufbauen

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);
}
Hab grad keine Linuxkiste da, ist aus meinen Quellen + Anpassungen ;)

Zum übersetzen sollte der Befehl

Code: Alles auswählen

gcc main.c -o set-dsr-dts
reichen...

Kann ich heut abend gern zuhause ausprobieren ;)

Gruß

schorsch

kaiand1
Beiträge: 29
Registriert: 11.03.2008 19:59:33

Re: Serial Port Bit setzten

Beitrag von kaiand1 » 09.09.2010 15:11:32

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 :/

Benutzeravatar
schorsch_76
Beiträge: 2630
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Serial Port Bit setzten

Beitrag von schorsch_76 » 09.09.2010 16:36:44

Ok, das ist das Problem mit ungetestetem Code ;)

Hier der Code der Kompiliert und die Ausgänge setzt ;)

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;
}
Übersetzen mit

Code: Alles auswählen

gcc main.cpp -o tst -lstdc++
Das Programm setzt CTS/DSR wenn du dann eine Taste drückst, beendet sich das Program ;)

Evtl. Must du für dich noch den /dev/ttyS0 anpassen oder configurierbar machen...
Fehlerhandling st da auch nicht drin, etc pp ;)

Gruß

schorsch

Antworten