سؤال

لقد كنا بصدد رؤوسنا من هذا الصباح. لدينا بعض Serial Lines Setup بين جهاز Linux المضمن ومربع Ubuntu. يتم الحصول على قراءاتنا لأن رمزنا عادة ما يعرج اثنين (في بعض الأحيان أكثر، في بعض الأحيان، واحد بالضبط واحد) يقرأ بدلا من رسالة واحدة قراءة للرسالة الفعلية المرسلة.

هنا هو الرمز الذي يفتح المنفذ التسلسلي. تم تعيين التبتر إلى 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;
}

تم تكوين الطرف الآخر بالمثل للتواصل، ويحتوي على قسم صغير واحد من Aesterest بشكل خاص:

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

الآن، عندما أقوم بتشغيل مؤشر ترابط القراءة على جهاز الاستقبال، عادة ما ينقسم "Hello World" عبر رسائل زوجين. هنا هو بعض الناتج العينة:

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

حيث الرقم الذي يتبعه القولون هو رسالة واحدة تلقتها. هل تستطيع أن ترى أي خطأ في صنعه؟

شكرا لك.

تحرير: من أجل الوضوح، يرجى الاطلاع القسم 3.2 من البرمجة التسلسلية Linux Howto. وبعد إلى أفهمي، مع VIntime من بضع ثوان (بمعنى VTATY يقع في أي مكان يتراوح بين 10 و 50، Trial-and-Error)، و VMIN من 1، يجب ألا يكون هناك سبب تفكيك الرسالة عبر رسالتين منفصلتين وبعد

هل كانت مفيدة؟

المحلول

لا أرى لماذا فوجئت.

أنت تسأل بايت واحد على الأقل. إذا طلب قراءةك () المزيد، والذي يبدو أنه من المحتمل لأنك فوجئت أنك لا تحصل على السلسلة بأكملها في قراءة واحدة، فيمكن أن تحصل على أي بيانات متوفرة حتى حجم القراءة (). ولكن جميع البيانات غير متوفرة في قراءة واحدة حتى يتم تقطيع سلسلة الخاص بك بين القراءات.

في هذا السيناريو، لا يهم الموقت حقا. لن يتم تعيين الموقت حتى يتوفر بايت واحد على الأقل. ولكن قمت بتعيين الحد الأدنى عند 1. لذلك إرجاع فقط أي عدد من البايتات (> = 1) متوفرة لقراءة () بحجم BYTES.

نصائح أخرى

إذا كنت لا تزال تعاني من هذه المشكلة (إدراك السؤال قديم)، فإن الكود الخاص بك دقيق، فأنت تحدد Ventty و VMIN في newtio بنية، وبقية المعلمات الأخرى في tio بنية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top