2009-07-15 4 views
1

우리는 아침마다 머리를 숙이고 있습니다. 우리는 임베디드 리눅스 장치와 우분투 상자 사이에 시리얼 라인을 설정했다. 우리의 코드는 실제로 보내지는 메시지 당 하나의 메시지 읽기 대신 두 번 (때로는 정확히, 때로는 정확히 하나)의 메시지 읽기를 반환하기 때문에 읽기가 엉망이되고 있습니다.Linux termios VTIME이 작동하지 않습니까?

다음은 직렬 포트를 여는 코드입니다. InterCharTime 4.

void COMClass::openPort() 
{ 
    struct termios tio; 

    this->fd = -1; 

    int tmpFD; 

    tempFD = open(port, O_RDWR | O_NOCTTY); 
    if (tempFD < 0) 
    { 

    cerr<< "the port is not opened"<< port <<"\n"; 
    portOpen = 0; 
    return; 
    } 


    tio.c_cflag = BaudRate | CS8 | CLOCAL | CREAD ; 
    tio.c_oflag = 0; 
    tio.c_iflag = IGNPAR;  
    newtio.c_cc[VTIME] = InterCharTime; 
    newtio.c_cc[VMIN]  = readBufferSize; 
    newtio.c_lflag = 0;  

    tcflush(tempFD, TCIFLUSH); 
    tcsetattr(tempFD,TCSANOW,&tio); 

    this->fd = tempFD; 
    portOpen = true; 
} 

다른 끝은 유사하게 통신을 위해 구성된로 설정하고, 특정 iterest의 한 작은 부분이있다 : 나는 수신 시스템의 읽기 스레드를 실행할 때, 지금

while (1) 
{ 
    sprintf(out, "\r\nHello world %lu", ++ulCount); 
    puts(out); 
    WritePort((BYTE *)out, strlen(out)+1); 
    sleep(2); 
} //while 

을 "hello world"는 일반적으로 몇 개의 메시지를 통해 분리됩니다. 여기에 몇 가지 출력 예가 나와 있습니다.

1: Hello 
2: world 1 
3: Hello 
4: world 2 
5: Hello 
6: world 3 

여기서 콜론 뒤에 오는 숫자는 하나의 메시지입니다. 우리가 만드는 어떤 오류라도 볼 수 있습니까?

감사합니다.

편집 : 명확성을 위해 section 3.2 of the Linux Serial Programming HOWTO을 참조하십시오. 내 이해를 위해 VTIME을 몇 초 (vtime은 10 ~ 50, 시행 착오)로 설정하고 VMIN을 1로 설정하면 메시지가 두 개의 개별 메시지로 분리 될 이유가 없어야합니다. .

답변

3

놀란 이유는 없습니다.

적어도 1 바이트를 요구합니다. 만약 read()가 더 많은 것을 요구한다면, 당신이 놀랍기 때문에 전체 문자열을 단일 읽기에서 얻지 못했기 때문에, read() 크기까지 사용할 수있는 모든 데이터를 얻을 수 있습니다. 그러나 모든 데이터는 단일 읽기에서 사용할 수 없으므로 문자열이 읽기 사이에 잘립니다.

이 시나리오에서 타이머는 별 문제가되지 않습니다. 타이머는 적어도 하나의 바이트를 사용할 수있을 때까지 설정되지 않습니다. 그러나 최소값을 1로 설정했습니다. 따라서 read() size 바이트까지 사용할 수있는 바이트 수 (> = 1)가 반환됩니다.

+0

간단한 프레임 구성표를 사용해야합니다. – caf

+0

4,5 초 정도의 매우 높은 VTIME 값을 시도했습니다. 그 사이에 수많은 값을 시도했습니다. http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html의 섹션 3.2를 검토하면 "놀란 이유"가 이해 될 것입니다 –

+0

아하, 나는 그 부분을 다시 읽었습니다. 수십 번 읽었고 대답을 게시하고 읽은 다음 다시 읽으면 명확 해졌습니다 ... VMIN 및 VTME 조건은 논리적이거나 논리적이지 않습니다. 감사합니다. –

0

이 문제가 여전히 발생하고 (질문이 오래되었다는 것을 알고) 코드가 정확하다면 newtio 구조체에 VTIME 및 VMIN을 설정하고 tio 구조체의 나머지 매개 변수를 설정합니다.

+0

OP가 질문을 편집하고 코드의이 부분을 수정하는 것을 잊었 기 때문입니다. 편집 내역을 확인하십시오. –

관련 문제