2009-12-04 8 views
0

J'ai un programme qui envoie des commandes ASCII à un périphérique via un port série. Le programme est une démo et ne fait pas ce que je veux. J'essaye juste de faire en sorte que l'appareil réponde en C# et je ne reçois rien en retour. tous les paramètres du port série sont corrects. J'envoie exactement le même message que le logiciel de démonstration.C# problème de protocole ascii

//e.g message <STX>ABC<EOT> 

byte[] msg = new byte[5]; 

msg[0] = 0x02; 
msg[1] = 0x41; 
msg[2] = 0x42; 
msg[3] = 0x43; 
msg[4] = 0x04; 
comport.write(msg, 0,msg.length) 

le périphérique est un moniteur. Le code était seulement un exemple. il n'y a pas un battement de coeur juste une réponse pour un message correct envoyé ou un message d'erreur. les paramètres sont standard 9600-8-N-1. "trombone entre les broches 2 et 3 (TX et RX)." Oui, je sais que le câble fonctionne parce que c'est le même que celui utilisé avec le logiciel du produit qui fonctionne. et je récupère ce que j'envoie. J'ai utilisé un programme de com virtuel et tout semble aller bien. "6 octets mais en initialisant seulement le premier 5." faute de frappe.

les propriétés SerialPort.DtrEnable et RtsEnable à true. sont activés par défaut dans C#. J'ai essayé le terminal hyper et je n'ai pas de réponse non plus. J'ai envoyé \ r et \ n sans aucune chance.

+3

Trop vague. Quel est l'appareil? Quelle est la source de la démo? L'appareil possède-t-il des voyants d'état ou d'autres indicateurs de ce type pour signaler qu'il reçoit l'entrée que vous pensez lui envoyer? Etc. – jason

+3

Quel est l'appareil? Quel est le protocole exactement? Qu'est-ce qui est supposé être retourné? Que dit la documentation de l'appareil? En d'autres termes, besoin de plus d'informations. –

+0

Ceci ne contient aucune information pouvant aider à diagnostiquer le problème ... Quel est le type de 'comport' et comment a-t-il été initialisé? Comment savez-vous que les paramètres du port série sont corrects? –

Répondre

2

Cette C# Tutorial on Serial Port Communication devrait pouvoir aider. Je ne suis pas sûr s'il y a une caste intrinsèque appropriée entre Hex et Byte à travers l'assignation en C#. Cela peut être la source de votre problème.

Appareil Heartbeat

Est-ce que l'appareil envoie une réponse DC2 ou DLE (rythme cardiaque)? Si c'est le cas, essayez d'ouvrir un port COM dans Hyperterminal en utilisant les paramètres 9600-8-N-1 de base et voyez si vous obtenez quoi que ce soit. Y at-il des commandes STX, SYN, ETX renvoyées lorsque vous essayez d'envoyer une commande? Je ne suis pas sûr de l'implémentation du jeu de commandes pour le matériel avec lequel vous essayez de communiquer.

Vérification du port COM Opération

Avez-vous vérifié si votre port COM fonctionne correctement? Vous pouvez créer un bouclage en insérant un trombone entre les broches 2 et 3 (TX et RX). Cela va boucler votre port COM et dans Hyper Terminal, vous pouvez ouvrir ce port COM et tapez. Les personnages vont revenir en écho.

Vous pouvez également utiliser un logiciel appelé com0com pour créer des ports COM virtuels afin de tester ce que vous envoyez avant de l'envoyer.

Il fournit des paires de ports COM virtuels qui sont liés via une connexion nullmodem. Vous pouvez ensuite utiliser votre application de terminal préférée ou tout ce que vous voulez envoyer des données à un port COM et recevoir de l'autre

Sans plus d'informations spécifiques, nous serons en paille.

1

Vous allouons et l'envoi de 6 octets, mais l'initialisation que la première 5.

En outre, selon ce que vous écrivez, vous faites tout correctement, exactement comme le programme de démonstration. Droite? Ensuite, je ne vois qu'une seule solution: l'appareil tire votre jambe! Sérieusement: Si un programme fonctionne et que ce n'est pas le cas, il doit y avoir une différence.

+0

Je dirais que "l'allocation de 6 octets mais l'initialisation de seulement 5" est le premier problème à résoudre; le périphérique peut interpréter tous les six octets comme le message et décider qu'il est invalide. – qid

+0

Bien sûr que non, il est donné 'msg.Length', qui sera 6, donc il va envoyer 6 octets quelles que soient leurs valeurs. –

+0

EOT indiquera la fin du message .. reste est garbage. Tout appareil digne de ce poids ignorera le reste. –

1

De loin, l'erreur la plus commune est d'oublier d'activer les signaux de prise de contact matérielle. L'appareil n'enverra rien s'il pense que l'hôte est éteint. Assurez-vous de définir les propriétés SerialPort.DtrEnable et RtsEnable sur true.

Comme mentionné précédemment, fixez la taille du tableau. Bien que cela ne va probablement pas aider, le caractère STX assure que les déchets sont jetés.

Vérifiez si le matériel de base est compatible avec l'applet Windows Hyperterminal. Vous pouvez envoyer le message que vous essayez de transmettre en tapant Ctrl + B, ABC, Ctrl + D

0

Comme d'autres l'ont suggéré, il est judicieux de vérifier ce qui est envoyé et reçu avec un logiciel de terminal. J'ai eu du succès avec "realterm" - il a de jolis affichages de vues ascii ou binaires/hexadécimales.

0

Étant donné que vous travaillez avec ASCII, un autre problème peut être que vous n'émettez pas le caractère de fin de ligne correct. Certains appareils attendent \r et d'autres \n. Assurez-vous que vous définissez correctement.

+0

Je vois ce que vous voulez dire, mais avec EOT vous n'en avez pas besoin. –

+0

Je vais vous croire sur parole. Je sais que certains des périphériques que j'ai utilisés nécessitaient que le caractère de leur analyse interne des commandes fonctionne correctement. –

+0

@Erich: Je l'ai vu sur les lecteurs de balayage où ils envoient un CR-LF pour chaque balayage (que vous analyser pour voir la fin de la ligne), mais je n'ai jamais eu à l'envoyer à aucun périphérique (imprimantes de reçus, , caché lecteurs de cartes, etc). YMMV –

0

le périphérique est un moniteur. Le code était seulement un exemple. il n'y a pas un battement de coeur juste une réponse pour un message correct envoyé ou un message d'erreur. les paramètres sont standard 9600-8-N-1. "trombone entre les broches 2 et 3 (TX et RX)." Oui, je sais que le câble fonctionne parce que c'est le même que celui utilisé avec le logiciel du produit qui fonctionne. et je récupère ce que j'envoie. J'ai utilisé un programme de com virtuel et tout semble aller bien. "6 octets mais en initialisant seulement le premier 5." Désolé typo.

les propriétés SerialPort.DtrEnable et RtsEnable à true. sont activés par défaut dans C#. J'ai essayé le terminal hyper et je n'ai pas de réponse non plus. J'ai envoyé \ r et \ n sans succès.