Archiv verlassen und diese Seite im Standarddesign anzeigen : mehrere ttyS hoeren gleichzeitig
hi leute,
ich hab das problem, dass ich zwei forks mit der gleichen funktion starte, die auf die ttyS hoert, und sobald etwas ankommt, schreibt die func auf das andere ttyS (und gibt es auf die console aus). icanon, echo, und echoe sind ausgeschaltet. wenn jetzt was auf das ttyS0 kommt, sollte die die func auf ttyS1 schreiben, tut sie aber nicht! haengt das vielleicht daran, das ttyS1 noch immer hoert? ich es nicht moeglich, gleichzeitig ueber ein ttyS (UART16550A) zu lesen und zu schreiben?
tut mir leid, ich habe auf diesem computer kein source-file, kommt aber noch!
danke fuer hilfe,
hnzi
anda_skoa
02-10-2002, 16:10
Hmm, ich glaube UARTS sind bidirektional.
Du hast zwei Prozesse, die die TTYs lesen/schreiben?
Vielleicht geht es mit einem Prozess.
Mit select auf den beiden TTYs warten und bei bedarf lesen und auf das andere schreiben.
Ciao,
_
Original geschrieben von hnzi
hi leute,
ich hab das problem, dass ich zwei forks mit der gleichen funktion starte, die auf die ttyS hoert, und sobald etwas ankommt, schreibt die func auf das andere ttyS (und gibt es auf die console aus). icanon, echo, und echoe sind ausgeschaltet. wenn jetzt was auf das ttyS0 kommt, sollte die die func auf ttyS1 schreiben, tut sie aber nicht! haengt das vielleicht daran, das ttyS1 noch immer hoert? ich es nicht moeglich, gleichzeitig ueber ein ttyS (UART16550A) zu lesen und zu schreiben?
tut mir leid, ich habe auf diesem computer kein source-file, kommt aber noch!
danke fuer hilfe,
hnzi
wie übergibst du denn dem ttyS1-Prozeß die Daten? Da du ja per fork 2 Prozesse erzeugst, haben diese einen unterschiedlichen Arbeitsspeicherbereich - vielleicht kommen deshalb die Daten von S0 niemals beim S1-Prozeß an?!
Cooler wäre es sowieso, wenn du - wie von anda_skoa vorgeschlagen - nonblocking-Funktionen verwendest und das ganze in einem Prozeß laufen ließest!
hi leute,
hier die source (ich weiss hat ein bisschen gedauert):
/************************************************** ******************/
/* */
/* ttySniffer - ein Programm zum Ueberwachen des ttyS-Ports */
/* */
/* Autor: Hans S. Werner steht natuerlich unter GPL */
/* */
/************************************************** ******************/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <unistd.h>
#include <termios.h>
#include <time.h>
#include <fcntl.h>
#include <signal.h>
#include "common.h"
extern int errno;
extern int kill( pid_t, int );
/************************************************** *******************************/
int popup( void )
{
fprintf( stdout, " _ _ __ __ / ___|\n" );
fprintf( stdout, " _| |_ _| |_ \\ \\ / / | \n" );
fprintf( stdout, "|_ _||_ _| \\ \\/ / \\__\\\n" );
fprintf( stdout, " | | | | \\ / \\ \\ \n" );
fprintf( stdout, " | | | | | | __/ |\n" );
fprintf( stdout, " |_| |_| |_| |___/\n" );
sleep( 2 );
return EXIT_SUCCESS;
}
/************************************************** *******************************/
int monitor_ttyS( int readfd, int writefd, char dev )
{
time_t daytime;
char sign = 0;
char * buffer = NULL;
buffer = ( char * )malloc( sizeof( char ) * 1024 );
if( !buffer )
{
fprintf( stderr, "monitor_ttyS::malloc() %d: allocation failed!\n", __LINE__ );
return EXIT_FAILURE;
}
if( time( &daytime ) == ((time_t)-1) )
{
fprintf( stderr, "monitor_ttyS::time() %d: ", __LINE__ );
perror( "" );
return EXIT_FAILURE;
}
/* fprintf( stdout, "Zeit: %s\n", ctime( &daytime ) ); */
while( 1 )
{
if( read( readfd, &sign, 1 ) == -1 ) /* Wartet auf Daten, wenn ~O_NONBLOCK */
{
fprintf( stderr, "monitor_ttyS::read() %d: ", __LINE__ );
perror( "" );
exit( EXIT_FAILURE );
}
display( sign, dev ); /* definiert in common.c */
if( write( writefd, &sign, 1 ) == -1 ) /* Leitet auf die andere Schnittstelle */
{
fprintf( stderr, "monitor_ttyS::write() %d: ", __LINE__ );
perror( "" );
exit( EXIT_FAILURE );
}
}
free( buffer );
return EXIT_SUCCESS;
}
/************************************************** *******************************/
int set_ttyS( char * device )
{
int fd = -1;
struct termios attributs;
if( ( fd = open( device, O_RDWR | O_NOCTTY ) ) == -1 )
{
fprintf( stderr, "set_ttyS::open() %d: ", __LINE__ );
perror( "" );
return EXIT_FAILURE;
}
if( tcgetattr( fd, &attributs ) )
{
fprintf( stderr, "set_ttyS::tcgetattr() %d: ", __LINE__ );
perror( "" );
return EXIT_FAILURE;
}
return fd;
}
/************************************************** *******************************/
int main( int argc, char * argv[] )
{
int fd_a = -1;
int fd_b = -1;
pid_t fork_id = -1;
pid_t child_id = -1;
char control = -1;
/* if( popup() == EXIT_FAILURE )
{
fprintf( stderr, "main::popup() failed!\ncontinue...\n" );
} */
if( ( fd_a = set_ttyS( PORTA ) ) == EXIT_FAILURE )
{
fprintf( stderr, "main::set_ttyS() failed!\nexit...\n" );
exit( EXIT_FAILURE );
}
if( ( fd_b = set_ttyS( PORTB ) ) == EXIT_FAILURE )
{
fprintf( stderr, "main::set_ttyS() failed!\nexit...\n" );
exit( EXIT_FAILURE );
}
fork_id = fork();
switch( fork_id )
{
case 0: /* child */
child_id = fork();
switch( child_id )
{
case 0: /* child2 (child) */
if( monitor_ttyS( fd_b, fd_a, 1 ) == EXIT_FAILURE )
{
fprintf( stderr, "main::monitor_ttyS() %d: ", __LINE__ );
perror( "" );
exit( EXIT_FAILURE );
}
break;
case -1: /* error */
fprintf( stderr, "main::fork() %d: ", __LINE__ );
perror( "" );
exit( EXIT_FAILURE );
break;
default: /* child1 (parent) */
if( monitor_ttyS( fd_a, fd_b, 0 ) == EXIT_FAILURE )
{
fprintf( stderr, "main::monitor_ttyS() %d: ", __LINE__ );
perror( "" );
exit( EXIT_FAILURE );
}
wait( NULL );
break;
}
break;
case -1: /* error */
fprintf( stderr, "main::fork() %d: ", __LINE__ );
perror( "" );
exit( EXIT_FAILURE );
break;
default: /* parent */
do
{
scanf( "%c", &control );
}
while( control != 'q' );
if( kill( child_id, SIGTERM ) )
{
fprintf( stderr, "main::kill() %d: ", __LINE__ );
perror( "" );
exit( EXIT_FAILURE );
}
if( kill( fork_id, SIGTERM ) )
{
fprintf( stderr, "main::kill() %d: ", __LINE__ );
perror( "" );
exit( EXIT_FAILURE );
}
break;
}
return EXIT_SUCCESS;
}
ich werds mal mit select versuchen, hab noch keine erfahrung mit select.
hnzi
Edit by anda_skoa: Ich war so frei den Code in code tags zu setzen.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.