C#でポールディスプレイの問題
-
23-08-2019 - |
質問
私は自分のPOSのC#application.Iでポールディスプレイ(E POS)を使用したものでは二つの大きな問題を抱えています、 1.私は完全に表示をクリアすることはできません。 2.私は、カーソル位置を設定することはできません。
I used some dirty tricks to do these.But I am not satisfied with that code.The following code i used.
コード: -
class PoleDisplay : SerialPort
{
private SerialPort srPort = null;
public PoleDisplay()
{
try
{
srPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
if (!srPort.IsOpen) srPort.Open();
}
catch { }
}
~PoleDisplay()
{
srPort.Close();
}
//To clear Display.....
public void ClearDisplay()
{
srPort.Write(" ");
srPort.WriteLine(" ");
}
//Display Function
//'line' 1 for First line and 0 For second line
public void Display(string textToDisplay, int line)
{
if (line == 0)
srPort.Write(textToDisplay);
else
srPort.WriteLine(textToDisplay);
}
}
解決
あなたの問題は、あなたがライン2をクリアするには、clearライン1、およびWriteLineメソッドへの書き込みを呼び出しているということです。
これはどんな意味がありません。メソッドの唯一の違いは、WriteLineメソッドは、最後に改行を追加することです。あなたが本当にやっているすべては、この文字列この出力されます:
" "\r\n
は、使用しているポールディスプレイのブランドを知らなければ、私はあなたにそれを行うための適切な方法を伝えることはできませんが、あなたはそれをやろうとしている方法は動作しません。ほとんどの端末は、カーソルを移動したり、表示をクリアするために、特殊な文字コードを受け入れます。あなたが作業している端末の参照を見つけたことがありますか?あなたが彼らにCHR(12)を送信する場合、ほとんどの表示がクリアされます。
すべてのことはさておき、自分のクラスのデザインと大きな問題があります。あなたは、C#で、リソースの解放をデストラクタに頼るべきではありません。
C#では、ガベージコレクタがオブジェクトを収集するときにデストラクタが呼び出されるので、リソース(この場合のCOMポート)、収集し、閉鎖されたときに知るない決定論的方法はありません。
その代わり、自分のクラスのインターフェイスIDisposableインターを実装します。
これはあなたのクラスにDisposeメソッドを追加する必要があります。これは、あなたの現在のデストラクタと同じ目的を果たすでしょう。
はそれを行うことによって、あなたは、オブジェクトがスコープの外に出たとき、あなたのリソースを解放するためにC#で言語の機能に組み込まれて利用することができます。
using (PoleDisplay p = new PoleDisplay())
{
// Do Stuff with p
}
// When the focus has left the using block, Dispose() will be called on p.
他のヒント
それはほとんどのディスプレイのために働く、画面をクリアするには、進コード0Cを送信
ここでのサンプルコードです:
byte[] bytesToSend = new byte[1] { 0x0C }; // send hex code 0C to clear screen
srPort.Write(bytesToSend, 0, 1);