Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Jun 2006 12:19:41 -0600
From:      "Andrew Falanga" <af300wsm@gmail.com>
To:        "Derek Ragona" <derek@computinginnovations.com>,  freebsd-questions@freebsd.org
Subject:   Re: Serial programming on FreeBSD 6.0 RELEASE
Message-ID:  <340a29540606221119o16cab29ak5ae46156a3feca09@mail.gmail.com>
In-Reply-To: <6.0.0.22.2.20060622115945.02533de8@mail.computinginnovations.com>
References:  <340a29540606220828i500905afq6d1ff81cf095cf88@mail.gmail.com> <6.0.0.22.2.20060622115945.02533de8@mail.computinginnovations.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Derek,

No I didn't disable the getty on the port.  To be honest, I didn't know one
was running.

Second, the errors I'm receiving are:

sio1: 2 more silo overflows (total 9)
sio1: 280221 more tty-level buffer overflows (total 576898)


One question I have is, why would kermit able to receive/send data across
the port?  I don't know if said this in my first message, but I started
kermit on both the FreeBSD and Linux machines and was able to send/receive
data in either direction.  I didn't disable getty before doing that.

Second question is, does my code look ok?  Am I initializing everythin
accordingly?

Andy

On 6/22/06, Derek Ragona <derek@computinginnovations.com> wrote:
>
>  Andy,
>
> Did you kill the getty running on the port?
>
> Are you getting any errors?
>
>         -Derek
>
>
> At 10:28 AM 6/22/2006, Andrew Falanga wrote:
>
> Hello,
>
> I've got a case where I'm writing a simply serial program to send bytes
> from
> one system to another over a serial cable.  The program works in Linux,
> but
> when I use it in FreeBSD nothing happens.  The program starts and, in the
> case of receiving, waits for data to appear on the /dev/cuad1 port and
> times
> out in select.  If I'm sending in FreeBSD, the send program believes it
> has
> written all the data but nothing is received in Linux (either with running
> my code on Linux or using kermit).  On FreeBSD, however, if I use kermit
> to
> monitor the /dev/cuad1 port and send, using my code, from Linux, all 2500
> packets are transmitted ok.  Also, when sending from Linux and receiving
> in
> FreeBSD, the FreeBSD machine show silo and tty-level interrupt errors.
> The
> man page for sio describes that as problems in the interrupt handler, for
> silo overflows, and that data arrived faster than the application could
> process (for the tty-level overflows).
>
> What am I doing wrong?  What is it that Kermit does to allow data being
> read
> from the /dev/cuad1 device that I'm not?  I've been looking over the
> kermit
> sources but to be honest, before Thursday of last week, I'd never
> programmed
> for serial ports before let alone having any knowledge of termios.
> Therefore, I'm looking at a very steep learning curve.  Please look over
> my
> ctor for the serial line class that is in my code.  After much debugging,
> I'm convinced that my problem is in how I'm configuring my port.
>
> sline::sline( std::string d, int opm ) : dev( d ), opMode( opm )
> {
>   memset( &oldSettings, 0, sizeof( oldSettings ) );
>   memset( &ioPort, 0, sizeof( ioPort ) );
>   memset( recvBuf, 0, PACKETSIZE );
>   memset( &timeout, 0, sizeof( timeout ) );
>
>   FD_ZERO( &incoming );
>
>   timeout.tv_sec = TIMEOUT_SEC;
>   timeout.tv_usec = TIMEOUT_USEC;
>
>   // create the packet
>   char asciiPrtChars = 32; // first printable ascii character in decimal
>   for( int i = 0; i < PACKETSIZE; i++ ) {
>      packet[i] = asciiPrtChars++;
>      if( asciiPrtChars == 127 ) // 127 is the delete character
>         asciiPrtChars = 32;
>   }
>
>   // on the systems this code was meant to compile, LINUX and FreeBSD
>   // O_NDELAY and O_NONBLOCK are the same, however, this is not always
>   // true
>   fd = open( dev.c_str(), O_RDWR | O_NOCTTY | O_NDELAY );
>   if( fd < 0 )
>      throw init();
>
>   tcgetattr( fd, &oldSettings );
>   tcgetattr( fd, &ioPort );
>
> #ifdef DEBUG
>   COUT << "Current input speed is " << cfgetispeed( &ioPort ) << ENDL;
>   COUT << "Current output speed is " << cfgetospeed( &ioPort ) << ENDL;
> #endif
>
> #if 0
>   if( opMode == OPMODE_WRITE ) {
>      if( fcntl( fd, F_SETFL, 0 ) < 0 ) {
>         perror( "fcntl" );
>         throw init();
>      }
>   } else {
>      if( fcntl( fd, F_SETFL, FNDELAY ) < 0 ) {
>         perror( "fcntl" );
>         throw init();
>      }
>      FD_SET( fd, &incoming );
>   }
> #endif
>
> #if 0
>   // configure control field, this should configure for 8N1
>   // first, disable flow control (may have to put it back in)
>   // ioPort.c_cflag &= ~CRTSCTS;
>   ioPort.c_cflag |= CRTSCTS | CLOCAL | CREAD;
>   ioPort.c_cflag &= ~PARENB;
>   ioPort.c_cflag &= ~CSTOPB;
>   ioPort.c_cflag &= ~CSIZE;
>   ioPort.c_cflag |= CS8;
>
>   // configure local field, setting to RAW mode
>   ioPort.c_lflag |= ~( ICANON | ECHO | ECHOE | ISIG );
>
>   // configure the input field, setting to ignore parity errors
>   // and disable software flow control
>   ioPort.c_iflag |= IGNPAR;
>   ioPort.c_iflag &= ~( IXON | IXOFF | IXANY );
>
>   // configure output field, setting to RAW
>   ioPort.c_iflag &= ~OPOST;
> #endif /* end of if 0 */
>
>   // configure for raw data transfer
>   cfmakeraw( &ioPort );
>
>   // set VMIN and VTIME parameters in c_cc array
>   ioPort.c_cc[VMIN] = PACKETSIZE;
>   ioPort.c_cc[VTIME] = 0;
>
>   if( cfsetispeed( &ioPort, BAUDRATE ) < 0 ) {
>      perror( "cfsetispeed" );
>      throw init();
>   }
>
>   if( cfsetospeed( &ioPort, BAUDRATE ) < 0 ) {
>      perror( "cfsetospeed" );
>      throw init();
>   }
>
>   COUT << "flushing dev: " << dev << ENDL;
>   if( tcflush( fd, TCIOFLUSH ) < 0 ) {
>      perror( "tcflush" );
>      throw init();
>   }
>
>   COUT << "Setting new parameters to: " << dev << ENDL;
>   if( tcsetattr( fd, TCSANOW, &ioPort ) < 0 ) {
>      perror( "tcsetattr" );
>      throw init();
>   }
>
> #if 0
>   if( ioctl( fd, TIOCMGET, &portStatus ) < 0 ) {
>      perror( "ioctl - get" );
>      throw init();
>   }
>
>   // I believe we want to clearn the DCD bit
>   portStatus &= ~TIOCM_DTR;
>
>   if( ioctl( fd, TIOCMSET, &portStatus ) < 0 ) {
>      perror( "ioctl - set" );
>      throw init();
>   }
> #endif /* removed for debugging, still not sure I need it */
>
>   if( fcntl( fd, F_SETFL, FNDELAY | O_NONBLOCK ) < 0 ) {
>      perror( "fcntl" );
>      throw init();
>   }
>
> #ifdef DEBUG
>   COUT << "New input speed is " << cfgetispeed( &ioPort ) << ENDL;
>   COUT << "New output speed is " << cfgetospeed( &ioPort ) << ENDL;
> #endif
> } // end of sline ctor
>
> Thanks for you help,
> Andy
> _______________________________________________
> freebsd-questions@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-questions
> To unsubscribe, send any mail to "
> freebsd-questions-unsubscribe@freebsd.org"
>
> --
> This message has been scanned for viruses and
> dangerous content by MailScanner, and is
> believed to be clean.
> MailScanner thanks transtec Computers for their support.
>
>
> --
> This message has been scanned for viruses and
> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and is
> believed to be clean.
> MailScanner thanks transtec Computers <http://www.transtec.co.uk/>; for
> their support.
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?340a29540606221119o16cab29ak5ae46156a3feca09>