우리는 아침마다 머리를 숙이고 있습니다. 우리는 임베디드 리눅스 장치와 우분투 상자 사이에 시리얼 라인을 설정했다. 우리의 코드는 실제로 보내지는 메시지 당 하나의 메시지 읽기 대신 두 번 (때로는 정확히, 때로는 정확히 하나)의 메시지 읽기를 반환하기 때문에 읽기가 엉망이되고 있습니다.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로 설정하면 메시지가 두 개의 개별 메시지로 분리 될 이유가 없어야합니다. .
간단한 프레임 구성표를 사용해야합니다. – caf
4,5 초 정도의 매우 높은 VTIME 값을 시도했습니다. 그 사이에 수많은 값을 시도했습니다. http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html의 섹션 3.2를 검토하면 "놀란 이유"가 이해 될 것입니다 –
아하, 나는 그 부분을 다시 읽었습니다. 수십 번 읽었고 대답을 게시하고 읽은 다음 다시 읽으면 명확 해졌습니다 ... VMIN 및 VTME 조건은 논리적이거나 논리적이지 않습니다. 감사합니다. –