Pregunta

Hemos estado golpear la cabeza fuera de éste durante toda la mañana. Tenemos algo de configuración de líneas serie entre un dispositivo Linux embebido y un cuadro de Ubuntu. Nuestra lee se están cagado porque nuestro código vuelve generalmente dos (a veces más, a veces exactamente una) lee el mensaje en lugar de un mensaje leído por mensaje enviado real.

Este es el código que abre el puerto serie. InterCharTime se establece en 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;
}

El otro extremo está configurado de manera similar para la comunicación, y tiene una pequeña sección de especial iterest:

while (1)
{
    sprintf(out, "\r\nHello world %lu", ++ulCount);
    puts(out);
    WritePort((BYTE *)out, strlen(out)+1);
    sleep(2);
} //while

Ahora, cuando corro un hilo de lectura en la máquina receptora, "hola mundo" por lo general se rompe a lo largo de un par de mensajes. Aquí está un ejemplo de salida:

1: Hello
2: world 1
3: Hello
4: world 2
5: Hello
6: world 3

donde el número seguido de dos puntos es un mensaje recibido. ¿Hay algún error que estamos haciendo?

Gracias.

Editar: Para mayor claridad, por favor ver la sección 3.2 de la programación serial Linux COMO. A mi entender, con un VTIME de un par de segundos (lo que significa VTIME se establece en cualquier lugar entre 10 y 50, por ensayo y error), y una VMIN de 1, no debería haber ninguna razón por la que el mensaje se divide en dos mensajes separados .

¿Fue útil?

Solución

No veo por qué te sorprende.

Se está pidiendo al menos un byte. Si su lectura () está pidiendo más, lo que parece probable ya que está sorprendido que no está recibiendo toda la cadena en una sola lectura, se puede obtener cualquier dato que esté disponible hasta el tamaño de lectura (). Sin embargo, todos los datos no está disponible en un solo lectura para que su cadena se corta entre lee.

En este escenario, el temporizador no importa realmente. El temporizador no se establecerá hasta que al menos un byte está disponible. Pero ha ajustado el mínimo en 1. Por lo tanto, sólo devuelve cualquier número de bytes (> = 1) están disponibles para leer bytes () de tamaño.

Otros consejos

Si usted todavía está experimentando este problema (la realización de la interrogación vieja), y su código es exacto, que configura el VTIME y VMIN en la estructura newtio, y el resto de los otros parámetros de la estructura tio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top