مونو System.IO.Ports منفذ تسلسلي معالجة الأخطاء الطبقة
-
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.");