مونو System.IO.Ports منفذ تسلسلي معالجة الأخطاء الطبقة

StackOverflow https://stackoverflow.com/questions/819515

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا تصحيح بعض التعليمات البرمجية أحادية يستخدم المنفذ التسلسلي. في مرحلة ما من أحادية إرسال جدول مع التعليمات البرمجية التالية:

   // Send the 1024 byte (256 word) CRC table

    progressBar = new ProgressBar();

    progressBar.Update(0.0,"Sending CRC table...");

    for (int i = 0; i < MyCRC.Length; i++)

    {

        MySP.Write(MyCRC[i].ToString("x8"));

        progressBar.Percent = (((Double)(i+1))/MyCRC.Length);

    }

    progressBar.Update(100.0,"CRC table sent.");

وMySP هو مثيل منفذ تسلسلي. عندما كنت تتبع هذه التعليمات البرمجية باستخدام strace ومع ذلك، وهنا هو ما أعتقد هي يدعو النظام الناتج:

16620 write(3, "3ab551ce", 8)           = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0003ab551c", 8)        = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0\0003ab551", 8)       = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0\0\0003ab55", 8)      = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\10\0\0\0003ab5", 8)    = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0\10\0\0\0003ab", 8)   = -1 EAGAIN (Resource temporarily unavailable)

...

16620 write(3, "\0005\0\230O+\10\0", 8) = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "E\0005\0\230O+\10", 8)  = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0E\0005\0\230O+", 8)   = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0\0E\0005\0\230O", 8)  = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0\0\0E\0005\0\230", 8) = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "4\0\0\0E\0005\0", 8)    = 8
16620 write(3, "\230O+\10\0\0\0\0", 8)  = 8
16620 write(3, "\0\0\0\0\10\0\0\0", 8)  = -1 EAGAIN (Resource temporarily unavailable)

وما أفهمه هو أن طريقة كتابة منفذ تسلسلي DOS لا يعالج -EAGAIN القضية بشكل صحيح ويستكمل المؤشر بنسبة -1 قبل إعادة الكتابة. لأنه بعد كل محاولة، يتم إزاحة محتويات المخزن المؤقت الأصلي بايت واحد.

وسؤالي هو، هل هو مشكلة معروفة، وكيف يمكنني تعديل فئة SerialPort بحيث يتصرف بشكل صحيح أو استخدام المنفذ التسلسلي بطريقة تمنع؟

الوثائق مونو ل في فئة SerialPort ليس مفيدا للغاية

معلومات إضافية: أحادية الناتج -V:

Mono JIT compiler version 1.2.6 (tarball)
Copyright (C) 2002-2007 Novell, Inc and Contributors. www.mono-project.com
    TLS:           __thread
    GC:            Included Boehm (with typed GC)
    SIGSEGV:       altstack
    Notifications: epoll
    Architecture:  x86
    Disabled:      none
هل كانت مفيدة؟

المحلول

والنظر في الترقية إلى الإصدار الأحدث.

تم إصلاح الخلل هنا .

نصائح أخرى

ولدي الحل، ولكن أنا لا أعتبر ذلك هو حل جيد:

progressBar = new ProgressBar();

progressBar.Update(0.0,"Sending CRC table...");

for (int i = 0; i < MyCRC.Length; i++)

{

    MySP.Write(MyCRC[i].ToString("x8"));
    while(WySP.BytesToWrite != 0)
    {
        ;
    }
    progressBar.Percent = (((Double)(i+1))/MyCRC.Length);

}

progressBar.Update(100.0,"CRC table sent.");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top