Comment puis-je utiliser dataReceived cas de la SerialPort Port de l'Objet en C#?
Je cherche à créer une petite application qui permet de recueillir des données reçues à partir d'un capteur externe attaché à COM10. J'ai réussi à créer un petit C# console objet et l'application qui ouvre le port et les flux de données dans un fichier pour une période de temps déterminée à l'aide d'une boucle for.
Je voudrais le convertir cette application pour utiliser le dataReceived événement pour diffuser à la place. Après la lecture de la Top 5 Des SerialPort Conseils, je ne peux toujours pas semblent travail et ne sais pas ce que je suis absent. J'ai réécrit la console de l'application, de sorte que tout le code est dans la main et il est collé ci-dessous. Quelqu'un peut-il aider s'il vous plaît m'éclairer sur le pourquoi de la gestionnaire d'événement port_OnReceiveDatazz n'est pas appelée, même si je sais qu'il y a de données envoyées vers le port par le matériel?
Grâce
Azim
PS: Merci à @Gabe, @Jason Bas, et @abatishchev pour toutes les suggestions. Je suis perplexe et ne pouvez pas sembler obtenir le gestionnaire d'événement à travailler. Peut-être qu'il a quelque chose à voir avec l'appareil. Je peux vivre avec, juste la lecture du port dans un thread et streaming les données directement dans un fichier.
Code
namespace serialPortCollection
{ class Program
{
static void Main(string[] args)
{
const int bufSize = 2048;
Byte[] buf = new Byte[bufSize]; //To store the received data.
SerialPort sp = new SerialPort("COM10", 115200);
sp.DataReceived += port_OnReceiveDatazz; //Add DataReceived Event Handler
sp.Open();
sp.WriteLine("$"); //Command to start Data Stream
//Wait for data or user input to continue.
Console.ReadLine();
sp.WriteLine("!"); //Stop Data Stream Command
sp.Close();
}
//My Event Handler Method
private static void port_OnReceiveDatazz(object sender,
SerialDataReceivedEventArgs e)
{
SerialPort spL = (SerialPort) sender;
const int bufSize = 12;
Byte[] buf = new Byte[bufSize];
Console.WriteLine("DATA RECEIVED!");
Console.WriteLine(spL.Read(buf, 0, bufSize));
}
}
}
- Qu'est-ce exactement ne fonctionne pas?
- B: Le gestionnaire d'événement n'est jamais appelée, même si la réception de données.
Vous devez vous connecter pour publier un commentaire.
je pense que votre problème est la ligne:**sp.DataReceived += port_OnReceiveDatazz;ne devrait-elle pas être:sp.DataReceived += new SerialDataReceivedEventHandler (port_OnReceiveDatazz);**Nevermind, la syntaxe est très bien (n'a pas à réaliser le raccourci à l'époque, j'ai d'abord répondu à cette question).
J'ai aussi vu des suggestions que vous devez activer les options suivantes pour votre port série:
Vous pouvez également définir la poignée de main à RequestToSend (par l'intermédiaire de la poignée de main de l'énumération).
Mise à JOUR:
Trouvé une suggestion qui vous dit que vous devez ouvrir votre port d'abord, puis affectez le gestionnaire d'événement. C'est peut-être un bug?
Ainsi, au lieu de cela:
Ce faire:
Laissez-moi savoir comment ça se passe.
Tout d'abord je vous conseille d'utiliser le constructeur suivant à la place de celle que vous utilisez actuellement:
Prochaine, vous devriez vraiment supprimer ce code:
Et à la place de la boucle jusqu'à ce que l'utilisateur appuie sur une touche ou quelque chose comme:
Notez également que les révisions des données reçues gestionnaire d'événements, il faut effectivement imprimer le tampon maintenant.
Mise à JOUR de 1
J'ai juste couru le code suivant avec succès sur ma machine (à l'aide d'un câble null-modem entre COM33 et COM34)
Mise à JOUR 2
Compte tenu de tout le trafic sur cette question récemment. Je commence à soupçonner que soit votre port série n'est pas configuré correctement, ou que l'appareil ne répond pas.
Je vous recommande fortement d'essayer de communiquer avec l'appareil à l'aide d'un autre moyen (j'ai utiliser hyperterminal fréquemment). Vous pouvez ensuite jouer avec tous ces paramètres (débit, parité, bits de données, bits d'arrêt, contrôle de flux) jusqu'à ce que vous trouver le jeu qui fonctionne. La documentation de l'appareil doit également spécifier ces paramètres. Une fois j'ai pensé à ceux, je voudrais m'assurer que mes .NET SerialPort est correctement configuré pour l'utilisation de ces paramètres.
Quelques conseils sur la configuration du port série:
Noter que quand j'ai dit que vous devez utiliser le constructeur suivant, je voulais dire que l'utilisation de cette fonction, et non pas nécessairement celles de paramètres! Vous devez renseigner les paramètres de votre appareil, les paramètres ci-dessous sont communs, mais peuvent être différentes de votre appareil.
Il est également important que vous configurez le .NET SerialPort d'utiliser le même contrôle de flux sur votre appareil (comme d'autres personnes l'ont dit plus tôt). Vous pouvez trouver plus d'infos ici:
http://www.lammertbies.nl/comm/info/RS-232_flow_control.html
J'ai eu le même problème avec un modem qui avait déjà travaillé et puis un jour, juste cessé d'élever la DataReceived événement.
La solution dans mon cas, très au hasard, était de permettre à la RTS par exemple
Aucune idée de la raison qui a travaillé sur ce bit particulier de kit (pas un comms homme du tout en fait), ni pourquoi il avait travaillé et s'est ensuite arrêté, mais il peut aider quelqu'un d'autre un jour en train de poster juste au cas où...
Par la manière, vous pouvez utiliser le code suivant vous de gestionnaire d'événement:
Je crois que cela ne marchera pas, parce que vous êtes à l'aide d'une application de console et il n'y a pas de Boucle d'Événement en cours d'exécution. Une Boucle d'Événement /Pompe de Message utilisé pour la gestion des événements est configuré automatiquement lorsqu'une application Winforms est créé, mais pas pour une application console.
Pourrait très bien être le
Console.ReadLine
blocage de votre rappel deConsole.Writeline
, en fait. L'échantillon sur MSDN est PRESQUE identique, sauf qu'ils utilisent ReadKey (qui n'a pas de verrouillage de la console).Être conscient qu'il ya des problèmes à l'aide .NET/C# et tout COM de port plus élevés que COM9.
Voir: HOWTO: Spécifier les Ports Série de Plus de COM9
Il y a une solution sous la forme: "\\.\COM10" qui est pris en charge dans le sous-jacent CreateFile méthode, mais .NET empêche à l'aide de cette solution de contournement format; ni le SerialPort constructeur, ni le nom de port de la propriété permettra à un port d'un nom qui commence par "\"
J'ai eu du mal à obtenir des communications fiables à COM10 en C#/.NET. Par exemple, si j'ai un appareil sur COM9 et COM10, le trafic destiné à COM10 va à l'appareil sur COM9! Si je supprime le périphérique sur COM9, COM10 trafic va à l'appareil sur COM10.
Je n'ai toujours pas compris comment utiliser le handle retourné par CreateFile pour créer un C#/.Style NET SerialPort objet, si je savais comment faire, alors je pense que je pourrais utiliser COM10+ l'amende juste à partir de C#.