| Comunicação Serial RS232-C | |
| Drivers e DLLs – Middware Facilitadores | |
| Conclusão |
Em algum momento de nossa carreira como desenvolvedores recebemos solicitações para desenhar uma solução em software que atenda contas a pagar, receber, estoque, caixa, etc. Porém, ao desenvolver estas soluções utilizando-se das ferramentas existentes hoje e de todo o seu potencial chegamos a conclusão que todos estes sistemas são alimentados com dados provenientes de vendas, vendas realizadas no caixa ou no que chamamos de Chek-Out. Então, resolvemos também oferecer um software para atender a necessidade da Frente-de-Caixa ou PDV (Ponto de Venda).
Antes de colocarmos as mãos na massa, nos damos conta que existe – por força de legislação federal – o cliente que terá que usar um ECF (Emissor de Cupom fiscal), e, por sua vez nosso software terá de “interfacear” com esta impressora de cupom fiscal. Este artigo visa esclarecer de forma simples e pratica como estes periféricos funcionam e como podemos “Interfacear” com eles em C# utilizando-se do potencial que a plataforma .Net nos oferece.
Eis o primeiro mistério. A impressora fiscal não tem a mesma comunicação que as impressoras normais (LX300, Epson, etc), não são impressoras reconhecidas pelo Windows que basta dar um click e pronto. Todas as impressoras fiscais possuem um protocolo de comunicação serial baseada na revisão C, por isso, a interface usada é o padrão RS232-C. Os periféricos fiscais possuem um set de comandos que responde a uma ação específica solicitada por seu software, ou seja, se plugarmos um ECF (Emissor de Cupom Fiscal) na COM2 e digitarmos “c:\Dir > COM2”, nada acontecerá pois a mesma apenas reage a comandos pré-definidos em seu set de comandos. Conclusão: Nosso software deverá efetuar uma comunicação serial com o micro e “Falar” o protocolo da Impressora que nosso cliente estiver usando no momento.
Para nossa salvação, os fabricantes de impressoras fiscais fornecem drivers, .sys, Dll e outras ferramentas de comunicação para reduzir nosso sofrimento de portar o software para um ECF. Por exemplo, a dll Daruma, chamada DARUMA32.DLL que reduz em 90% o tempo gasto na integração do software com o ECF. Vamos detalhar o uso da mesma, e em seguida como construir nossa própria dll.
De nada servirá se não conhecermos a lógica e regras de funcionamento de uma impressora fiscal. A regra básica de funcionamento de todo e qualquer periférico fiscal é:

Sendo assim, o software terá de estar preparado para assumir como função principal Abrir Cupom, Vender Item e Fechar Cupom. Entre estas operações existem outros controles que devem ser adicionados a nossa aplicação que construiremos utilizando C#.
Nossa Primeira Comunicação com o ECF, “Oi ECF!!”
O primeiro passo é declarar a dll, onde as especificações podem ser baixadas da página do fabricante ou você mesmo monta. Crie uma classe no C# e inclua como namespace a indicação que estaremos interagindo com uma dll “UnManageCode”.
using System; using System.IO; using System.Windows.Forms; using System.Runtime.InteropServices;
Em seguida, crie uma classe ECF que irá conter todas as funções disponibilizadas pelo fabricante da dll, que neste exemplo é a dll Daruma32.dl, Adicione o seguinte trecho de código em sua classe:
namespace ECF_CSHARP
{
public class cEcf
{
[DllImport("Daruma32.dll")]
public static extern int Daruma_FI_LeituraX();
[DllImport("Daruma32.dll")]
public static extern int Daruma_FI_AbreCupom( System.String CGC_CPF);
[DllImport("Daruma32.dll")]
public static extern int Daruma_FI_FechaCupomResumido(System.String FormaPagamento, System.String Mensagem);
[DllImport("Daruma32.dll")]
public static extern int Daruma_FI_VendeItem(System.String Codigo, System.String Descricao, System.String Aliquota,System.String TipoQuantidade, System.String Quantidade, int CasasDecimais,System.String Vr_Unitario, System.String TipoDesconto, System.String Desconto);
}
}
No seu form1 você deverá incluir o seguinte namespace:
using System; using System.Drawing; using System.IO; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using ECF_CSHARP;
Inclua um Botão, e no evento click adicione as chamadas às funções que acabamos de declarar de acesso ao ECF. Insira os três comandos, Abertura, Venda e Fechamento de Cupom. Digite o seguinte código:
if( cEcf.Daruma_FI_VendeItem("1234567890123","Produto1", "FF", "I", "10", 2, "100", "$", "0") != 1)
{
System.Windows.Forms.MessageBox.Show("Erro na Execução da Função do ECF");
return;
}
else
System.Windows.Forms.MessageBox.Show("Comando Enviado com sucesso para o ECF");
if( cEcf.Daruma_FI_FechaCupomResumido("Cheque","Obrigado Volte Sempre!!") != 1)
{
System.Windows.Forms.MessageBox.Show("Erro na Execução da Função do ECF");
return;
}
Figura 1.1 Resultado do aplicativo que consome a Daruma32.dll para se Comunicar como ECF

