2010-03-05 50 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设定为要读取的字节数。