Comment puis-je la force d'un port série méthode d'écriture pour attendre que la ligne soit libre avant l'envoi de ses données?
Voici quelques informations sur ce que je suis en train de faire:
- Ouvrir un port série à partir d'un appareil mobile à une imprimante Bluetooth.
- Envoyer un EPL/2 forme de l'imprimante Bluetooth, de sorte qu'il comprend la façon de traiter les données, il est sur le point de recevoir.
- Une fois que le formulaire a été reçu, envoyer des données à l'imprimante qui sera imprimé sur les étiquettes.
- Répétez l'étape 3 autant de fois que nécessaire pour chaque étiquette à imprimer.
L'étape 2 n'arrive la première fois, depuis que le formulaire n'a pas besoin de les faire précéder chaque étiquette. Mon problème est que lorsque j'envoie le formulaire, si j'envoie les données d'étiquette trop rapidement, il ne sera pas imprimé. Parfois, je reçois "Bluetooth Échec: Radio Non-Opérationnel" est imprimé sur l'étiquette à la place des données que j'ai envoyé.
J'ai trouvé un moyen de contourner le problème en procédant comme suit:
for (int attempt = 0; attempt < 3; attempt++)
{
try
{
serialPort.Write(labelData);
break;
}
catch (TimeoutException ex)
{
//Log info or display info based on ex.Message
Thread.Sleep(3000);
}
}
Donc, fondamentalement, je peux prendre un TimeoutException et réessayer la méthode d'écriture après avoir attendu un certain temps (trois secondes semble fonctionner tout le temps, mais moins, et il me semble jeter l'exception chaque tentative). Après trois tentatives, je suppose simplement que le port série a quelque chose de mal et de laisser l'utilisateur de savoir.
De cette façon semble fonctionner ok, mais je suis sûr qu'il ya une meilleure façon de gérer cela. Il ya quelques propriétés dans la classe SerialPort que je pense que j'ai besoin, mais je ne peux pas vraiment trouver une bonne documentation et des exemples de la façon de les utiliser. J'ai essayé de jouer avec certaines propriétés, mais aucun d'entre eux semblent faire ce que je suis en train de réaliser.
Voici une liste des propriétés que j'ai joué avec:
- CDHolding
- CtsHolding
- DsrHolding
- DtrEnable
- Poignée de main
- RtsEnable
Je suis sûr que d'une combinaison de ces va gérer ce que je suis en train de faire plus en douceur.
Je suis à l'aide de C# (framework 2.0), une Zebra QL 220+ imprimante Bluetooth et un windows Mobile 6 appareil de poche, si cela fait toute la différence pour des solutions.
Toutes les suggestions seraient appréciées.
[Mise à JOUR]
Je tiens également à noter que l'appareil mobile est à l'aide de Bluetooth 2.0, alors que l'imprimante est seulement à la version 1.1. Je suis en supposant que la différence de vitesse est la cause de l'imprimante en retard dans la réception de données.
Il fut un temps... je me souviens juste qu'ils ont recommandé de contrôle de flux logiciel, qui nous avait déjà déterminé que la meilleure approche. Je ne vous en souvenez pas de mentionner la limitation de la vitesse de transmission ou quelque chose le long de ces lignes.
OriginalL'auteur Jason Down | 2008-10-21
Vous devez vous connecter pour publier un commentaire.
Le contrôle de flux est la bonne réponse ici, et il ne peut pas être présent/mise en œuvre/appliquer à votre connexion bluetooth.
Découvrez le Zèbre de spécification et de voir si ils mettent en œuvre, ou si vous pouvez le mettre sous contrôle de flux logiciel (xon, xoff) qui vous permettent de voir quand les différents tampons sont presque pleins.
En outre, la radio bluetooth est rare d'être capable de transmettre plus rapidement que 250k au maximum. Vous pourriez envisager de la limitation artificielle à 9 600 bps - cela permettra à la radio, beaucoup d'espace de respiration pour les retransmet, la correction d'erreurs de détection, et de son propre contrôle de flux.
Si tout le reste échoue, le hack que vous utilisez en ce moment, ce n'est pas mauvais, mais je dirais Zebra de support technique et de savoir ce qu'ils recommandent, avant de céder.
-Adam
OriginalL'auteur Adam Davis
Eh bien, je ai trouvé un moyen de le faire en se fondant sur les deux suggestions déjà donné. J'ai besoin de configurer mon port série de l'objet avec le texte suivant:
Ensuite, j'ai juste besoin de faire l'appel d'écriture:
Depuis le Zebra imprimante prend en charge le contrôle de flux logiciel, il envoie un XOff valeur de l'appareil mobile lorsque la mémoire est presque pleine. Cela provoque l'appareil mobile à attendre un XOn valeur à envoyer à partir de l'imprimante, efficacement notifier l'appareil mobile qu'il peut continuer à transmettre.
Par le réglage de la durée d'écriture bien, je suis en train de donner un temps prévu pour la transmission avant d'écrire un délai exception est levée. Vous le voulez attraper l'écriture délai d'attente, comme je l'avais fait dans mon exemple de code dans la question. Cependant, il ne serait pas nécessaire de la boucle 3 (ou une quantité arbitraire de) fois, en essayant d'écrire à chaque fois, depuis le contrôle de flux logiciel permettrait de démarrer et d'arrêter le port série d'écrire transmission.
OriginalL'auteur Jason Down
Le problème est probablement pas avec le port série de code, mais avec le sous-jacent pile bluetooth. Le port que vous utilisez est purement virtuel, et il est peu probable que l'établissement de la liaison est mis en œuvre (comme elle le serait en grande partie vide de sens). CTS/RTS DTR/DSR sont tout simplement non-applicable pour quoi vous travaillez.
La question sous-jacente est que lorsque vous créez le port virtuel, dessous a à se lier à la pile bluetooth et connectez-le jumelé de série de l'appareil. Le port lui-même n'a aucune idée de combien de temps cela pourrait prendre et c'est probablement mis en place pour ce faire de manière asynchrone (même si ce serait purement à l'appareil OEM comment c'est fait) pour empêcher l'appelant de verrouillage en place pour une longue période si l'on est pas jumelé appareil ou l'appareil couplé est hors de portée.
Alors que votre code peut se sentir comme un hack, c'est probablement le meilleur, le plus portable moyen de faire ce que vous faites.
Vous pouvez utiliser une pile bluetooth API pour essayer de voir si l'appareil est là et en vie avant de se connecter, mais il n'y a pas de standardisation de la pile d'Api, de sorte que le Widcom et APIs Microsoft diffèrent sur comment vous pouvez le faire, et Widcom est propriétaire et coûteux. Ce que vous souhaitez retrouver avec un désordre d'essayer de découvrir le type de pile, chargement dynamique d'un approprié de vérificateur de la classe, de l'avoir d'appel de la pile et l'apparence de l'appareil. À la lumière de cela, votre simple sondage semble beaucoup plus propre, et vous n'avez pas à débourser quelques milliers de dollars pour la Widcom SDK.
Cela pourrait expliquer pourquoi, à l'aide de toute la clair à envoyer, demande à envoyer option ne semble avoir aucun effet.
Faire du développement mobile pendant un certain temps et vous aurez tendance à recueillir plusieurs "quand est-ce un hack pas réellement un "hack" de bits. En fait, vous aurez probablement de créer une petite bibliothèque. C'est une de ces choses qui rend la conviction que le développement de postes de travail et de développement de périphériques sont même assez bien non valide
ctacke - j'ai remarqué un certain nombre de problèmes en essayant de code de port à partir d'une application de bureau sur une application mobile. Il semble que le Compact Framework n'a jamais qu'une méthode ou une propriété dont vous avez besoin pour un objet, alors qu'il est disponible à la régulière .NET framework. Grrrr.
OriginalL'auteur ctacke