Обработка ошибок класса SerialPort Mono System.IO.Ports SerialPort
-
03-07-2019 - |
Вопрос
Я отлаживаю некоторый монокод, который использует последовательный порт.В какой-то момент mono запишет таблицу со следующим кодом :
// 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 - это экземпляр SerialPort.Однако, когда я отслеживаю этот код с помощью 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)
Насколько я понимаю, метод записи SerialPort неправильно обрабатывает регистр -EAGAIN и обновляет индекс на -1 перед перезапуском записи.потому что после каждой попытки содержимое исходного буфера сдвигается на один байт.
Мой вопрос в том, известна ли это проблема, и как я могу изменить класс SerialPort, чтобы он вел себя правильно, или использовать последовательный порт блокирующим способом?
Тот Самый Документация Mono для класса SerialPort это не очень полезно
Дополнительная информация :моноволновой выход:
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.");