私がやろうとしていることの背景は次のとおりです。
- モバイル デバイスから Bluetooth プリンターへのシリアル ポートを開きます。
- EPL/2 フォームを Bluetooth プリンターに送信して、受信しようとしているデータの処理方法をプリンターが理解できるようにします。
- フォームが受信されたら、ラベル ストックに印刷されるデータをプリンターに送信します。
- 印刷するラベルごとに、手順 3 を必要な回数繰り返します。
ステップ 2 は、フォームが各ラベルの前にある必要がないため、初回のみ発生します。私の問題は、フォームを送信するときに、ラベル データを送信する速度が速すぎると印刷されないことです。送信したデータの代わりに、ラベルに「Bluetooth エラー: 無線が動作しません」と印刷されることがあります。
次のようにして、この問題を回避する方法を見つけました。
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);
}
}
したがって、基本的には、TimeoutException をキャッチし、一定時間待機した後に書き込みメソッドを再試行できます (3 秒は常に機能しているように見えますが、3 秒未満で、試行ごとに例外がスローされるようです)。3回試行した後、シリアルポートに問題があると想定し、ユーザーに知らせました。
この方法はうまくいくようですが、これを処理するためのより良い方法があると確信しています。SerialPort クラスには、使用する必要があると思われるプロパティがいくつかありますが、適切なドキュメントや使用方法の例が実際には見つかりません。いくつかのプロパティをいじってみましたが、どれも私が達成しようとしていることをしていないようです。
私が遊んだプロパティのリストは次のとおりです。
- CD保有
- CtsHolding
- DsrHolding
- DtrEnable
- ハンドシェーク
- RtsEnable
これらのいくつかの組み合わせが、私がやろうとしていることをより優雅に処理できると確信しています。
私は C# (2.0 フレームワーク)、Zebra QL 220+ Bluetooth プリンター、および Windows Mobile 6 ハンドヘルド デバイスを使用していますが、それによってソリューションに違いが生じる場合があります。
任意の提案をいただければ幸いです。
[アップデート]
また、モバイル デバイスは Bluetooth 2.0 を使用しているのに対し、プリンターはバージョン 1.1 のみであることにも注意してください。速度の違いが原因で、プリンターがデータの受信に遅れをとっていると思います。