[Escovando Bits] Não ocupar a porta serial

20/05/2013

3

[url]http://www.desenvolvedoresdaruma.com.br/dde/htmls/dde036_2013-nao-ocupar-serial.html[/url]


Um problema corrente para quem usa vários fabricantes de ECF na mesma aplicação é a questão da porta serial ficar “presa”. Presa? Isso mesmo, presa! A porta serial “fala” apenas com 1 dispositivo por vez. Nós não conseguimos enviar comandos simultaneamente para a porta serial, ela “ouve” e “responde”, “ouve” e “responde”...Então você desenvolvedor que faz o carregamento das bibliotecas de todos os fabricantes quando “starta” sua aplicação, ou seja, de uma vez só, terá problemas de comunicação.Mais por que isso acontece? É simples! Nossa dll, por padrão, procura as portas disponíveis e tenta comunicar, de forma automática. Entendemos que você é parceiro e usa Daruma e que não pretende se preocupar com comunicação, então nós tentamos comunicar com as portas seriais disponíveis. Quando você não está usando a Daruma, não irá comunicar, então a porta serial ficará ocupada.
Como fazer para impedir isso? Mais simples ainda! Primeiramente vou mostrar como “prender” a porta e em seguida como deixar ela “free”, veja que simples:

Prender/ocupar a porta serial/USB
Desprender/Desocupar a porta serial/USB – Deixar free
Usando Impressora fiscal Daruma
Não usando Impressora Fiscal Daruma
Prender/ocupar a porta serial/USBVamos ocupar a porta serial, para provar que o procedimento de “desocupar”, deixar a porta “free” vai funcionar corretamente.
Conecte sua impressora fiscal;;
Clique aqui e faça o download do exemplo em Delphi;
Rode o exemplo em Delphi e deixe-o aberto;
Abra o prompt de comandos(DOS);
Digite o comando a seguir usando a porta de sua impressora fiscal. No meu caso é COM2. mode com2
Deverá ser mostrada uma mensagem que o dispositivo não está disponível, conforme abaixo::

Feito! Conseguimos provar que a porta está sendo ocupada, o comando “mode com2”(use a com de sua impressora) nos provou isso;
Desprender/Desocupar a porta serial/USB – Deixar free
Finalmente vou mostrar como não fazer a porta ficar como no exemplo acima, ocupada. O prompt serviu como uma segunda aplicação, ele está sendo usado somente para mostrarmos que o executável em Delphi está ocupando a porta serial.

Existem duas situações em que a porta deve ficar ocupada:

Porta ocupada, porém sem impressora fiscal Daruma no PDV;
Porta ocupada, com impressora fiscal Daruma usando duas aplicações;
Porta ocupada, porém sem impressora fiscal Daruma no PDV

Este é o caso onde nós(DarumaFramework) tentamos comunicação porém não conseguimos por não ter uma ecf Daruma no PDV. Abaixo, vamos prosseguir com o exemplo em Delphi, como se fosse sua aplicação sem comunicação:
Feche o exemplo em Delphi e o prompt de comandos;
Abra com algum editor de textos o arquivo DarumaFramework.xml;
Procure pela chave <Produto> e altere de ECF para “” ou “ “. Veja o exemplo:
<Produto></Produto> ou <Produto> </Produto>
Explicação: Quando a DarumaFramework é carregada, ela faz a leitura do arquivo de configurações(DarumaFramework.xml). No inicio da leitura deste arquivo, nós(DFW) identificamos que você não está usando nossos produtos e nem tentamos estabelecer comunicação, em outras palavras, nós liberamos a porta para você.
Salve o arquivo DarumaFramework.xml e feche-o;
Agora rode o executável em Delphi;
Deixe o executável em Delphi minimizado e em seguida abra o prompt de comandos(DOS);
Digite o comando a seguir usando a porta de sua impressora fiscal. No meu caso é COM2. mode com2
Deverá ser mostrada uma mensagem que o dispositivo está disponível, conforme abaixo:

Feito! Agora sua porta serial que NÃO está sendo usada por uma impressora Daruma está liberada;
Como fazer isso usando linhas de código?

Delphi
//Declaração
function eDefinirProduto_Daruma(szProduto: String): Integer; StdCall; External 'DarumaFrameWork.dll'

//Chamada de Métodos
iRetorno := eDefinirProduto_Daruma('');
ou
iRetorno := eDefinirProduto_Daruma(' ');

C#
//Declaração
[DllImport("DarumaFrameWork.dll")]
public static extern int eDefinirProduto_Daruma(string sProduto);

//Chamada de Métodos
iRetorno = eDefinirProduto_Daruma("");
ou
iRetorno = eDefinirProduto_Daruma(" ");

Visual Basic 6
//Declaração
Public Declare Function eDefinirProduto_Daruma Lib "DarumaFrameWork.dll" (ByVal sProduto As String) As Integer

//Chamada de Métodos
iRetorno = eDefinirProduto_Daruma("");
ou
iRetorno = eDefinirProduto_Daruma(" "); Usando Impressora Fiscal Daruma
Um exemplo deste caso, é quando você, desenvolvedor, possui 2 executáveis usando a impressora Daruma e só um deles comunica. Como liberar a porta para o outro comunicar também? Opa! Veja que simples:
Vamos usar o executável em Delphi para simular sua aplicação e o novamente o executável em Delphi para simular a segunda aplicação que também vai usar a impressora Daruma. Então temos duas aplicações configuradas na porta COM2 em velocidade 115200(meu caso) e as duas devem comunicar.
Antes de rodar os dois executáveis, abra o arquivo DarumaFramework.xml de cada um deles;
Após abrir o arquivo DarumaFramework.xml procure a chave <ECF>
Abaixo de <ECF> procure a chave <ControleAutomatico>
Explicação: O controle automático como 1, faz com que a DarumaFramework “abra” uma comunicação com a porta serial e após executar o comando enviado por você, desenvolvedor, ela “fecha” a porta novamente. Fazendo com que a porta fique ocupada apenas enquanto o comando está sendo executado.
Feito! Após essa alteração nos dois arquivos de configuração DarumaFramework.xml, basta rodar os dois executáveis e testar a comunicação. Veja a impressão de uma Leitura X:


Como codificar isso?

Delphi
//Declaração
regAlterarValor_Daruma(pszPathChave:string, pszValor:string):Integer; StdCall;
External 'DarumaFramework.dll';

//Chamada de Métodos
iRetorno:=regAlterarValor_Daruma('ECF\ControleAutomatico','1');

C#
//Declaração
[DllImport("DarumaFrameWork.dll")]
public static extern int regAlterarValor_Daruma(string pszChave, string pszValor);

//Chamada de Métodos
iRetorno = regAlterarValor_Daruma(@"ECF\ControleAutomatico", “1”);

Visual Basic 6
//Declaração
Public Declare Function regAlterarValor_Daruma Lib "DarumaFrameWork.dll" (ByVal pszChave As String, ByVal pszValor As String) As Integer

//Chamada de Métodos
iRetorno = regAlterarValor_Daruma("ECF\ControleAutomatico", “1”)
Dicas
A porta serial só aceita um comando por vez, não é possível rodar comandos simultaneamente;
O ideal é cada executável conter uma DarumaFramework e um arquivo .xml;
Daruma Developer

Daruma Developer

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários,
consulte nossa política de privacidade.

Aceitar