Frage

Wir haben unsere Köpfe sind bashing aus den ganzen Morgen von dieser. Wir haben einige serielle Leitungen Setup zwischen einem Embedded-Linux-Gerät und einem Ubuntu-Box bekam. Unsere liest werden immer vermasselt, weil unser Code in der Regel gibt zwei (mal mehr, mal genau eine) Nachricht liest, anstatt eine Nachricht pro eigentliche Nachricht lesen gesendet.

Hier ist der Code, den seriellen Port öffnet. InterCharTime auf 4 eingestellt ist.

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;
}

Das andere Ende ist in ähnlicher Weise konfiguriert für die Kommunikation, und hat einen kleinen Abschnitt des bestimmten iterest:

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

Nun, wenn ich einen roten Faden auf dem empfangenden Computer ausgeführt werden, „Hallo Welt“ wird in der Regel über ein paar Nachrichten aufgebrochen. Hier einige Beispiel-Ausgabe:

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

Dabei gilt Zahl mit einem Doppelpunkt ist eine Nachricht empfangen. sehen Sie einen Fehler machen wir?

Danke.

Edit: Aus Gründen der Klarheit, sehen Sie bitte Abschnitt 3.2 des Linux-Serial Programming HOWTO . Zu meinem Verständnis, mit einem VTIME von ein paar Sekunden (was bedeutet, Vtime wird irgendwo zwischen 10 und 50, trial-and-error) und einem VMIN von 1, sollte es keinen Grund geben, dass die Nachricht auf über zwei separate Nachrichten gebrochen .

War es hilfreich?

Lösung

Ich sehe nicht, warum Sie überrascht sind.

Sie fordern mindestens ein Byte. Wenn Ihr read () für mehr fragt, was da Sie wahrscheinlich ist, sind überrascht Sie nicht die gesamte Zeichenfolge in einer einzigen Lese bekommen, kann es zu bekommen, was Daten verfügbar sind bis zum read () Größe. Aber alle Daten in einer einzigen Lese nicht zur Verfügung, so die Zeichenfolge gehackt besteht zwischen liest.

In diesem Szenario ist der Timer nicht wirklich wichtig. Der Timer wird nicht eingestellt werden, bis mindestens ein Byte zur Verfügung. Aber Sie haben festgelegt kehrt das Minimum bei 1. So ist es nur, was Anzahl von Bytes (> = 1) sind bis () Größe Bytes zu lesen.

Andere Tipps

Wenn Sie noch dieses Problem auftritt (Realisierung der Frage ist alt), und der Code korrekt, werden Sie Ihre VTIME und VMIN in der newtio Struktur Einstellung, und den Rest der anderen Parameter in der tio Struktur.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top