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 .

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top