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:

  1. Ouvrir un port série à partir d'un appareil mobile à une imprimante Bluetooth.
  2. 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.
  3. Une fois que le formulaire a été reçu, envoyer des données à l'imprimante qui sera imprimé sur les étiquettes.
  4. 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.

Jason, avez-vous contacté le Zèbre, et qu'ont-ils dit? Je suis curieux de savoir comment cette histoire s'est avéré...
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