Обработка ошибок класса SerialPort Mono System.IO.Ports SerialPort

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

  •  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.");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top