J'utilise un programme qui parle à mon port COMM, mais j'ai fait un autre programme que je veux "renifler" les messages du port de communication et effectuer ses propres actions contre ces messages en plus. Est-ce possible dans .NET C#?En C#, comment puis-je écouter un port COM (série) déjà ouvert?
Répondre
Il existe des bibliothèques/outils/produits tiers qui exposent le trafic qui vous intéresse.
Voici un je pour l'émulation du port série - mais je pense qu'il offre quelque chose que vous pouvez utiliser: http://com0com.sourceforge.net/
Il est possible de renifler le trafic du port série
Cependant, il ne marche pas semblent être un « COMPortSniffer » contrôle
Une technique valide utilisée par Sysinternals est présenté there
Il semble compter sur la programmation Win32 cependant, je ne pense pas qu'une telle chose est possible directement avec C#
Si vous avez le contrôle sur le premier programme qui vous parle COMM port, pourquoi ne pas changer le programme pour transmettre les données reçues du port au 2e programme à vous par l'intermédiaire de la communication à distance ou de tout autre type d'IPC. Mieux encore si vous pouvez écrire un programme proxy connecté au port COMM, et que 2 de l'autre programme parlent à ce proxy pour que la communication soit faite. Une autre idée est, si vous avez besoin de renifler uniquement les données entrantes, vous pouvez obtenir un câble en Y (séparateur) et vous connecter au port COMM 2, chaque programme se connecte à chaque port COMM. Mais vous devez vous assurer que le 2ème programme n'essaie pas de transmettre. Dans certains cas, vous pourriez avoir besoin d'un séparateur qui ne connecte que la broche RX pour la 2e sortie. Faites-moi savoir si vous avez besoin du diagramme.
Si vous n'avez pas 2 COMM, vous pouvez facilement obtenir un convertisseur USB-série pour moins de USD10.
le projet de code (http://www.codeproject.com/Articles/75770/Basic-serial-port-listening-application) qui a un excellent tutoriel à ce sujet.
Il montre comment lire les données provenant d'un port série, et à partir de ce que vous devriez être capable de lire les données.
Un court extrait:
void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int dataLength = _serialPort.BytesToRead;
byte[] data = new byte[dataLength];
int nbrDataRead = _serialPort.Read(data, 0, dataLength);
if (nbrDataRead == 0)
return;
// Send data to whom ever interested
if (NewSerialDataRecieved != null)
NewSerialDataRecieved(this, new SerialDataEventArgs(data));
}
Dans ce cas, vous devez avoir le contrôle sur le code source primaire des consommateurs pour publier les données de lecture. Il ne renifle pas une communication sérielle établie. – sahl04