Serial port : Read data problem, not reading complete data
        Posted  
        
            by Anuj Mehta
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Anuj Mehta
        
        
        
        Published on 2010-03-05T09:16:06Z
        Indexed on 
            2010/03/20
            19:01 UTC
        
        
        Read the original article
        Hit count: 437
        
Hi
I have an application where I am sending data via serial port from PC1 (Java App) and reading that data in PC2 (C++ App). The problem that I am facing is that my PC2 (C++ App) is not able to read complete data sent by PC1 i.e. from my PC1 I am sending 190 bytes but PC2 is able to read close to 140 bytes though I am trying to read in a loop.
Below is code snippet of my C++ App
Open the connection to serial port
serialfd = open( serialPortName.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
if (serialfd == -1) { /* * Could not open the port. */ TRACE << "Unable to open port: " << serialPortName << endl; } else { TRACE << "Connected to serial port: " << serialPortName << endl; fcntl(serialfd, F_SETFL, 0); }
Configure the Serial Port parameters
struct termios options;
/* * Get the current options for the port... */ tcgetattr(serialfd, &options);
/* * Set the baud rates to 9600... */ cfsetispeed(&options, B38400); cfsetospeed(&options, B38400);
/* * 8N1 * Data bits - 8 * Parity - None * Stop bits - 1 */ options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8;
/* * Enable hardware flow control */ options.c_cflag |= CRTSCTS;
/* * Enable the receiver and set local mode... */ options.c_cflag |= (CLOCAL | CREAD);
// Flush the earlier data tcflush(serialfd, TCIFLUSH);
/* * Set the new options for the port... */ tcsetattr(serialfd, TCSANOW, &options);
Now I am reading data
  const int MAXDATASIZE = 512;
  std::vector<char> m_vRequestBuf; 
  char buffer[MAXDATASIZE];
  int totalBytes = 0;
  fcntl(serialfd, F_SETFL, FNDELAY);
  while(1) {
          bytesRead = read(serialfd, &buffer, MAXDATASIZE);
  if(bytesRead == -1)
  {
     //Sleep for some time and read again 
                  usleep(900000);
  }
  else
  {
      totalBytes += bytesRead;  
                  //Add data read to vector
                  for(int i =0; i < bytesRead; i++)
      {
   m_vRequestBuf.push_back(buffer[i]);
      }
                  int newBytesRead = 0;
                  //Now keep trying to read more data
      while(newBytesRead != -1)
      {
   //clear contents of buffer
   memset((void*)&buffer, 0, sizeof(char) * MAXDATASIZE); 
   newBytesRead = read(serialfd, &buffer, MAXDATASIZE);
   totalBytes += newBytesRead;
                        for(int j = 0; j < newBytesRead; j++)
   {
       m_vRequestBuf.push_back(buffer[j]);
   }
       }//inner while    
     break;
  } //while
© Stack Overflow or respective owner