6
votes

.NET SERIALPORT DataReceved Evénement non licenciée

J'ai une application de test WPF pour évaluer la communication de ports série basée sur des événements (vs interrogation du port série). Le problème est que l'événement DataReceved ne semble pas tirer du tout.

J'ai un formulaire WPF très basique avec une zone de texte pour l'entrée de l'utilisateur, une textblock pour la sortie et un bouton pour écrire l'entrée sur le port série. . P>

Voici le code: P>

class Program
{
    static SerialPort port;

    static void Main(string[] args)
    {
        port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
        port.DataReceived +=
            new SerialDataReceivedEventHandler(port_DataReceived);
        port.Open();

        string text;
        do
        {
            text = Console.ReadLine();
            port.Write(text + "\r\n");
        }
        while (text.ToLower() != "q");
    }

    public static void port_DataReceived(object sender,
        SerialDataReceivedEventArgs args)
    {
        string text = port.ReadExisting();
        Console.WriteLine("received: " + text);
    }
}


0 commentaires

9 Réponses :


3
votes

Je ne peux pas dire à coup sûr, mais il pourrait y avoir un problème de threading. WPF gère la filetage différemment et l'interrogation du port virtuel est asynchrone, je crois. Avez-vous essayé cela avec une application de formulaires ou de console Windows pour prouver que cela peut fonctionner du tout?


1 commentaires

Voir la version de la console ci-dessus. Pas de chance.



3
votes

J'utilise exactement la même configuration, cela fonctionne parfaitement maintenant mais devait résoudre beaucoup de problèmes à y arriver.

Voici pourquoi ma déclaration initiale ressemble à: p>

System.IO.Ports.SerialPort.GetPortNames()


3 commentaires

Après votre édition, je vois que vous avez élaboré des kinks, mais vous avez mentionné cela «et à travers une étrangeté de la classe Serialport, une instance d'un port série ne peut pas être à la fois l'expéditeur et le récepteur» Ce n'est pas vrai. La classe Serialport peut être à la fois l'expéditeur et le récepteur. Depuis que vous indiquez que les choses semblent entraîner d'une manière ou d'une autre, je ne vais pas élaborer :)


Eh bien, cela sonne définitivement comme l'étrangeté n'est pas dans la classe Serialport, mais dans le couplage avec le logiciel de port série virtuel.


+1 - Réglage de la broche RTS sur Activé était quelque chose que j'ai oublié. J'ai oublié le contrôle du flux matériel.



-1
votes

Je ne peux que supposer que le problème était en effet avec le programme d'émulateur de port série virtuel. Cela ne veut pas dire qu'il y a un problème avec ce logiciel: VSPE a très bien fonctionné pour moi jusqu'à présent. Mais il y avait un conflit entre mon code et comment j'avais configuré le connecteur VSPE.


0 commentaires

0
votes

J'ai eu un problème similaire lors de l'exécution d'un tel pilote d'un formulaire, bien qu'aucun vspe n'est juste une simple SP. Croyez que c'était un problème de modèle STA comme évoluant pour l'inclure dans une application de console suffisamment fixe.


0 commentaires

0
votes

J'utilise aussi vspe! Cela fonctionne merveilleusement .. J'avais ce même problème et la façon dont j'ai réparé qu'il s'agissait de faire passer les deux ports Com dans VSPE au lieu de simplement créer deux ports virtuels


0 commentaires

0
votes

J'ai rencontré un problème similaire récemment, mais seulement sur certaines machines. Comme Dave Swersky a noté, cela peut être un problème de threading, surtout si vous exécutez sous .NET 4.0 ou plus tard .

in .NET 4.0 Le gestionnaire d'événements est déclenché sur un thread threadpool, et dans certaines circonstances, il peut y avoir un retard substantiel avant qui se produit. (Dans mon code, qui fonctionnait parfaitement sous .NET 2.0, des problèmes ont été observés dès que nous avons mis à niveau vers .net 4.5. Le gestionnaire d'événements serait souvent déclenché beaucoup plus tard que prévu, et parfois, il ne serait pas déclenché à Tout!)

appeler threadpool.setminthreads (. ..) avec une plus grande valeur pour les threads d'achèvement rendus le problème disparaissant aussi rapidement qu'il est arrivé. Dans le contexte de notre application threadpool.setminthreads (2, 4) était suffisant. Sur les machines où le problème a été observé, les valeurs par défaut (comme obtenues en appelant threadpool.setminthreads ) étaient tous deux 2.


0 commentaires

19
votes
port.DtrEnable = true;
This solved it for me, the DataTransmitReady flag was not enabled, so no data was received.

2 commentaires

Cela a également travaillé pour moi aussi bien après 5 heures de message avec un équilibre connecté à une tablette. L'équilibre d'une entreprise (OHAUS) communiquait bien sans cette ligne, le prochain équilibre de la société (Sartorius) n'était pas.


Souvent le pilote USB ADAFRUIT SAMD51 ARDUINO ARDUINING A BESOIN DTRENABLE SET afin de travailler. Merci pour la pointe (six ans plus tard)!



0
votes

Il y a deux jours, j'ai eu le même problème et c'était un gros mal de tête parce que j'avais besoin de livrer l'application aujourd'hui. Alors .. Après trop de Googleashion, j'ai supposé que la question était une autre chose et non mon code.

Ma solution était Désinstallation McAfee antivirus et toutes choses liées avec cela. Lorsque j'ai vu les journaux de McAfee, il avait enregistré des enregistrements sur les threads d'arrêt et j'ai supposé que le SerialDataReceiveDeventHandler () est exécuté dans un fil.

J'espère que cette solution fonctionne pour vous. Cordialement.


0 commentaires

0
votes

J'utilise le pilote de port série virtuel. Ce problème me prend toute la journée. Et enfin correctement en créant une paire de port. Un port Envoyer un message et un autre message de réception au lieu d'utiliser le même port pour envoyer et recevoir un message. Je suppose que c'est ainsi que Null Modem Emulator fonctionne. XXX

Résultat: Donnée reçue: Bonjour le monde Appuyez sur n'importe quelle touche pour continuer ...


1 commentaires

Pouvez-vous être plus précis sur votre réponse? Comme coller le morceau de code ou des captures d'écran de la configuration?