Question

Nous avons Bashing nos têtes hors de celui-ci toute la matinée. Nous avons une configuration série de lignes entre un dispositif de Linux embarqué et une boîte Ubuntu. Notre lit OBTIENNENT foiré parce que notre code renvoie généralement deux (parfois plus, parfois exactement un) lit un message au lieu d'un message lu par message réel envoyé.

Voici le code qui ouvre le port série. InterCharTime est réglé à 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'autre extrémité est configurée de manière similaire pour la communication, et a une petite section de iterest particulier:

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

Maintenant, quand je lance un fil de lecture sur la machine de réception, « Bonjour tout le monde » est généralement réparti en plus d'un message de couple. Voici quelques exemple de sortie:

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

où un message de recieved numéro suivi de deux points. Pouvez-vous voir une erreur que nous faisons?

Merci.

Edit: Pour plus de clarté, s'il vous plaît voir section 3.2 de la programmation série Linux HOWTO . À ma connaissance, avec un VTIME de quelques secondes (ce qui signifie VTIME est fixé entre 10 et 50, d'essais et d'erreurs), et un VMIN de 1, il devrait y avoir aucune raison que le message est divisé sur deux messages séparés .

Était-ce utile?

La solution

Je ne vois pas pourquoi vous êtes surpris.

Vous demandez au moins un octet. Si votre lecture () demande plus, ce qui semble probable puisque vous êtes surpris vous ne recevez pas la chaîne entière en une seule lecture, il peut obtenir ce que les données sont disponibles jusqu'à la taille de lecture (). Mais toutes les données ne sont pas disponibles dans une lecture unique de sorte que votre chaîne est coupée entre lit.

la minuterie n'a pas d'importance dans ce scénario. La minuterie ne sera pas réglée jusqu'à au moins un octet est disponible. Mais vous avez défini le minimum à 1. Il revient juste ce nombre d'octets (> = 1) sont disponibles à lire () octets de taille.

Autres conseils

Si vous rencontrez toujours ce problème (la réalisation de la question est vieux), et votre code est précis, vous définissez votre VTIME et VMIN dans le struct newtio, et le reste des autres paramètres du struct tio.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top