Pergunta

Eu costumava monitor de poste (E POS) no meu POS c # application.I tem dois grande problema em que, 1. Eu não posso limpar o visor perfeitamente. 2. Não consigo definir a posição do cursor.

     I used some dirty tricks to do these.But I am not satisfied with that code.The following code i used.

Código: -

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);
    }

}  
Foi útil?

Solução

Seu problema é que você está chamando Write a clara linha 1, e WriteLine a linha clara 2.

Isto não faz qualquer sentido. A única diferença entre os métodos é que WriteLine adiciona uma quebra de linha até o fim. Tudo o que você está realmente fazendo é esta saída esta string:

  "                                  "\r\n

Sem saber a marca da tela pólo você estiver usando, eu não posso dizer-lhe a maneira correta de fazê-lo, mas a maneira que você está tentando fazer isso nunca vai funcionar. A maioria dos terminais aceitam códigos de caracteres especiais para mover o cursor, ou limpar o visor. Você já encontrou uma referência para o terminal que você está trabalhando? A maioria dos monitores irá limpar se você enviá-los CHR (12).

Tudo isso de lado, não é um grande problema com o seu design de classe. Você nunca deve confiar em destruidores para liberar recursos em C #.

Em C #, o destruidor será chamado quando o coletor de lixo recolhe o objeto, de modo que não há nenhuma maneira determinista saber quando o recurso (neste caso uma porta Com), serão recolhidos e fechados.

Em vez disso, implementar a interface IDisposable na sua classe.

Isso requer que você adicionar um método Dispose para sua classe. Isto serviria a mesma finalidade que o seu destruidor atual.

Ao fazer isso, você pode utilizar uma característica construída em linguagem C # para liberar seus recursos quando o objeto sai do escopo.

using (PoleDisplay p = new PoleDisplay())
{
     // Do Stuff with p
}
// When the focus has left the using block, Dispose() will be called on p.

Outras dicas

Enviar 0C código hexadecimal para limpar a tela, ele funciona para a maioria dos monitores

aqui é um exemplo de código:

byte[] bytesToSend = new byte[1] { 0x0C }; // send hex code 0C to clear screen
srPort.Write(bytesToSend, 0, 1);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top