2009-10-11 8 views
0

J'ai écrit un programme en .NET qui écoute un port série particulier et traite les données reçues. J'ai écrit un programme de test en utilisant com0com (l'émulateur Null-modem) et mon programme fonctionnait bien. Je l'ai même testé avec HyperTerminal et cela a semblé bien fonctionner aussi.
Cependant, lorsque j'ai interfacé le logiciel avec le périphérique d'origine (une sortie reçue d'un système de contrôle), les données reçues étaient brouillées. Il contenait des caractères spéciaux. Le même périphérique connecté à Hyper Terminal produit la sortie souhaitée. J'ai changé les vitesses de transmission, la parité, etc., mais les données reçues étaient le même ensemble de caractères parasites.
J'ai utilisé l'événement DataReceived du composant SerialPort et utilisé la ligne de code suivante pour capturer des données:
Réception de données non valides à partir du port série à l'aide de SerialPort.ReadExisting()

 string data = portRecieve.ReadExisting();

Quelqu'un peut-il me dire où suis-je manquais? Dans l'environnement actuel, la sortie du périphérique est directement connectée à une imprimante matricielle qui imprime tout ce qui est reçu sur le port. L'imprimante semble attraper ce qui est envoyé mais mon code ne peut pas.
Si vous avez déjà rencontré un scénario similaire, veuillez partager vos conclusions.
Merci

Répondre

1

Je pense aux raisons suivantes pour lesquelles les données peuvent apperar brouillées:

  • S'il y a une mauvaise connexion physique, vous pouvez parfois simplement obtenir des ordures (plutôt que rien du tout). Essayez de débrancher et de rebrancher les fils - et vérifiez que vous avez la bonne avance (par exemple avez-vous besoin d'un nullmodem?). Il semble que vous ayez couvert cela en vérifiant HyperTerminal.

  • Si la vitesse de transmission, bits d'arrêt, la parité ne sont pas correctes - semble que vous avez celui couvert

  • Vous essayez de recevoir les données sous forme de chaîne. Si elle n'est pas envoyée en texte brut, ou si votre encodage est incorrect, alors il pourrait facilement apparaître comme une poubelle. Essayez d'utiliser une réception binaire et examinez les données brutes que vous recevez. Cela vous dira si les données ne sont pas correctes ou si la conversion .net est en train de tout visser - éliminez l'intermédiaire!

+0

Oui, je vais maintenant experiement avec Binary Receive. – Burhan

2

Comment avez-vous

SerialPort.DiscardNull 
SerialPort.Encoding 

Et nous montrent peut-être un exemple des caractères spéciaux que vous recevez.

+0

DiscardNull est définie sur False
encoding est de définir les paramètres par défaut
les caractères reçus sont mélangés, quelques NUL-chr (0), certains chr (128). – Burhan

+0

Je suggère de laisser Discard off et d'expérimenter avec Encoding en premier. L'appareil pourrait-il envoyer l'UTF-8? –

0

Il me semble que l'appareil met l'imprimante dans un mode graphique spécial. Si c'est le cas, il y a probablement des séquences d'échappement dans les données envoyées à l'imprimante, c.-à-d. séquences de caractères statiques avec un caractère d'échappement (27, 0x1B). Dans ce cas, vous devrez consulter le manuel de l'imprimante pour voir ce que font les commandes. Vous pouvez également indiquer au périphérique d'utiliser une imprimante ASCII simple plutôt qu'une imprimante intelligente.

+0

L'imprimante est une imprimante matricielle Epson normale et l'impression ne semble pas être en mode graphique. (comme je peux voir la même sortie sur Hyperterminal) – Burhan

+0

Il est possible que Hyperterminal interprète les codes qui lui sont envoyés, et donc vous ne les voyez pas à l'écran. Ce dont nous avons vraiment besoin, c'est d'un exemple de taille moyenne des données reçues. –

Questions connexes