2010-03-05 6 views
1

나는 PC1 (자바 응용 프로그램)에서 직렬 포트를 통해 데이터를 전송하고 독서하고 응용 프로그램이 그 PC2 (C++ 응용 프로그램) 데이터. 내가 직면하고있는 문제는 내 PC2 (C++ App)가 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를 설정하는 것이 좋습니다.