Domanda

Abbiamo colpire le nostre teste fuori di questo per tutta la mattina. Abbiamo un po 'di messa a punto linee seriale tra un dispositivo Linux embedded e una casella di Ubuntu. La nostra legge sono sempre avvitato perché il nostro codice di solito ritorna a due (a volte più, a volte esattamente un) Messaggio di legge invece di uno messaggio letto per ogni messaggio inviato attuale.

Ecco il codice che apre la porta seriale. InterCharTime è impostato su 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;
}

L'altra estremità è configurata in modo simile per comunicazione, ed ha una piccola sezione di particolare iterest:

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

Ora, quando si esegue un filo di lettura sulla macchina ricevente, "Ciao Mondo" di solito è rotto in su sopra un paio di messaggi. Ecco qualche esempio di output:

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

dove il numero seguito da due punti è un unico messaggio ricevuto. Vedi qualche errore che stiamo facendo?

Grazie.

Modifica: Per chiarezza, si prega di consultare sezione 3.2 della programmazione seriale Linux HOWTO. Per la mia comprensione, con una VTIME di un paio di secondi (che significa VTime è impostata tra 10 e 50, per tentativi ed errori), e un VMIN di 1, non ci dovrebbe essere alcun motivo che il messaggio è suddiviso in due messaggi separati .

È stato utile?

Soluzione

Non vedo il motivo per cui si sono sorpresi.

Stai chiedendo per almeno un byte. Se il read () sta chiedendo di più, che sembra probabile dal momento che siete sorpresi che non si ottiene l'intera stringa in una sola lettura, si può ottenere tutto ciò che i dati sono disponibili fino alla lettura) dimensioni (. Ma tutti i dati non è disponibile in una sola lettura in modo che il filo viene tagliato tra legge.

In questo scenario il timer non ha molta importanza. Il timer non verrà impostato fino a quando almeno un byte è disponibile. Ma è stato impostato il minimo a 1. Quindi restituisce solo qualunque sia il numero di byte (> = 1) sono disponibili fino a leggere byte size ().

Altri suggerimenti

Se si verificano ancora questo problema (realizzando la domanda è vecchia), e il codice è esatto, si sta impostando una VTIME e VMIN nella struct newtio, e il resto degli altri parametri nella struct tio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top