Linux Termios vtime이 작동하지 않습니까?
-
16-09-2019 - |
문제
우리는 아침 내내이 머리를 쫓아 내고 있습니다. 임베디드 리눅스 장치와 우분투 상자 사이에 일부 직렬 라인 설정이 있습니다. 우리의 코드는 일반적으로 실제 메시지 당 하나의 메시지를 읽는 대신 두 개의 (때로는 때로는 정확히 하나의) 메시지를 반환하기 때문에 우리의 읽기가 망가지고 있습니다.
직렬 포트를 열는 코드는 다음과 같습니다. 차타임은 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
구조.