All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chuck Messenger <chuckm@rochester.rr.com>
To: linux-serial@vger.kernel.org
Subject: Re: Trouble reading from my serial device (a microcontroller)
Date: Thu, 20 Nov 2003 16:07:25 -0500	[thread overview]
Message-ID: <bpj9qo$m2l$1@sea.gmane.org> (raw)
In-Reply-To: <bpj3mo$6th$1@sea.gmane.org>

OK, I figured it out.  Yeah, I'm having a conversation with myself.  But 
maybe it'll help someone else with the same problem who finds this 
message on a search.

The answer turned out to be: set DCD high.  DCD is pin 1 on a 9-pin 
serial connector.   That was all there was to it.  The program I 
included below works fine.  But if DCD isn't high (in my case, it wasn't 
connected), then read() will hang indefinitely.

I had read here and there that open() would hang if DCD wasn't high, 
depending on the flags (that is, unless O_NONBLOCKING was used). 
However, I found that open() didn't hang.

To recap:  If you're trying to connect to a simple serial device, and 
all you connect is Tx, Rx and ground, then you may find (as I did) that 
read() will hang.  You also must connect DCD (pin 1) to +12 V (I put it 
through a 2.2k resistor, just in case...).

     - Happy Chuck

Chuck Messenger wrote:
> I'm unable to read from a serial device under Linux (Mandrake 9.1, 
> 2.4.21-0.13mdk kernel), but the device works find in Windows.  I'm 
> hoping someone can offer me suggestions.
> 
> My device is a Basic Stamp microcontroller, which I've programmed to 
> spit out a certain byte continuously -- 0x40 -- at 38400 baud,n,8,1. The 
> device loops RTS back to DSR (i.e. it connects pins 6 and 7 of the 9-pin 
> serial connector -- DSR and RTS).  Other than that, only Rx and Tx are 
> connected (and ground, of course).
> 
> I know the hardware works (both controller and PC), because I can boot 
> Win2k on the same machine and run a short program I wrote which 
> continuously dumps to the console whatever comes in.
> 
> Also, I know that things are _basically_ configured right, in my Linux 
> boot, since I can run "statserial /dev/tts/0", which shows, in real 
> time, the status of the DSR line.  When I unplug from my device, DSR 
> goes low; when I plug it back in, DSR goes high.
> 
> I tried writing a simple port-dumping program on Linux, based on Peter 
> Baumann's sample in his Serial Programming Howto:
> 
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> #include <termios.h>
> #include <stdio.h>
> 
> #define BAUDRATE B38400
> #define MODEMDEVICE "/dev/tts/0"
> #define _POSIX_SOURCE 1 /* POSIX compliant source */
> 
> int
> main()
> {
>     int fd,c, res;
>     struct termios oldtio,newtio;
> 
>     fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
> 
>     if (fd < 0) {
>         perror(MODEMDEVICE);
>         exit(-1);
>     }
> 
>     tcgetattr(fd, &oldtio); /* save current port settings */
> 
>     memset(&newtio, 0, sizeof(newtio));
> 
>     newtio.c_cflag = BAUDRATE | /*CRTSCTS |*/ CS8 | CLOCAL | CREAD;
>     newtio.c_iflag = IGNPAR   // ignore parity errors
>                    | IGNBRK;  // ignore BREAK characters
>     newtio.c_oflag = 0;
> 
>     /* set input mode (non-canonical, no echo,...) */
> 
>     newtio.c_lflag = 0;
> 
>     newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */
>     newtio.c_cc[VMIN]     = 1;   /* blocking read until 1 chars received */
> 
>     tcflush(fd, TCIFLUSH);       // Flush an data received by not read
>     tcsetattr(fd,TCSANOW,&newtio);
> 
>     while (1) {       /* loop for input */
>         char buf[1];
>         res = read(fd,buf,1);   /* returns after 1 chars have been input */
>         printf("%02x ", buf[0]);
>         fflush(stdout);
>     }
> 
>     tcsetattr(fd,TCSANOW,&oldtio);
> 
>     return 0;
> }
> 
> 
> However, the program fails to read any bytes -- it hangs at the read().
> 
> I've tried running serlook, but that, too, failed to see any bytes.
> 
> Any suggestions?
> 
> I've tried 9600 baud instead of 38400 -- still no luck (although it 
> works under Win2k).
> 
> Poking around, I've seen mention of the DCD control line -- could that 
> be the problem (i.e. does the Linux serial driver require it, somehow? I 
> don't have it hooked up.)
> 
> 
>     - Chuck Messenger
> 
> 
> -
> To unsubscribe from this list: send the line "unsubscribe linux-serial" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 



  reply	other threads:[~2003-11-20 20:56 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-11-20 19:22 Trouble reading from my serial device (a microcontroller) Chuck Messenger
2003-11-20 21:07 ` Chuck Messenger [this message]
  -- strict thread matches above, loose matches on Subject: below --
2003-11-20 20:42 Ed Vance

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='bpj9qo$m2l$1@sea.gmane.org' \
    --to=chuckm@rochester.rr.com \
    --cc=linux-serial@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.