none
Erro em conversao de tipo de dados RRS feed

  • Pergunta

  • Boa tarde.

     

    Montei um DLL em C# que le dados da porta serial, so que ao exceutala no AX tenho o seguinte erro:

     info("Porta Aberta");
    retorno = comm.getPeso();
    info("xx");

    Info(Porta aberta ) retorna normal.

    Qdo executa retorno = comm.getPeso();

    tenho este erro;

    ERRO = O objeto CLR não pode ser empacotado para anytype do Microsoft Dynamics.

    a funcao comm.getPeso(); retorna uma string normal.

    Existe alguma conversão a ser feita?

    Grato.

     

    quarta-feira, 16 de junho de 2010 20:20

Respostas

  • Problema resolvido pessoal, DLL 100 funcionando e testada no AX.

     

    Outra coisa onde posso achar manual sobre a linguagem X++??

    • Marcado como Resposta mlorenzi terça-feira, 29 de junho de 2010 19:36
    terça-feira, 29 de junho de 2010 19:35

Todas as Respostas

  • opa, dificil ajudar assim, mas tenta:

     

    retorno = any2str(.....);

     

     


    []s Pichler
    quarta-feira, 16 de junho de 2010 23:11
  • oi ainda:

     

    retorno = strfmt("%1", comm.getPeso());


    []s Pichler
    quarta-feira, 16 de junho de 2010 23:12
  • Ola Ricardo.

    Obrigado pela resposta.

    Com a segunda opção obtenho o seguinte erro:

    Erro ao executar o código: Tipo de argumento incorreto para função.

    Sera que pode ser problema na minha DLL.

    Mas testando minha DLL diretamente no C funciona normalmente?

     

     

     

    quinta-feira, 17 de junho de 2010 10:31
  • No código que você mostrou não esta declarado o retorno, que tipo de dados voce esta usando para a variável retorno? string ou anytype?

     

    Abs


    Software Development Engineer - Global Finance Management Team - www.daxdev.com.br -
    quinta-feira, 17 de junho de 2010 14:30
  • Ola Rodrigo.

     

    Minha DLL esta assim

    public string RxString;

    Existe uma funcao que preenche este valor.

    Identifiquei o seguinte as x o valor de RxString é nullo ou vazio, se eu fizer

    return "xxx";

    funciona, mas se mando o valor de Rxstring da pane.

     public string getPeso()

            {

                return RxString;

            }

    quinta-feira, 17 de junho de 2010 16:31
  • Entao, analisando o problema é isso mesmo.

     

    Metodo que retorna o peso:

    public string getPeso()
        {
          i++;
          
          string ret = "";
          /*mando ler a porta novamente*/
          serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);
          
          if (RxString == "")
           ret = "Vazio";
          else
          ret = RxString;
          /*caso exceda esta condicao a balanca pode estar desconctada ou desligada*/
          if (i == 4000000)
            ret = "Impossivel ler peso, balanca desligada ou cabo desconectado";
    
          return ret;
        }

    Desta maneira sempre que RxString for "Vazio" no Ax na leitura da DLL ele funciona normal, no momento que nao é mais "Vazio" que retorna dados tipo 123 ou 654

    Da erro no AX e cai na exeção:

    Codigo no AX:

      try
      {
         comm = new dllPesa5.Class1(velocidade, paridade, stopBits, bits, porta, balanca);
         info(velocidade);
         info(comm.OpenPort());
         comm.OpenPort();
         retornoPorta = comm.OpenPort();
    
         if (retornoPorta == "yes")
         {
          info("Porta Aberta");
          info("retorno1");
          retorno = comm.getPeso();
          info(retorno);
           while (retorno == "vazio")
          {
            i++;
            retorno = comm.getPeso();
            if (i == 9999999)
            retorno = "Impossivel ler peso";
           }
           info(retorno);
           comm.ClosePort();
          }
          else
            info("Problema com a porta");
        }
      catch
      {
        info("Deu pane");
        comm.ClosePort();
        throw error(error);
    
      }

    Gostaria de saber se o AX tem algum rejeição qto a algum tipo de dado, nao vejo diferenca em:

    ret = "Vazio";
    ret = 1234;

    Ambos sao String.

     

    segunda-feira, 21 de junho de 2010 13:13
  • Não, se ambos são do tipo string não tem porque diferenciar.... Agora da onde você tirar esse RxString? Não ta no seu método, você faz uma comparação em determinado momento e depois faz o retorno dele....

    Faz um cast explicito no retorno para ret e vê se funciona! Caso tenha duvidas, o cast explicito é (string)valor ou valor.ToString();.

    segunda-feira, 21 de junho de 2010 23:56
  • Ola Ricardo.

     

    Encontrei o problema esta na funcao que fecha a porta na DLL

     

    public string ClosePort()
        {
          string resposta = "";
    
          if (serialPort1.IsOpen)
          {
            resposta = "yes";
            serialPort1.Close();
          }
          else
            resposta = "no";
          return resposta;
        }

    Em qualquer situacao que eu chamar esta função do AX retorna erro e trava o AX, se eu tiro a chamada desta funcao funciona 100% pega os dados da serial, so que sempre tenho que fechar o AX pq na segunda leitura a porta ja esta aberta. A porta precisa ser fechada toda vez que algo for capturado da serial.

    if (retornoPorta == "yes")
         {
          info("Porta Aberta");
          retorno = comm.getPeso();
          info(retorno);
    
          while (retorno == "Vazio")
          {
            i++;
            retorno = comm.getPeso();
          }
          info(retorno);
          //se rodo esta funcao no final da erro e trava o AX
          //comm.ClosePort();
          //Se rodar ela como alert tbem trava o AX;
           //info(comm.ClosePort());
    
          }
          else
            info("Problema com a porta");
      }
    Sera que preciso fechar a porta em uma funcao separada no AX?

     

     

    terça-feira, 22 de junho de 2010 11:22
  • Opa! Eu nunca trabalhei com leitura de porta e etc... mas o que eu faria no seu caso é antes do return do método  getPeso(); já fechar a porta lá no C# mesmo. Não ____ fazer isto?

     

    []s


    []s Pichler
    quinta-feira, 24 de junho de 2010 11:00
  • Entao resolvi o problema da minha DLL, na verdade sao duas DLL uma para balancas de precisao e uma pra balanca rodoviaria, as de balanca de precisao esta ok tanto no C# como no AX, pois o protocolo é diferente das balancas rodoviarias.

     

    Meu problema esta na DLL para balanca rodoviaria, fiz ela ok testei a DLL no C# da mesma maneira que testo no AX, no C#  tenho o peso em 3 segundos ja no AX demora mais de 30 segundos, ja mudei varias vezes a maneira de leitura e nada sempre tenho o mesmo problema testanto no C# rapido no AX demais de lento.

     

    Alguem tem alguma ideia do que pode ser, onde estou errando???

     

    Grato.

    sábado, 26 de junho de 2010 21:22
  • Problema resolvido pessoal, DLL 100 funcionando e testada no AX.

     

    Outra coisa onde posso achar manual sobre a linguagem X++??

    • Marcado como Resposta mlorenzi terça-feira, 29 de junho de 2010 19:36
    terça-feira, 29 de junho de 2010 19:35
  • O que estava errado?

     

    Sobre os manuais, procure pelos mocs, eu postei no meu blog os mocs do 4, se bobear até do 5.

     

    http://www.daxbr.com.br

     

    Abraço.


    []s Pichler
    terça-feira, 29 de junho de 2010 21:35
  • Estava que eu nao estava acumulanado o valor da porta que vinha byte a byte, criei uma funcao que lia a por ta e acumulava numa variavel, ai qdo chegava em 17 caracteres eu chegava para ver se era valido caso nao retornava ao metodo de ler a porta, ficou show de bola. Ai no AX demorava pq nao conseguia estabilizar e pegar um peso ideal.

     

    Mas deu boa 

     

    valeu.

    quarta-feira, 30 de junho de 2010 10:34