Reading the Serial Port

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Hal Vaughan

    Reading the Serial Port

    I've done a fair amount of Googling for information on reading the serial
    port in C++ (and in Linux). Unfortunately, out of every 4 hits, 1 seems to
    be an unanswered question, 1 is someone saying, "That's easy, there's a lot
    out there, Google it,", 1 is a discussion on it without examples and the
    other is who knows what.

    I did find some info on it and have been experimenting. The one example
    that I liked the best in terms of explanations and readability for a new
    C++ programmer (coming over from Java and Perl) used this to open the
    serial port (yes, with the .h on each include, I know it's older):

    #include <stdio.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <termios.h>
    #include <unistd.h>
    int fd1;
    fd1=open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);

    I understand the serial port will be binary and may be different from other
    files, but I don't understand why this won't work just as well:

    #include <iostream>
    #include <fstream>

    ofstream myfile;
    myfile.open("/dev/ttyS0", ios::out | ios::binary);

    Would that work as well or is there a reason for handling it the first way?
    Basically, after I catch up on everything, one program will be reading the
    serial port and reporting the output and another will be sending data to
    the port. (It's possible, if I can ever find a good thread tutorial for
    C++ that instead of different programs, they'll be different threads.)

    Thanks for any help on the significance and differences of these two
    methods!

    Hal
  • Christopher

    #2
    Re: Reading the Serial Port

    On Mar 11, 12:22 pm, Hal Vaughan <h...@halblog.c omwrote:
    I've done a fair amount of Googling for information on reading the serial
    port in C++ (and in Linux). Unfortunately, out of every 4 hits, 1 seems to
    be an unanswered question, 1 is someone saying, "That's easy, there's a lot
    out there, Google it,", 1 is a discussion on it without examples and the
    other is who knows what.
    >
    I did find some info on it and have been experimenting. The one example
    that I liked the best in terms of explanations and readability for a new
    C++ programmer (coming over from Java and Perl) used this to open the
    serial port (yes, with the .h on each include, I know it's older):
    >
    #include <stdio.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <termios.h>
    #include <unistd.h>
    int fd1;
    fd1=open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
    >
    I understand the serial port will be binary and may be different from other
    files, but I don't understand why this won't work just as well:
    >
    #include <iostream>
    #include <fstream>
    >
    ofstream myfile;
    myfile.open("/dev/ttyS0", ios::out | ios::binary);
    >
    Would that work as well or is there a reason for handling it the first way?
    Basically, after I catch up on everything, one program will be reading the
    serial port and reporting the output and another will be sending data to
    the port. (It's possible, if I can ever find a good thread tutorial for
    C++ that instead of different programs, they'll be different threads.)
    >
    Thanks for any help on the significance and differences of these two
    methods!
    >
    Hal
    The C++ language has no concept of what a serial port is, therefor it
    is off topic here. However, a newsgroup specific to your operating
    system may very well hold answers for you.

    Comment

    • Hal Vaughan

      #3
      Re: Reading the Serial Port

      Christopher wrote:
      On Mar 11, 12:22 pm, Hal Vaughan <h...@halblog.c omwrote:
      >I've done a fair amount of Googling for information on reading the serial
      >port in C++ (and in Linux). Unfortunately, out of every 4 hits, 1 seems
      >to be an unanswered question, 1 is someone saying, "That's easy, there's
      >a lot out there, Google it,", 1 is a discussion on it without examples
      >and the other is who knows what.
      >>
      >I did find some info on it and have been experimenting. The one example
      >that I liked the best in terms of explanations and readability for a new
      >C++ programmer (coming over from Java and Perl) used this to open the
      >serial port (yes, with the .h on each include, I know it's older):
      >>
      >#include <stdio.h>
      >#include <fcntl.h>
      >#include <errno.h>
      >#include <termios.h>
      >#include <unistd.h>
      >int fd1;
      >fd1=open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
      >>
      >I understand the serial port will be binary and may be different from
      >other files, but I don't understand why this won't work just as well:
      >>
      >#include <iostream>
      >#include <fstream>
      >>
      >ofstream myfile;
      >myfile.open( "/dev/ttyS0", ios::out | ios::binary);
      >>
      >Would that work as well or is there a reason for handling it the first
      >way? Basically, after I catch up on everything, one program will be
      >reading the serial port and reporting the output and another will be
      >sending data to
      >the port. (It's possible, if I can ever find a good thread tutorial for
      >C++ that instead of different programs, they'll be different threads.)
      >>
      >Thanks for any help on the significance and differences of these two
      >methods!
      >>
      >Hal
      >
      The C++ language has no concept of what a serial port is, therefor it
      is off topic here. However, a newsgroup specific to your operating
      system may very well hold answers for you.

      So nobody here would have insight or help on reading from a device overall?
      Or what the difference between the two methods are even if it's not just
      Linux?

      I'm sure an experienced C++ programmer could still give me some good info
      about the two different ways to open a file/device that would help with an
      overall understanding of the situation. I'm sure, for instance, that the
      first method is not Linux specific and I know the 2nd one is not.

      Hal

      Comment

      • Lance Diduck

        #4
        Re: Reading the Serial Port

        On Mar 11, 1:22 pm, Hal Vaughan <h...@halblog.c omwrote:
        I've done a fair amount of Googling for information on reading the serial
        port in C++ (and in Linux).  Unfortunately, out of every 4 hits, 1 seemsto
        be an unanswered question, 1 is someone saying, "That's easy, there's a lot
        out there, Google it,", 1 is a discussion on it without examples and the
        other is who knows what.
        >
        I did find some info on it and have been experimenting.  The one example
        that I liked the best in terms of explanations and readability for a new
        C++ programmer (coming over from Java and Perl) used this to open the
        serial port (yes, with the .h on each include, I know it's older):
        >
        #include <stdio.h>
        #include <fcntl.h>
        #include <errno.h>
        #include <termios.h>
        #include <unistd.h>
        int fd1;
        fd1=open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
        >
        I understand the serial port will be binary and may be different from other
        files, but I don't understand why this won't work just as well:
        >
        #include <iostream>
        #include <fstream>
        >
        ofstream myfile;
        myfile.open("/dev/ttyS0", ios::out | ios::binary);
        >
        Would that work as well or is there a reason for handling it the first way?
        Basically, after I catch up on everything, one program will be reading the
        serial port and reporting the output and another will be sending data to
        the port.  (It's possible, if I can ever find a good thread tutorial for
        C++ that instead of different programs, they'll be different threads.)
        >
        Thanks for any help on the significance and differences of these two
        methods!
        >
        Hal
        There is no reason that the ofstream cant be used. There are tons of
        differences in how errors are handled, how formatted IO is handled,
        and so forth. (the "ios::binar y" will turn off some of the character
        translations that go on between different encodings -- something you
        dont need in serial ports)
        The other differences is that once myfile goes out of scope, all
        system resources will be released. And of course ofstream will format
        your data into character based streams. If you really want to send raw
        bytes through your serial port, avoid doing this
        myfile<<data;
        and do this instead:
        myfile.write(&d ata,sizeof(data ));

        Hope that helps
        Lance

        Comment

        • Paavo Helde

          #5
          Re: Reading the Serial Port

          Hal Vaughan <hal@halblog.co mwrote in
          news:VvABj.5932 $HA3.2326@trndd c02:
          Christopher wrote:
          >
          >On Mar 11, 12:22 pm, Hal Vaughan <h...@halblog.c omwrote:
          >>I've done a fair amount of Googling for information on reading the
          >>serial port in C++ (and in Linux).
          Maybe the reason of your failure is that serial port is becoming
          obsolete. Most peripheral devices are using USB nowadays. From your post
          I gather that you are planning to make two threads in the same process
          communicate over the serial port - why on the earth you would want to do
          that?

          [..]
          >>Basically, after I catch up on everything, one program
          >>will be reading the serial port and reporting the output and another
          >>will be sending data to
          >>the port. (It's possible, if I can ever find a good thread tutorial
          >>for C++ that instead of different programs, they'll be different
          >>threads.)
          [...]
          >
          So nobody here would have insight or help on reading from a device
          overall?
          For interprocess or interthread communication you don't need any device!

          Regards
          Paavo

          Comment

          • Hal Vaughan

            #6
            Re: Reading the Serial Port

            Paavo Helde wrote:
            Hal Vaughan <hal@halblog.co mwrote in
            news:VvABj.5932 $HA3.2326@trndd c02:
            >
            >Christopher wrote:
            >>
            >>On Mar 11, 12:22 pm, Hal Vaughan <h...@halblog.c omwrote:
            >>>I've done a fair amount of Googling for information on reading the
            >>>serial port in C++ (and in Linux).
            >
            Maybe the reason of your failure is that serial port is becoming
            obsolete. Most peripheral devices are using USB nowadays. From your post
            I gather that you are planning to make two threads in the same process
            communicate over the serial port - why on the earth you would want to do
            that?
            It's not failing, what I'm trying to understand is what is the difference in
            the two methods? Are there things that won't show up in a simple test?
            Are there implications in one method that aren't there in the other that
            someone new to C++ won't think of without help?

            Because that's where the device is I need to communicate with.

            If I use a USB/Serial adaptor on a USB port, will reading and writing to the
            USB port be just the same as to/from the serial port? (I would think so,
            but I don't know if the USB/serial adaptor makes things different.)
            [..]
            >>>Basically, after I catch up on everything, one program
            >>>will be reading the serial port and reporting the output and another
            >>>will be sending data to
            >>>the port. (It's possible, if I can ever find a good thread tutorial
            >>>for C++ that instead of different programs, they'll be different
            >>>threads.)
            [...]
            >>
            >So nobody here would have insight or help on reading from a device
            >overall?
            >
            For interprocess or interthread communication you don't need any device!
            Sorry, it's a separate issue and I was thinking of the whole thing together
            and I shouldn't have combined the two in one post.

            Hal

            Comment

            • Hal Vaughan

              #7
              Re: Reading the Serial Port

              Lance Diduck wrote:
              On Mar 11, 1:22 pm, Hal Vaughan <h...@halblog.c omwrote:
              >I've done a fair amount of Googling for information on reading the serial
              >port in C++ (and in Linux).  Unfortunately, out of every 4 hits, 1 seems
              >to be an unanswered question, 1 is someone saying, "That's easy, there's
              >a lot out there, Google it,", 1 is a discussion on it without examples
              >and the other is who knows what.
              >>
              >I did find some info on it and have been experimenting.  The one example
              >that I liked the best in terms of explanations and readability for a new
              >C++ programmer (coming over from Java and Perl) used this to open the
              >serial port (yes, with the .h on each include, I know it's older):
              >>
              >#include <stdio.h>
              >#include <fcntl.h>
              >#include <errno.h>
              >#include <termios.h>
              >#include <unistd.h>
              >int fd1;
              >fd1=open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
              >>
              >I understand the serial port will be binary and may be different from
              >other files, but I don't understand why this won't work just as well:
              >>
              >#include <iostream>
              >#include <fstream>
              >>
              >ofstream myfile;
              >myfile.open( "/dev/ttyS0", ios::out | ios::binary);
              >>
              >Would that work as well or is there a reason for handling it the first
              >way? Basically, after I catch up on everything, one program will be
              >reading the serial port and reporting the output and another will be
              >sending data to the port.  (It's possible, if I can ever find a good
              >thread tutorial for C++ that instead of different programs, they'll be
              >different threads.)
              >>
              >Thanks for any help on the significance and differences of these two
              >methods!
              >>
              >Hal
              There is no reason that the ofstream cant be used. There are tons of
              differences in how errors are handled, how formatted IO is handled,
              and so forth. (the "ios::binar y" will turn off some of the character
              translations that go on between different encodings -- something you
              dont need in serial ports)
              The other differences is that once myfile goes out of scope, all
              system resources will be released. And of course ofstream will format
              your data into character based streams. If you really want to send raw
              bytes through your serial port, avoid doing this
              myfile<<data;
              and do this instead:
              myfile.write(&d ata,sizeof(data ));
              >
              Hope that helps
              Lance
              It helps a LOT!

              Thank you!

              Hal

              Comment

              • Paavo Helde

                #8
                Re: Reading the Serial Port

                Hal Vaughan <hal@halblog.co mwrote in news:dzCBj.3956 $z13.99@trnddc0 6:
                Paavo Helde wrote:
                >
                >Hal Vaughan <hal@halblog.co mwrote in
                >news:VvABj.593 2$HA3.2326@trnd dc02:
                >>
                >>Christopher wrote:
                >>>
                >>>On Mar 11, 12:22 pm, Hal Vaughan <h...@halblog.c omwrote:
                >>>>I've done a fair amount of Googling for information on reading the
                >>>>serial port in C++ (and in Linux).
                >>
                >Maybe the reason of your failure is that serial port is becoming
                >obsolete. Most peripheral devices are using USB nowadays. From your
                >post I gather that you are planning to make two threads in the same
                >process communicate over the serial port - why on the earth you would
                >want to do that?
                >
                It's not failing, what I'm trying to understand is what is the
                difference in the two methods? Are there things that won't show up in
                a simple test? Are there implications in one method that aren't there
                in the other that someone new to C++ won't think of without help?
                >
                Because that's where the device is I need to communicate with.
                >
                If I use a USB/Serial adaptor on a USB port, will reading and writing
                to the USB port be just the same as to/from the serial port? (I would
                think so, but I don't know if the USB/serial adaptor makes things
                different.)
                Sorry, I misunderstood your problem! I don't know answers to your
                questions. Alas, the serial ports are outside of C++ and off-topic in
                this ng, please try some linux newsgroup!

                (I myself would go for POSIX open() route just to avoid any chances that
                the C++ layer fails to provide some seemingly needed flags like O_NOCTTY
                or O_NDELAY. But this would be non-portable of course.)

                Regards
                Paavo

                Comment

                • Default User

                  #9
                  Re: Reading the Serial Port

                  Hal Vaughan wrote:

                  And some people decided that rather than try to provide helpful
                  information from the start and addressing the parts of my post they
                  could, that they'd rather just play Internet Policeman.
                  *plonk*



                  Brian

                  Comment

                  • Default User

                    #10
                    Re: Reading the Serial Port

                    Christopher wrote:
                    On Mar 11, 1:50 pm, Hal Vaughan <h...@halblog.c omwrote:
                    >fd1=open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
                    >ofstream myfile;
                    >myfile.open( "/dev/ttyS0", ios::out | ios::binary);
                    Sure, the first is C and the second is C++.
                    Not even that. The first is POSIX, which happens to have a C API. It's
                    no more a C function that it is a C++ one.




                    Brian

                    Comment

                    Working...