Question

Je suis en train de déboguer du code mono qui utilise le port série. À un moment donné, le mono écrit une table avec le code suivant:

   // 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 est une instance de SerialPort. Lorsque je trace ce code avec strace, voici ce que je pense être les appels système résultants:

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)

D'après ce que j'ai compris, la méthode SerialPort Write ne gère pas correctement le cas -EAGAIN et met à jour l'index de -1 avant de redémarrer l'écriture. car après chaque essai, le contenu du tampon d'origine est décalé d'un octet.

Ma question est la suivante: s'agit-il d'un problème connu et comment puis-je modifier la classe SerialPort afin qu'elle se comporte correctement ou utiliser le port série de manière bloquante?

Le documentation mono pour la classe SerialPort n'est pas très utile

Informations supplémentaires: sortie mono -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
Était-ce utile?

La solution

Pensez à passer à une version plus récente.

Le bogue a été corrigé ici. .

Autres conseils

J'ai une solution de contournement, mais je ne pense pas que ce soit une bonne solution:

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.");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top