2010-03-05 88 views
1

我在那裏,我通過串口從PC1(Java應用程序)發送數據,讀取的應用程序,在PC2(C++應用程序)數據。我面臨的問題是,我的PC2(C++應用程序)無法讀取PC1發送的完整數據,即從我的PC1發送190字節,但PC2能夠讀取接近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 

回答

0

Lateee響應的代碼片段,但如果你讀不規範的模式,考慮VMIN設定爲要讀取的字節數。