Claro que aqui temos um exemplo simples de como acessar ao ECF, porém, através dele já conseguimos tirar várias conclusões. Uma delas é a não obrigatoriedade de ser chamada a função de Abertura de Cupom, pois a função VendeItem é inteligente o suficiente para verificar a necessidade de se abrir o cupom fiscal de forma automática. Se você tiver uma impressora fiscal conectada em seu PC, observará que acabou de emitir um cupom fiscal, onde para isso foram chamadas as funções de Venda de Item e de Fechamento de Cupom. Vamos analisar cada parâmetro:
Na Função de Venda de Item, passamos o Código ("1234567890123") que neste caso pode ser de até 13 caracteres. Os parâmetros passados são: a descrição do produto e a alíquota. FF – FF, II e NN são alíquotas fiscais que já estão pré-definidas no ECF para produtos que possuem Substituição Tributária, Isenção ou Não Incidência de ICMS, porém, caso nosso produto a ser vendido possua uma alíquota em especial deveremos passar o valor desta alíquota com quatro casas, exemplo: “1200” ou “1800”.
Em seguida, temos quatro parâmetros onde foi passada a letra “I”, indicando que vamos trabalhar com quantidade Inteira e não Fracionaria, ou seja, que vamos vender por unidade e não por peso.
O quinto parâmetro é a quantidade do item que estamos vendendo, seguido pelo parâmetro de quantas casas decimais nosso produto possui, 2 (duas). Em seguida, o valor unitário do produto que neste caso é R$1,00. Observe que os valores devem ser passados sem formatação, embora mesmo que sejam passados com a vírgula, a dll entenderá e obedecerá as casas de centavos que foram impostas pela existência da virgula.
Os demais parâmetros são o Desconto e o valor do mesmo. O desconto em um produto pode ser por Valor ou por percentual, ou seja, podemos dar um desconto de 10,00 REAIS ou de 10,00 % (Por cento), e isso é representado pelos símbolos “$” e “%”, que neste exemplo passamos por valor. O último parâmetro indica o montante deste desconto, que caso seja por percentual deverá ter até quatro casas como tamanho.
Por fim, chamamos a função de Fechamento de Cupom Fiscal onde um dos grandes facilitadores é a função de fechamento de cupom fiscal resumido em que passamos como parâmetro a Forma de Pagamento que nosso cliente esta apresentando para saldar sua compra, e, como ultimo parâmetro, uma mensagem promocional, que neste exemplo foi a famosa “Obrigado Volte Sempre!!”
Finalmente, com isso estou certo que conseguiremos entender o “caminho das pedras” para a comunicação com o ECF e como devemos declarar e utilizar as dlls ofertadas pelos fabricantes no C#.
Vale acrescentar que no C#, e nas linguagens baseadas no .NET, possuímos as macros de tratamento de erros “Try..Catch...Finally”, porém, se tratando de comunicação com ECF estas macros não tem efeito. Por isso, ao final de cada função, como exemplo de tratamento de erro, disponibilizamos um MessageBox para o usuário indicando que a função não foi executada conforme esperado. Onde podemos encontrar o retorno das funções, a documentação de cada retorno obtido na chamada da função e também todas as funções de acesso ao ECF? Fica aqui meu incentivo para você acesse o Help do Fabricante onde ele mostrará passo a passo como acessar na plataforma .Net do seu produto. Neste caso, usei o Help interativo da Daruma32.dll, que está completo, que possui exemplos em VB.Net, C# e Visual Fox Pro.
Acessar ao ECF e entrar no mundo da Automação comercial está sem dúvida mais fácil com a plataforma .Net que oferece todos os recursos necessários para você ordenar seu código fonte, programar utilizando OOP criando classes de acesso ao ECF e uma perfeita manipulação de dlls UnManageCode.
Claudenir Campos Andrade (claudenir_campos@hotmail.com, claudenir@daruma.com.br ) é Microsoft MVP, autor do livro “Automação Comercial com VB.net e C#” (www.erica.com.br) , gerencia a equipe de desenvolvimento de sw da Daruma e o programa Daruma Developers Community. Escreve artigos para o site MSDN, Blaz (www.blaz.com.br), palestrantes de diversos eventos de Automação comercial e o uso da plataforma .net neste mercado como o Tecnical Day do Linha de Código.