Após ser muito questionado sobre o suporte a portas USB no ACBrECF, decidi fazer um esforço para criar uma maneira de tornar isso possível.
Recentemente enviei para o SVN as seguintes modificações:
Ou seja, isso faz com que o ACBrECF não utilize a classe Synapse para ter acesso direto a porta serial, mas que utilize um método (simples) da DLL do Fabricante para efetuar o envio / recebimento de dados ao ECF.
A principal vantagem dessa abordagem, é conseguir suporte nativo a porta USB, provido pela DLL do Fabricante, o que pode ocasionar em um significativo aumento de velocidade em alguns casos.
Atualmente o ACBrECF já tem uma certa dependência das DLLs dos fabricantes para a geração dos arquivos do PAF-ECF ou Ato Cotepe 17/04.. ou seja, o ACBrECF já possui código para carregar a DLL dinamicamente, e abrir e fechar a porta Serial (ou USB)... O que foi modificado nos fontes, é que caso o fabricante possua um método simples para Envio / Recebimento de pacotes de baixo nível, podemos deixar a comunicação do ECF a cargo da DLL,
Atualmente apenas a classe da Epson foi modificada para permitir essa nova funcionalidade... Para que possamos ajustar as classes dos demais fabricantes, precisamos saber se os mesmos disponibilizam uma função parecida com o método usado pelo próprio ACBr:
Function EnviaComando( cmd : AnsiString; lTimeOut : Integer): AnsiString; ( o retorno é a resposta do ECF no protocolo do mesmo )
O ACBrECF SEMPRE fará carga dinâmica da DLL não causando dependência estática à mesma no aplicativo
Uma sugestão para o método da DLL do fabricante seria:
DWORD ECF_Serial_Enviar_Dados( LPSTR Comando, WORD TimeOut, LPSTR Retorno)
O próprio ACBr já é capaz de montar um pacote com toda a especificação do protocolo, apenas precisamos de um método que permita o envio/recebimento de dados...
Outros métodos semelhantes também podem ser utilizados/adaptados, como por exemplo, enviar o Comando do ECF e Parâmetros separados por Pipe "|", etc...
Agradeço a todos que puderem ajudar nessa empreitada... Por favor indiquem esse próprio post ao corpo técnico dos Fabricantes, assim podemos debater um modo de como implementar essa nova funcionalidade em todas as classes MFD