2

標準のレシート プリンターをスニッフィングしている COM ポートからデータを読み取ろうとしています。docsSerialPort.DataReceivedで見つかったイベントに関して、MSDN の例を使用しています。

データを取得していますが、文字化けしています。それを読みやすいテキストに変換するにはどうすればよいですか?エンコードされたバイナリか何かですか?この種のシリアル ポート プログラミングに関する洞察を提供していただけますか?

インターネットで何時間も検索して、読みやすいテキストにする方法を見つけようとしましたが、A と B の間のどこかにいくつかの概念がありません。

ここに画像の説明を入力

プロトコルが一致していない可能性があることをどこかで読んだことがあります。これを検出する方法はありますか?

更新 1

ここStackOverflowで見つけたスレッドから何か新しいことを試しています(Update 1を使用しました)。今何を見ているのかわかりませんが、奇妙な文字はもうありません:

ここに画像の説明を入力

では、ここから読みやすいテキストを取得するにはどうすればよいでしょうか。

更新 2

私はまだ少し混乱しています。

ここに画像の説明を入力

  private static void port_OnReceiveDatazz(object sender,
                              SerialDataReceivedEventArgs e)
   {
       SerialPort spL = (SerialPort)sender;
       byte[] buf = new byte[spL.BytesToRead];
       Console.WriteLine("DATA RECEIVED!");
       spL.Read(buf, 0, buf.Length);
       Console.WriteLine(Convert.ToBase64String(buf));
       foreach (Byte b in buf)
       {
           //Console.Write(b.ToString());
       }
       Console.WriteLine();
   }
4

2 に答える 2

2

ええ、あなたは多くのバイトを取得しています。注意を払うと、ASCII番号が取得されます。5 0、6 5 などはデータのヘッダーです。

まず第一に、プロトコルを知る必要がありますが、それを「読み取り」たい場合は、ToString ではなく変換する必要があります。次を使用する必要があります。

 Convert.ToBase64String(bytes)
于 2012-08-09T13:16:57.033 に答える
0

同じメーカーであっても、これらのデバイスはモデル間で機能が異なる傾向があるため、「標準」のレシートプリンターなどがあるかどうかはわかりません。これらのデバイスは、メーカー間で最も確実に異なります。

ほとんどのレシートに印刷されている限られた文字セットを表現するために、レシートプリンターがバイトを必要とする可能性はほとんどありません。いくつかの通貨記号、文字、数字、いくつかの句読文字、およびいくつかの制御情報は、これらがASCII(7ビット)にうまく適合することを意味します。

製造元のWebサイトがある場合は実際にアクセスし、技術マニュアルまたはプロトコルガイドが利用可能な場合はダウンロードする必要があります。すべてのメーカーがこの情報をオンラインで入手できるわけではないため、これはしばしば非常に注意が必要です。直接連絡して、プロトコル仕様のコピーをファックスまたは郵送する必要がある場合があります。

データには繰り返し文字のブロックがあります。これらは、別の情報ブロックが送信されているか、新しい行が必要であることをプリンターに通知するデータである可能性があります。これらは、データ行の最初または最後に発生する可能性があります。たとえば、プリントヘッドを印刷行の先頭に戻し、用紙をスクロールするようにプリンタに指示する場合があります。これは、実際にはデバイスのCR/LF指示です。

このタイプのものはデバイスに依存し、デバイスの仕様で詳細がわかります。あなたがおそらく推測できることは、これはあなたが印刷するように求めた情報ではないということです。

プロトコルドキュメントを入手できない場合は、古き良き探偵の仕事だけに頼ることができます。

iThermは、バイト内のESC文字(27)に続く1つ以上のASCII文字を使用して、さまざまなアクションを実行していると言えます。詳細については、62ページから始まるURLのプログラマーガイドを参照してください 。http://www.transact-tech.com/tsg/downloads/28-04430%20Rev%20K%20-%20Insert-M280%20POS% 20Programmers%20Guide.pdf

あなたがすべきことは、あなたが印刷を要求したもの(あなたが紙の出力を持っていると仮定して)と送信されているバイトを一致させることです。印刷出力として何を取得する必要があるかを知っています。あなたはそれが何を生成するかを知っています、あなたはあなたの情報ではありえない繰り返しのものを排除します。次に、残したものから期待する出力に至るまでのルールを理解する必要があります。

ホストが何を送信しているか、プリンターがそれに応じて何をしているかを知るのに役立ちます

順序の最初の数バイトは次のように見えます:

(06, *)  = Printer sends ACK (ID) after host send ENQ (id) to printer
(05, n)  = Inquire Printer Status return codes 
...
于 2012-08-12T09:36:19.923 に答える