문제

우리는 아침 내내이 머리를 쫓아 내고 있습니다. 임베디드 리눅스 장치와 우분투 상자 사이에 일부 직렬 라인 설정이 있습니다. 우리의 코드는 일반적으로 실제 메시지 당 하나의 메시지를 읽는 대신 두 개의 (때로는 때로는 정확히 하나의) 메시지를 반환하기 때문에 우리의 읽기가 망가지고 있습니다.

직렬 포트를 열는 코드는 다음과 같습니다. 차타임은 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;
}

다른 쪽 끝은 커뮤니케이션과 유사하게 구성되며 특정 반복의 작은 섹션이 있습니다.

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

결장 뒤에있는 숫자는 하나의 메시지가받은 곳입니다. 우리가하는 오류가 보이십니까?

고맙습니다.

편집 : 명확하게 보려면보십시오 Linux 직렬 프로그래밍 Howto의 섹션 3.2. 내 이해에 따르면, 몇 초의 vtime (vtime은 10 ~ 50 사이의 시행 착오로 설정되어 있음)과 Vmin 1의 Vmin이라는 것을 의미합니다. .

도움이 되었습니까?

해결책

왜 당신이 놀랐는지 모르겠습니다.

당신은 적어도 하나의 바이트를 요구하고 있습니다. read ()가 더 많은 것을 요구하는 경우, 단일 읽기에서 전체 문자열을 얻지 못한 것에 놀랄 가능성이있는 것처럼 보이면 read () 크기까지 사용할 수있는 데이터를 얻을 수 있습니다. 그러나 모든 데이터는 단일 읽기에서 사용할 수 없으므로 문자열이 읽기 사이에서 잘려옵니다.

이 시나리오에서 타이머는 실제로 중요하지 않습니다. 하나 이상의 바이트를 사용할 수있을 때까지 타이머가 설정되지 않습니다. 그러나 최소값을 1로 설정했습니다. 따라서 바이트 수 (> = 1)를 read () 크기 바이트로 사용할 수 있습니다.

다른 팁

여전히이 문제를 겪고있는 경우 (질문이 오래되었음을 인식하고) 코드가 정확하다면 VMIN을 설정하고 있습니다. newtio 구조, 나머지 다른 매개 변수는 tio 구조.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top