Linux termios VTIME não está funcionando?
-
16-09-2019 - |
Pergunta
Estamos atacando nossas cabeças fora de um presente durante toda a manhã. Temos alguma configuração linhas serial entre um dispositivo Linux embutido e uma caixa de Ubuntu. Nossa lê estão ficando asneira porque o nosso código geralmente retorna dois (às vezes mais, às vezes exatamente um) mensagem lê em vez de uma mensagem lida por mensagem enviada real.
Aqui está o código que abre a porta serial. InterCharTime está definido para 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;
}
A outra extremidade é configurado de forma semelhante para a comunicação, e tem uma pequena secção de particular iterest:
while (1)
{
sprintf(out, "\r\nHello world %lu", ++ulCount);
puts(out);
WritePort((BYTE *)out, strlen(out)+1);
sleep(2);
} //while
Agora, quando eu executar um thread leitura na máquina receptora, "Olá mundo" é geralmente dividido ao longo de mensagens casal. Aqui está um exemplo de saída:
1: Hello
2: world 1
3: Hello
4: world 2
5: Hello
6: world 3
onde número seguido por uma cólon é uma mensagem recebida. você pode ver qualquer erro que estamos a fazer?
Obrigado.
Edit: Para maior clareza, por favor veja secção 3.2 da Programação Serial Linux COMO FAZER . Para meu entendimento, com um VTIME de alguns segundos (ou seja, VTIME é conjunto em qualquer lugar entre 10 e 50 anos, de tentativa e erro), e uma VMIN de 1, não deve haver nenhuma razão para que a mensagem é dividida em duas mensagens separadas .
Solução
Eu não vejo por que você está surpreso.
Você está pedindo pelo menos um byte. Se a sua leitura () está a pedir mais, o que parece provável desde que você está surpreso que você não está recebendo a seqüência inteira em uma única leitura, ele pode obter todos os dados que é colocado à disposição do read (tamanho). Mas todos os dados não está disponível em uma única leitura para que o seu string é picado entre leituras.
Neste cenário, o temporizador não importa realmente. O temporizador não será ajustado até, pelo menos, um byte está disponível. Mas definiu o mínimo em 1. Por isso, apenas retornos independentemente do número de bytes (> = 1) estão disponíveis para ler () bytes de tamanho.
Outras dicas
Se você ainda estiver enfrentando esse problema (percebendo a questão é de idade), e seu código é preciso, você está definindo o seu VTIME e VMIN na estrutura newtio
, eo resto dos outros parâmetros na estrutura tio
.