Welcome to Dream.In.Code
Become a C++ Expert!

Join 149,489 C++ Programmers for FREE! Get instant access to thousands of C++ experts, tutorials, code snippets, and more! There are 1,284 people online right now. Registration is fast and FREE... Join Now!




rs232 how to read bytes

 
Reply to this topicStart new topic

rs232 how to read bytes

akira300
28 Feb, 2007 - 03:01 AM
Post #1

New D.I.C Head
*

Joined: 16 Feb, 2007
Posts: 14


My Contributions
now im reading incoming data as a string, and i have to read the individual data a separate bytes, so is there a way that i can get an array of bytes? (check the arrows at the bottom thats where im reading)

thnx in advance


CODE
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>
        #include <termios.h>
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <unistd.h>
        #include <iostream>
        #include <stdlib.h>
        #include <sys/ioctl.h>
        #include <stdlib.h>
        
//--- dit zou ik kunnen gebruiken voor de rts lijn af te zetten        
//#include <asm/io.h>
//#define serport 0x3f8 // for "/dev/ttyS0"
      
        

        /* baudrate settings are defined in <asm/termbits.h>, which is
        included by <termios.h> */
        #define BAUDRATE B9600            
      
        /* change this definition for the correct port */
        #define MODEMDEVICE "/dev/ttyS0"
        #define _POSIX_SOURCE 1 /* POSIX compliant source */

        #define FALSE 0
        #define TRUE 1

        volatile int STOP=FALSE;
        using namespace std;
        
        main()
        {          
            
          char test[255];
          int fd,c, res,testen;
          int sercmd, serstat;
          struct termios oldtio,newtio;
          char buf[255];
          char buf2[255]=" ";                

          
          
        /*
          Open modem device for reading and writing and not as controlling tty
          because we don't want to get killed if linenoise sends CTRL-C.
        */
          cout<<"-----begin-----\n";
          
         fd = open(MODEMDEVICE, O_RDWR);
         if (fd <0){
            cout<<"error \n";
         }
         else
         {
             cout<<"serial poort geopend \n";
            
         }
    

        
         tcgetattr(fd,&oldtio); /* save current serial port settings */
         bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */
        
        /*
          BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed.
          CRTSCTS : output hardware flow control (only used if the cable has
                    all necessary lines. See sect. 7 of Serial-HOWTO)    <---------- !!!!!!!!!!! CHECK THIS;
          CS8     : 8n1 (8bit,no parity,1 stopbit)
          CLOCAL  : local connection, no modem contol
          CREAD   : enable receiving characters
        */
         newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; // | CRTSCTS; <-- let hier mee op dit kan er
         //voor zorgen dat je je data niet kan versturen, gebruik dit enkel als dit mogelijk is.
        
        /*
          IGNPAR  : ignore bytes with parity errors
          ICRNL   : map CR to NL (otherwise a CR input on the other computer
                    will not terminate input)
          otherwise make device raw (no other input processing)
        */
         newtio.c_iflag = IGNPAR | ICRNL;
        
        /*
         Raw output.
        */
         newtio.c_oflag = 0;
        
        /*
          ICANON  : enable canonical input
          disable all echo functionality, and don't send signals to calling program
        */
         newtio.c_lflag = ICANON;
        
        /*
          initialize all control characters
          default values can be found in /usr/include/termios.h, and are given
          in the comments, but we don't need them here
        */
         newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */
         newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
         newtio.c_cc[VERASE]   = 0;     /* del */
         newtio.c_cc[VKILL]    = 0;     /* @ */
         newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */
         newtio.c_cc[VTIME]    = 0;     /* inter-character timer unused */
         newtio.c_cc[VMIN]     = 1;     /* blocking read until 1 character arrives */
         newtio.c_cc[VSWTC]    = 0;     /* '\0' */
         newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */
         newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
         newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
         newtio.c_cc[VEOL]     = 0;     /* '\0' */
         newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
         newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
         newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
         newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
         newtio.c_cc[VEOL2]    = 0;     /* '\0' */
        
        /*
          now clean the modem line and activate the settings for the port
        */
         tcflush(fd, TCIFLUSH);
         tcsetattr(fd,TCSANOW,&newtio);
        

        
         //RTS DISABLEN !!!!
        
          ioctl(fd, TIOCMGET, &serstat);
          
          cout << "-------------serstat=" <<serstat<< "-------------\n";
          
          //cout << "-------------TIOCM_RTS=" <<TIOCM_RTS<< "-------------\n";
          //cout << "-------------TIOCMBIS=" <<TIOCMBIS<< "-------------\n";
          //testen = serstat & TIOCM_RTS;
          //cout << "-------------testen=" << testen<< "-------------\n";
          

          
          
          
          getchar(); // Wait for the return key before continuing.
        
          sercmd = TIOCM_RTS;
          
          printf("Setting the RTS pin.\n");
          ioctl(fd, TIOCMBIC, &sercmd); // Set the RTS pin.
          ioctl(fd, TIOCMGET, &serstat);
          
         cout << "-------------serstat=" <<serstat<< "-------------\n";
         //cout << "-------------TIOCM_RTS=" <<TIOCM_RTS<< "-------------\n";
         //cout << "-------------TIOCMBIS=" <<TIOCMBIS<< "-------------\n";
          
          
        
          getchar(); // Wait for the return key before continuing.
        
          
         //Methode 2
         //iopl(3); // need this for access to ports
         //outb( 0x02, serport+4); //modem control register
        

        
        /*
          terminal settings done, now handle input
          In this example, inputting a 'z' at the beginning of a line will
          exit the program.
        */
        
        
         cout<<"-----voor de lus-----\n";
         while (STOP==FALSE) {     /* loop until we have a terminating condition */
         /* read blocks program execution until a line terminating character is
            input, even if more than 255 chars are input. If the number
            of characters read is smaller than the number of chars available,
            subsequent reads will return the remaining chars. res will be set
            to the actual number of characters actually read */
            
            cout<<"-----spatie naar het toestel schrijven-----\n";
             char spatie[2] = " ";
             cout <<"---"<< spatie[0]<<"---";
            
            
            
            if (write(fd,spatie,1) < 1)
            {                
                cout<<"-------------error--------------\n";
                //continue;                    
            }
             sleep(1);
            cout<<"-----spatie naar het toestel geschreven-----\n";
                      
            
            cout<<"-----proberen te lezen van de com poort-----\n";
            //lezen van de com poort
            res = read(fd,buf,255); //IM READING HERE <-------------------------------------------------------------------------------------------------
            cout<<"-----GeLezen van de com poort-----\n";
                      
            //wegschrijven naar de com poort
      
            
            buf[res]=0;             /* set end of string, so we can printf */
            
            //printf("%s: aantal chars = %d\n", buf, res);
            sprintf(test,"%s%d",buf,res); // Printing here <------------------------------------------------------------------------------------------------------------------
            cout << test;
            cout << "\n--------binnen gekomen data------------ \n";
            
            
            
            if (buf[0]=='z') STOP=TRUE;
         }
         cout<<"-----na de lus-----\n";
         /* restore the old port settings */
         tcsetattr(fd,TCSANOW,&oldtio);
         cout<<"-----einde-----\n";
        
        }



