none
comunicar com porta serial balança RRS feed

  • Pergunta

  • Caros amigos estou tentando fazer uma aplicacao com para comunicar uma porta serial, para ser mais expecifico uma balanca toledo, so que nao estou entendendo este codigo alguem pode me explicar, tenho chamar algum evento neste codigo ? , e qual componete possui este evento private void AddRecieve(object s, EventArgs e) no codigo abaixo?
    nao consigo receber a informação abre a porta somente mas nao capturo os dados,

    codigo

    string EntradaStr;
            private void button1_Click(object sender, EventArgs e)
            {
                bool ConSerial = ConnectSerial("COM7");
                Timer_leitura.Start();
            }
            private void ClearBuffer()
            {

                EntradaStr = "";

                ComPort.DiscardInBuffer();

            }

            private List<byte> PortBuffer = new List<byte>();

            public bool ConnectSerial(string porta)
            {

                int baud = 2400;

                try
                {

                    if (ComPort.IsOpen)
                    {

                        MessageBox.Show("A porta " + porta + " já está aberta.", "Aviso do Sistema", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    }

                    else
                    {

                        ComPort.PortName = porta;

                        ComPort.BaudRate = baud;

                        ComPort.Parity = Parity.Mark;

                        ComPort.StopBits = StopBits.One;

                        ComPort.DataBits = 8;

                        ComPort.Handshake = Handshake.None;

                        ComPort.DtrEnable = true;

                        ComPort.RtsEnable = true;

                        ComPort.DataReceived += new SerialDataReceivedEventHandler(ComPort_DataReceived_1);

                        ComPort.Open();

                        ComPort.ReadTimeout = 300;

                        ComPort.WriteTimeout = 300;



                    }

                    return true;

                }

                catch (IOException e)
                {

                    MessageBox.Show(e.Message.ToString());

                    return false;

                }

            }

            private string GetText(byte[] data)
            {

                foreach (byte b in data)
                {

                    char Letra = Convert.ToChar(b);

                    EntradaStr = EntradaStr + Convert.ToString(Letra);

                }

                return EntradaStr;

            }

            private void AddRecieve(object s, EventArgs e)
            {

                string temp = "";

                string valores = "";

                byte[] data = new byte[ComPort.BytesToRead];

                ComPort.Read(data, 0, data.Length);

                PortBuffer.AddRange(data);

                if (PortBuffer.Count > 1)
                {

                    temp = (GetText(PortBuffer.ToArray()));

                    valores = Converse(EntradaStr);

                    label1.Text = valores;

                    produtocodtxt.Focus();

                    PortBuffer.Clear();

                }

                infolbl.Text = "Informe o Código do Produto";

            }

            private string Converse(string data)
            {

                int i = 0;

                string Init = data.Substring(3, 5);

                string TmpStr = "";

                string FimStr = "";

                int qtlet = Init.Length;

                for (i = 0; i < qtlet; i++)
                {

                    if (Init.Substring(i, 1).ToString() == "±")
                    {

                        TmpStr = TmpStr + Init.Substring(i, 1).Replace("±", "1");

                    }

                    else if (Init.Substring(i, 1).ToString() == "²")
                    {

                        TmpStr = TmpStr + Init.Substring(i, 1).Replace("²", "2");

                    }

                    else if (Init.Substring(i, 1).ToString() == "´")
                    {

                        TmpStr = TmpStr + Init.Substring(i, 1).Replace("´", "4");

                    }

                    else if (Init.Substring(i, 1).ToString() == "·")
                    {

                        TmpStr = TmpStr + Init.Substring(i, 1).Replace("·", "7");

                    }

                    else if (Init.Substring(i, 1).ToString() == "¸")
                    {

                        TmpStr = TmpStr + Init.Substring(i, 1).Replace("¸", "8");

                    }

                    else
                    {

                        TmpStr = TmpStr + Init.Substring(i, 1);

                    }

                }

                FimStr = TmpStr.Insert(2, ",");

                return FimStr;

            }

          

            int seg = 0;

          

            private void Timer_leitura_Tick_1(object sender, EventArgs e)
            {
                seg = seg + 1;

                Timer_leitura.Interval = 1000;

                Timer_leitura.Enabled = true;

                lblSeg.Text = "Segundos: " + seg;

                byte[] data = new byte[ComPort.BytesToRead];

                ComPort.Read(data, 0, data.Length);

                PortBuffer.AddRange(data);
            }

            private void ComPort_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
            {
                if (ComPort.IsOpen)
                {

                    try
                    {

                        this.Invoke(new EventHandler(AddRecieve));

                    }

                    catch (System.TimeoutException a)
                    {

                        MessageBox.Show(a.Message.ToString());

                    }

                }
            }
    quinta-feira, 18 de fevereiro de 2010 18:16

Respostas

  • No ultimo método é onde vc vai ler os dados. É este evento é lançado quando chega os dados na porta.

    comPort.DataReceived += new SerialDataReceivedEventHandler(ComPort_DataReceived_1);

    O funcionamento é mais ou menos assim. Vc cria o objeto de comunicação, adiciona o tratador de evento para receber os dados. Apos isto vc deve abrir a porta e enviar os comandos que a balança necessita, estes comandos deve estar no manual da balança, se vc enviar os dados corretos a balança vai lhe retornar os dados em um array de bytes, ai vc só converte eles para string e verifica os retornos.

    Se sua pergunta foi respondida por favor marque a resposta como certa.
    • Marcado como Resposta Jhonboy quinta-feira, 18 de fevereiro de 2010 19:04
    quinta-feira, 18 de fevereiro de 2010 18:28

Todas as Respostas

  • No ultimo método é onde vc vai ler os dados. É este evento é lançado quando chega os dados na porta.

    comPort.DataReceived += new SerialDataReceivedEventHandler(ComPort_DataReceived_1);

    O funcionamento é mais ou menos assim. Vc cria o objeto de comunicação, adiciona o tratador de evento para receber os dados. Apos isto vc deve abrir a porta e enviar os comandos que a balança necessita, estes comandos deve estar no manual da balança, se vc enviar os dados corretos a balança vai lhe retornar os dados em um array de bytes, ai vc só converte eles para string e verifica os retornos.

    Se sua pergunta foi respondida por favor marque a resposta como certa.
    • Marcado como Resposta Jhonboy quinta-feira, 18 de fevereiro de 2010 19:04
    quinta-feira, 18 de fevereiro de 2010 18:28
  • Eu uso para balanca filizola , acho que e o mesmo comando 

         public SerialPort _serialPort; // Faz Comunicao Rs232

        // Pedir informacao de peso da balanca 
     
       _serialPort.Write(

    Convert.ToString((char)5));


        // depois eu pego as informaçoes retornada da  balanca 

     

         byte[] data = new byte[_serialPort.BytesToRead];
         _serialPort.Read(data, 0, data.Length);

     


      

     

         

     
     

         

     
     

     


    MARCO AURELIO
    sexta-feira, 19 de fevereiro de 2010 13:39
  • amigo esta comunicando com a balança so que sai uns caracteres estranhos, a balanca e toledo, vc sabe o pq?
    sábado, 20 de fevereiro de 2010 12:22
  • Ai teria que ver o manual da balança e que dados ela retorna.
    Pode ser tbem o encoding q vc esta utilizando para converter os bytes para string.
    Se sua pergunta foi respondida por favor marque a resposta como certa.
    domingo, 21 de fevereiro de 2010 14:18
  • ESTA AQUI A CONFIGURACAO DA BALANÇA TEM COMO ME AJUDAR? VE SE ESTOU CORRETOConfiguração:
    1. Protocolos P01, P02 e P03: 11 bits, sendo: . 1 start bit, . 7 bits de dados em ASCII, . 1 bit de paridade par, . 2 stop bits.
    2. Protocolo P04: 10 a 12 bits, sendo: . 1 start bit, . 7 ou 8 bits de dados em ASCII, configurável pelo usuário, . 1 bit de paridade: par, impar, sempre zero ou nenhuma,
    configurável pelo usuário, . 1 ou 2 stop bits, configurável pelo usuário.
    3. Protocolo P05: 10 bits, sendo: . 1 start bit, . 8 bits de dados em ASCII, . 1 stop bit, . Paridade: Nenhuma.
    Nota: este protocolo somente está disponível na porta
    RS-232C.
    4. Modos de saída: Demanda ou Contínuo, configurável
    pelo usuário.
    5. Taxa de transmissão: 300, 1200, 2400, 4800 ou 9600
    bps (Bauds), configurável pelo usuário para os protocolos
    de P01 a P04. O modo contínuo de transmissão
    só ocorre em 4800 ou 9600 bps. O protocolo P05 só
    permite 2400 bps em demanda.
    6. O Checksum pode ser habilitado ou inibido pelo
    usuário e tem atuação nos protocolos de P01 a P04.
    RS-485
    Permite que uma rede de até 30 balanças seja supervisionada
    por um Concentrador de Dados Toledo. O protocolo
    de Link utilizado na rede é o Poll Select, com uma
    comunicação Half-duplex, serial assíncrona e orientada
    a caracter. Tem controle de acesso centralizado e faz
    uso de configuração multiponto.
    Configuração:
    11 bits, sendo: . 1 start bit, . 8 bits de dados em ASCII,
    . 1 stop bit.
    Taxa de transmissão: 19200 ou 57600 bps, configurável
    pelo usuário.
    Para maiores detalhes sobre a comunicação em
    RS-485, consulte a Engenharia de Soluções da Toledo.
    segunda-feira, 22 de fevereiro de 2010 13:29
  • Isso que vc passou é as configurações que vc deve usar no objeto SerialPort para que a comunicação ocorra certa.
    Por exemplo no protocolo p1,p2,p3 vc tem 11 bits de comunicação, 1start bit, 7 bits de dados, 1 de paridade e 2 de parada. Então se vc quiser utilizar um desses deve configurar as propriedades desta forma.
    O que vc deve pesquisar é o que a balança envia para a porta serial, quando ela registrar um peso.

    Se sua pergunta foi respondida por favor marque a resposta como certa.
    segunda-feira, 22 de fevereiro de 2010 16:51
  • sim ela envia para porta serial! isto eu sei pois tem um sistema rodando, e eu estou tentando desenvolver um mais novo pois o kra deste sistema sumiu e ninguem encontra ele para dar suporte.
    segunda-feira, 22 de fevereiro de 2010 18:59
  • na sua aplicação o  que ela retorna ? qual e o modelo da balança ? prix3 ?
    MARCO AURELIO
    sexta-feira, 26 de fevereiro de 2010 19:01
  • sim ela envia para porta serial! isto eu sei pois tem um sistema rodando, e eu estou tentando desenvolver um mais novo pois o kra deste sistema sumiu e ninguem encontra ele para dar suporte.

    Com certeza ela envia, para a porta serial. Mas a pergunta é: Qual o formato dos dados que ela envia? Geralmente isto tem um padrão que vc deve pesquisar com os fabricantes da balança.

    Se sua pergunta foi respondida por favor marque a resposta como certa.
    sábado, 27 de fevereiro de 2010 19:40
  • 1.1 Tipo de Interface:

     A interface de saída serial de dados pode ser do tipo RS232-C ou em Loop de corrente (ativo ou passivo, depende do cabo) com isolação óptica. O código utilizado no pacote de dados é ASCII e as possíveis taxas de transmissão são de 300, 1200, 2400, 4800 e 9600 Baud.

    a) Saída em RS 232-C:

    b) Saída em Loop de corrente:

    1. Formato de um Byte:

     

     

    P01 ATÉ P04

    P05 (*)

    Taxa de transmissão

    Programável

    Programável

    Paridade

    Par

    Nenhuma

    Código

    ASCII

    ASCII

    Número de bits de dados

    7 (LSB primeiro)

    8 (LSB primeiro)

    Número de stop bits

    2

    1

     

    1.4 Cálculo do Checksum

    O cálculo do Checksum é obtido através do complemento de 2 da soma de todos os bytes recebidos de STX, inclusive, à CR inclusive.

      2.  Formatos de Comunicação para Indicador Digital Modelo 9091 Pesador/Contador e Balanças Eletrônicas Pesadoras/Contadoras Modelos 3300 e 3400:

      2.1  Comunicação utilizando o protocolo P01, usado comumente para transmitir dados ao Impressor Matricial de Etiquetas Modelo 351:

      Formato para Balança Pesadora:

    STX DD/MM/AA SPC HH:MM SPC CCCCCC SPC BBBBBBBB kg SPC ou LLLLLLL kg SPC LIQ (SO) CR (CS) LF

     ota: na Balança 3400 é CCCCCCCCCCCC (12 caracteres).

      .2  Comunicação utilizando o protocolo P02, usado comumente para transmitir dados ao Impressor Térmico de Código de Barras Modelo 8861:

      Formato para Balança Pesadora:

     STX DD/MM/AA SPC HH:MM SPC SPC SPC SPC SPC SPC SPC SPC SPC CR (CS) LF

    BBBBBBBB kg SPC CR (CS) LF

    TTTTTTT kg SPC TR SPC CR (CS) LF

    CCCCCC CR (CS) LF

    LLLLLLL kg SPC LIQ CR (CS) LF

     

    Nota: na Balança 3400 é CCCCCCCCCCCC (12 caracteres).

     

    Formato para Balança Pesadora:

     STX DD/MM/AA SPC HH:MM SPC SPC SPC SPC SPC SPC SPC SPC SPC CR (CS) LF

    CR (CS) LF

    BBBBBBBB kg SPC CR (CS) LF

    TTTTTTT kg SPC TR SPC CR (CS) LF

    LLLLLLL kg SPC LIQ CR (CS) LF 

    Formato para Balança Pesadora:

     STX CR (CS) LF

    CR (CS) LF

    BBBBBBBB kg SPC CR (CS) LF

    TTTTTTT kg SPC TR SPC CR (CS) LF

    LLLLLLL kg SPC LIQ CR (CS) LF

    Formato para Balança Pesadora:

     BBBBBBBB ou LLLLLLL kg SPC CR (CS) LF

     Nota: na Balança 3400 é CCCCCCCCCCCC (12 caracteres).

      Formato para Balança Pesadora:

     STX DD/MM/AA SPC HH:MM SPC SPC SPC SPC SPC SPC SPC SPC SPC CR (CS) LF

    CR (CS) LF

    CR (CS) LF

    CCCCCC CR (CS) LF

    BBBBBBB ou LLLLLLL kg SPC LIQ CR (CS) LF

    Nota: na Balança 3400 é CCCCCCCCCCCC (12 caracteres).

      Formato para Balança Pesadora:

     STX CR (CS) LF

    CR (CS) LF

    CR (CS) LF

    CR (CS) LF

    BBBBBBBB ou LLLLLLL kg SPC CR (CS) LF

     


    2.3  Comunicação utilizando o protocolo P03:

     

    Programação da Balança

    C14 = P03

    Formato de dados da saída serial

     

    Formato para Balança Pesadora:

    STX,SWA,SWB,SWC,I,I,I,I,I,I,T,T,T,T,T,T,CR,(CS)

     

    SWA - STATUS WORD "A":

     

    001 = Display x 10

     

    010 = Display x 1

    BIT 2, 1 e 0

    011 = Display x 0.1

     

    100 = Display x 0.01

     

    101 = Display x 0.001

     

    110 = Display x 0.0001

     

    01 = Tamanho do incremento é 1

    BIT 4 e 3

    10 = Tamanho do incremento é 2

     

    11 = Tamanho do incremento é 5

    BIT 6 e 5

    01 sempre

    BIT 7

    Paridade par

     

    SWB - STATUS WORD "B":

    BIT 0

    Peso Líquido

    = 1

    BIT 1

    Peso Negativo 

    = 1

    BIT 2

    Sobrecarga

    = 1

    BIT 3

    Motion            

    = 1

    BIT 4

    Sempre           

    = 1

    BIT 5

    Sempre

    = 1

    BIT 6

    Se Auto Zerado

    = 1

    BIT 7

    Paridade Par

     

     

    SWC - STATUS WORD "C":

    BIT 0

    Sempre

    = 0

    BIT 1

    Sempre

    = 0

    BIT 2

    Sempre

    = 0

    BIT 3

    Tecla Imprimir

    = 1

    BIT 4

    Expandido

    = 1

    BIT 5

    Sempre

    = 1

    BIT 6

    Sempre

    = 1

    BIT 7

    Paridade Par

     

    Observações:

    Se existir sobrecarga da balança, o campo de peso IIIIII apresentará 000000.

     A taxa de atualização da saída serial de dados no modo contínuo é de 1/185ms (5,4 atualizações por segundo) a 4800 bps, e de 1/165ms (6,1 atualizações por segundo) a 9600 bps. Os três níveis de filtragem digital não afetam a taxa de atualização.

     O tempo máximo de estabilização da indicação depende do filtro digital selecionado:

     

    Sem filtro

    1,10 seg.

    Filtro leve

    1,60 seg.

    Filtro médio

    2,80 seg.

    Filtro pesado

    3,75 seg.

     


     

    2.4   Comunicação utilizando o protocolo P04, usado comumente para transmitir dados aos Impressores       PRINTWEIGHT ou EPSON LX-300:

     

    Programação da Balança

    C14 = P04

    Formato de dados da saída serial

     

    Este protocolo é igual ao P01, só que sem o envio do caracter (SI).

     

     

    2.5   Comunicação utilizando o protocolo P05, usado comumente para transmitir dados a microcomputa-dores, PDVs e outros periféricos, com Handshake de software:

     

    Programação da Balança

    C14 = P05

    Formato de dados da saída serial

     

    Formato para Balança Pesadora:

     

    ENQ STX BBBBBBB ou LLLLLLL ETX

     

    TTTTTTT kg SPC TR SI

     

    teremos

     

    GGGGGGG kg SPC PMP

     

    e

     

    LLLLLLL SPC kg SPC LIQ

     

    teremos

     

    HHHHHHH SPC PCS

     

    onde:

     

    GGGGGGG      é peso médio por peça (incluindo a vírgula ou ponto)

     

    HHHHHHH        é número de peças

     

    Na versão contadora, o parâmetro C10-IMPRESSÃO DE 1 OU 3 PESOS, se ligado, não transmite o peso e se desligado, só transmite peso bruto ou líquido.

     

    Observação:

    Não há diferença de protocolo na versão pesadora e contadora, no caso do protocolo P03.

     

     

    3. Formatos de Comunicação para Indicador Digital Modelo 9091 Rodoviário:

     

    3.1  Comunicação utilizando o protocolo P01, usado comumente para transmitir dados ao Impressor Matricial de Etiquetas Modelo 351:

     


    Formato:

     

    STX CCCCCC SPC BBBBBBB kg SPC TTTTTTT kg SPC TR SI SPC LLLLLLL kg SPC LIQ (SO) CR (CS) LF

     


    Formato:

     

    STX CCCCCC SPC BBBBBBB kg SPC ou LLLLLLL kg SPC LIQ (SO) CR (CS) LF


     

    Formato:

     

    STX NNNNNN SPC CCCCCC SPC BBBBBBB kg SPC TTTTTTT kg SPC SI SPC LLLLLLL kg SPC LIQ (SO) CR (CS) LF

     


    Formato:

     

    STX NNNNNN SPC CCCCCC SPC BBBBBBB kg SPC ou LLLLLLL kg SPC LIQ (SO) CR (CS) LF

     


    Formato:

     

    STX DD/MM/AA SPC HH:MM SPC NNNNNN SPC CCCCCC SPC BBBBBBB kg SPC TTTTTTT SPC TR SI SPC LLLLLLL kg SPC LIQ (SO) CR (CS) LF

     


    Observação:

    Se a transmissão contínua estiver ligada (Parâmetro C15 = L) e existir sobrecarga da balança, então a saída de dados será interrompida.

     


     

    3


    Formato:

     

    STX DD/MM/AA SPC HH:MM SPC SPC SPC SPC SPC SPC SPC SPC SPC CR (CS) LF

    BBBBBBB kg SPC CR (CS) LF

    TTTTTTT kg SPC TR SPC CR (CS) LF

    CCCCCC CR (CS) LF

    LLLLLLL kg SPC LIQ CR (CS) LF

     


    STX CR (CS) LF

    CR (CS) LF

    CR (CS) LF

    CCCCCC CR (CS) LF

    BBBBBBB ou LLLLLLL kg SPC LIQ CR (CS) LF

     


     

    Formato:

     

    STX DD/MM/AA SPC HH:MM SPC SPC SPC SPC SPC SPC SPC SPC SPC CR (CS) LF

    CR (CS) LF

    CR (CS) LF

    CCCCCC CR (CS) LF

    BBBBBBB ou LLLLLLL kg SPC LIQ CR (CS) LF

     


    Formato:

     

    STX CR (CS) LF

    CR (CS) LF

    CR (CS) LF

    CCCCCC CR (CS) LF

    BBBBBBB kg ou LLLLLLL kg SPC LIQ CR (CS) LF

     


     

     


    3.3  Comunicação utilizando o protocolo P03:

     

    Programação da Balança

    C14 = P03

    Formato de dados da saída serial

     

    Igual ao item 2.3.

     

     

     

    3.4   Comunicação utilizando o protocolo P04, usado comumente para transmitir dados aos Impressores PRINTWEIGHT ou EPSON LX-300:

     

    Programação da Balança

    C14 = P04

    Formato de dados da saída serial

     

    Este protocolo é igual ao P01, só que sem o envio do caracter (SI).


    quinta-feira, 4 de março de 2010 14:01
  • será que é isto ai em cima, foi o que fornecedor me passou.
    quinta-feira, 4 de março de 2010 14:02
  • Bom dia . eu  acabei de homologar a balanca de checkout 9094 da toledo no meu sistema ela e igual a filizola como tinha dita no post anterior segue o exemplo novamente
            void OpenPorta(string porta)
            {
                
                _serialPort = new SerialPort();
                if (porta != "")
                {
    

    try { _serialPort.PortName = "COM1"; _serialPort.BaudRate = 2400; _serialPort.Parity = "None; _serialPort.DataBits = 8; _serialPort.StopBits = One; _serialPort.ReadTimeout = 500; _serialPort.WriteTimeout = 500; _serialPort.Open(); } finally { bool _continue = true; } } }
            public void Pede()
            {
    
                if (ConfigGlobais.PortaBalanca != "")
                {
                    _serialPort.Write(Convert.ToString((char)5));
                    System.Threading.Thread.Sleep(250);
                }
            }
           public string Recebe()
            {
                string ret = "";
                string ret1 = "";
                string ret2 = "";
    
                if (ConfigGlobais.PortaBalanca != "")
                {
                    byte[] data = new byte[_serialPort.BytesToRead];
                    _serialPort.Read(data, 0, data.Length);
    
                    string EntradaStr = "";
                    foreach (byte b in data)
                    {
                        if (b <= 57)
                        {
                            if (b >= 48)
                            {
                                char Letra = Convert.ToChar(b);
                                EntradaStr = EntradaStr + Convert.ToString(Letra);
                            }
                        }
                    }
    
                    if (EntradaStr.Length > 4)
                    {
                        ret = EntradaStr.Insert(EntradaStr.Length - 3, ".");
                    }
    
    
                }
                return ret;
    
            }

    MARCO AURELIO
    terça-feira, 9 de março de 2010 14:06

  • Marco Aurelio vou tentar valeu obrigado , desde ja
    terça-feira, 9 de março de 2010 17:39
  • Ola Marco Aurelio, estou começando no mundo do c#, e logo de cara estou enfrentando esse desafio de comunicação com balanças.

    Estou tentando acompanhar o seu raciocínio, mas estou meio perdido, sera que você poderia disponibilizar todo o código para análise?

    porque tem umas variáveis que não estou conseguindo identificar, como por exemplo ConfigGlobais.PortaBalanca etc...

    Lhe serei muito grato.

    Atenciosamente;

    Ederson Souza

    ederson_msn@msn.com

    terça-feira, 24 de abril de 2012 15:44
  • Ederson este post é de 2010! dificilmente ele verá esta sua pergunta já que não responde nada desde setembro de 2010

    Por que você não posta sua pergunta la no Fórum?


    Att. Lucas Rodrigues

    terça-feira, 24 de abril de 2012 15:47