Последовательный порт: проблема чтения данных, неполное чтение данных - PullRequest
1 голос
/ 05 марта 2010

У меня есть приложение, в которое я отправляю данные через последовательный порт с ПК1 (приложение Java) и считываю эти данные в ПК2 (приложение C ++) . Проблема, с которой я сталкиваюсь, заключается в том, что мой ПК2 (приложение C ++) не может прочитать полные данные, отправленные ПК1, т.е. с моего ПК1 я отправляю 190 байтов, но ПК2 способен читать почти 140 байтов, хотя я пытаюсь читать в петля.

Ниже приведен фрагмент кода моего приложения C ++

 /**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

1 Ответ

0 голосов
/ 13 февраля 2014

Более поздний ответ, но если вы читаете в неканоническом режиме, рассмотрите возможность установки VMIN на число байтов, которые вы хотите прочитать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...