This post has been edited by akira300: 28 Feb, 2007 - 03:10 AM
User is offlineProfile CardPM
+Quote Post

horace
RE: Rs232 How To Read Bytes
28 Feb, 2007 - 05:10 AM
Post #2

D.I.C Addict
Group Icon

Joined: 25 Oct, 2006
Posts: 573



Thanked: 5 times
Dream Kudos: 50
My Contributions
you read
CODE

res = read(fd,buf,255); //IM READING HERE

into buf which is a char array
CODE

          char buf[255];

each character is a byte so buf[] is an array of bytes

you can treat ieach element either as a character or a byte sized integer


User is offlineProfile CardPM
+Quote Post

akira300
RE: Rs232 How To Read Bytes
28 Feb, 2007 - 07:46 AM
Post #3

New D.I.C Head
*

Joined: 16 Feb, 2007
Posts: 14


My Contributions
QUOTE(horace @ 28 Feb, 2007 - 06:10 AM) *

you read
CODE

res = read(fd,buf,255); //IM READING HERE

into buf which is a char array
CODE

          char buf[255];

each character is a byte so buf[] is an array of bytes

you can treat ieach element either as a character or a byte sized integer


ok thnx i got to work, but when i cast ” (int) buf[i]" some of them become negative. how can a byte 0000 0000 - 1111 1111 become negative if casted to an int, shouldn't it be in the range of 0-255 then ? but maybe there is something about casting a byte to an int that I'm missing ?
User is offlineProfile CardPM
+Quote Post

horace
RE: Rs232 How To Read Bytes
28 Feb, 2007 - 08:29 AM
Post #4

D.I.C Addict
Group Icon

Joined: 25 Oct, 2006
Posts: 573



Thanked: 5 times
Dream Kudos: 50
My Contributions
QUOTE(akira300 @ 28 Feb, 2007 - 03:46 PM) *

ok thnx i got to work, but when i cast ” (int) buf[i]" some of them become negative. how can a byte 0000 0000 - 1111 1111 become negative if casted to an int, shouldn't it be in the range of 0-255 then ? but maybe there is something about casting a byte to an int that I'm missing ?

The char type is signed by default on some computers, but unsigned on others. Yours must be signed (bit 7 is the sign bit) so when you cast it to int it sign extends. If the byte data should be unsigned declared your char array
CODE

         unsigned char buf[255];

User is offlineProfile CardPM
+Quote Post

Reply to this topicStart new topic
Time is now: 1/7/09 05:24PM

Be Social

Dream.In.Code RSS Feed Dream.In.Code LinkedIn Group Follow Us On Twitter

Live C++ Help!

C++ Tutorials

Reference Sheets

C++ Snippets

DIC Chatroom

Bye Bye Ads

Monthly Drawing

Thumb Drive

Top Contributors

Top 10 Kudos This Month