none
Comunicação Serial com Balança Toledo PRIXIII RRS feed

  • Pergunta

  • Boa tarde, estou tendo problemas para retornar dados da interface serial RS232 de uma balança toledo para um form em C#.

    O que acontece é o seguinte:

    Ao pressionar o botão imprimir da balança ela envia dados via porta serial para o computador, até aí eu consigo fazer a leitura dos bytes que ela envia e retornar os código ASCII o que eu não estou conseguindo fazer é converter os códigos ASCII que são enviados ao computador para uma forma legível de dados (por exemplo uma string), pois preciso manipular os dados que são enviados para armazenamento em BD.

    Alguém sabe uma forma de conversão eficiente que me retorne esses dados como LETRAS ao invés de ASCII?

     

    Segue parte do código:

    //Evento que é disparado ao ter dados em buffer da porta serial

    private void ComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)

    {

    if (ComPort.IsOpen)

    {

    try

    {

    this.Invoke(new EventHandler(AddRecieve));

    }

    catch (System.TimeoutException a)

    {

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

    }

    }

    }

     

    private void AddRecieve(object s, EventArgs e)

    {

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

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

    PortBuffer.AddRange(data);

    if (PortBuffer.Count > 1)

    {

    resulttxt.Text = ReturnDados(PortBuffer.ToArray());

    PortBuffer.Clear();

    }

    }

     

    private string ReturnDados(byte[] data)

    {

    foreach (byte b in data)

    {

    int Code = Convert.ToInt32(b.ToString());

    char Letra = Convert.ToChar(Code);

    EntradaStr = EntradaStr + Convert.ToString(Letra) + " ";

    }

    return EntradaStr;

    }

    quarta-feira, 25 de julho de 2007 19:38

Respostas

  • Daniel, eu tenho um outro equipamento aqui que vai utilizar comunicação serial, assim que eu tiver um módulo de comunicação prá esse equipamento, que é menos específico que uma balança, te passo o modulo compilado.

     

    Ok

     

    quinta-feira, 1 de novembro de 2007 10:23

Todas as Respostas

  • Você conseguiu alguma coisa??? Se sim poste para nos auxiliar tbm!

    Valeu!!!!
    sexta-feira, 26 de outubro de 2007 19:22
  • Olá Daniel, o código que postei acima funciona corretamente, o que eu estava fazendo de errado era o cabo de comunicação.

     

    A cada evento detectado na porta seria especificada , COM1 por exemplo, o código acima recupera os dados e depois dá o tratamento que você especificar.

     

    Espero que ajude

     

     

    segunda-feira, 29 de outubro de 2007 11:13
  • Fala Cristiano,

     

    E tu tens os fontes desta comunicação... com os forms e talz?

     

    Testei aqui e não deu muito certo....  

     

    Agradeço se puderes me mandar....

     

    Valeu!

    segunda-feira, 29 de outubro de 2007 12:51
  • Seguinte Daniel, a primeira coisa que você tem de fazer é usar o componente ComPort do Visual Studio 2005, depois disso use os eventos a seguir e retorne como você preferir, tô incluindo ainda um conversor para texto dos dados recebidos.

     

    Código:

     

    No load do teu form "bool ConSerial = ConnectSerial("COM1");"

     

    private void ClearBuffer()

    {

    EntradaStr = "";

    ComPort.DiscardInBuffer();

    }

     

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

     

    public bool ConnectSerial(string Porta)

    {

    int baud = 4800;

    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);

    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);

    pesotxt.Text = Valores;

    produtocodetxt.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;

    }

    private void ComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)

    {

    if (ComPort.IsOpen)

    {

    try

    {

    this.Invoke(new EventHandler(AddRecieve));

    }

    catch (System.TimeoutException a)

    {

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

    }

    }

    }

     

     

    Abraços

    segunda-feira, 29 de outubro de 2007 13:36
  • Olá Cristiano...

     

    Depois de ler bem me achei no componente Comport(SerialPort).... hehehe Sou novo nesta linguagem!

     

    Mas olha só, minha intenção é usar um timer para ficar "escutando" o q passa na porta, estou com um periférico, apenas como teste, mas da forma que eu fiz não retornou nada no campo text..... Olha ai meu código e me diz se está "faltando" algo no timer...

     

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    using System.IO;

    using System.IO.Ports;

    namespace RS232

    {

    public partial class Form1 : Form

    {

    string EntradaStr;

    public Form1()

    {

    InitializeComponent();

    }

    private void Form1_Load(object sender, EventArgs e)

    {

    bool ConSerial = ConnectSerial("COM1");

    }

    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);

    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);

    pesotxt.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;

    }

    private void ComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)

    {

    if (ComPort.IsOpen)

    {

    try

    {

    this.Invoke(new EventHandler(AddRecieve));

    }

    catch (System.TimeoutException a)

    {

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

    }

    }

    }

    int seg = 0;

    private void Timer_leitura_Tick(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);

    }

    }

    }

     

    Blz?

     

    Obrigadão por enquanto... e no teu aguardo!

    segunda-feira, 29 de outubro de 2007 20:06
  • Veja Daniel, quando você declara um event handler, por exemplo:

     

    Code Block
    ComPort.DataReceived += new SerialDataReceivedEventHandler(ComPort_DataReceived);

     

     

    Isso significa que a cada entrada ou atividade na porta serial COM1 que você informou no Load do teu form,  o evento abaixo será disparado.

     

    Code Block

    private void ComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)

    {

    if (ComPort.IsOpen)

    {

    try

    {

    this.Invoke(new EventHandler(AddRecieve));

    }

    catch (System.TimeoutException a)

    {

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

    }

     

     

     

    Portanto, um timer prá escutar na porta selecionada é redundante, tenha certeza que o cabo que você está usando está na pinagem correta que a toledo usa e se a porta serial que você escolheu está operacional.

     

    Até mais.

     

     

    terça-feira, 30 de outubro de 2007 10:41
  • Pois eh... tah certo!

     

    Mas para mim ficar apenas "ouvindo" a porta serial, usando um timer para que cada informação recebida, seja mostrado num textbox ou listbox, qual seria o comando usado???

     

    Tive lendo sobre o Read, ReadLine.... Mas nenhum deu certo... Até porque estou testando esta classe tbm em um Nobreak, que está ligado diretamente a minha Serial COM1, mandando constantemente informações por ela....

     

    Caso eu não tenha sido claro, explico melhor...

     

    Valeu por enquanto!

     

    Daniel

    terça-feira, 30 de outubro de 2007 13:20
  • Daniel, é assim, uma porta serial é baseada em FIFO (first in first out) e quando o buffer dessa porta recebe algum tipo de informação o programa que a abriu dispara um evento como se fosse um OnBufferLoad e descarrega o buffer da porta passando os dados que estão contidos nela prá um evento que irá tratar esses dados.

     

    Eu usei o readline prá ler dados que são passados em formato CHAR, o que pode estar acontecendo é que o dispositivo que passa informações via serial utilize por exemplo o padrão ASCII, daí nos eventos que eu utilizei podem gerar uma Exception ou como pode não gerar nada. Agora, você teria que saber qual o formato de dados que o dispositivo conectado à serial está passando, e se nesse repasse de dados ele usa um caractér específico de abertura de dados e fechamento de dados, o que é padrão em muitos dispositivos de comunicação serial.

     

    E quanto a leitura de tempos em tempos, não é necessário o uso de um timer, porque uma serial com FIFO indica quando ela está com dados em buffer, ou seja, se você colocar um timer prá fazer leitura a cada 15 segundos, é possível que a porta serial identifique como resposta de comunicação e não dê entrada de dados vindos do seu dispositivo, a melhor opção ainda é deixar que, assim que o buffer da serial contiver dados, o aplicativo que abriu essa porta os retire de lá.

     

     

     

    Espero ter conseguido ajudar mais

     

     

    terça-feira, 30 de outubro de 2007 15:43
  • E dai Cristiano...

     

    Cara, te entendi perfeitamente... até tentei mecher um pouco aqui, mas fui feliz... será q não tem alguma coisa ai compilada, para me passar e eu usar aqui como teste? Acho q ai assim vou bem certo onde estou errando!

     

    Ai tu passa para danielsdelima@hotmail.com que eu dou uma olhada aqui e te aviso onde estava a falha...

     

    Blz?

     

    Muito obrigado pela atenção!

     

    quarta-feira, 31 de outubro de 2007 18:16
  • Daniel, eu tenho um outro equipamento aqui que vai utilizar comunicação serial, assim que eu tiver um módulo de comunicação prá esse equipamento, que é menos específico que uma balança, te passo o modulo compilado.

     

    Ok

     

    quinta-feira, 1 de novembro de 2007 10:23
  • Olá Cristiano!!!!

    Cara, queria dizer que apenas hoje consegui colocar o sistema em contato direto com uma balança toledo... e adivinha, funcionou certinho!!!!

    Cara, muito obrigado por sua ajuda... assim que a linguagem vai se propagar cada vez mais!

    Qualquer coisa se eu puder ajudar, pode chamar ai sem galho!

    Valeu!!!
    terça-feira, 6 de novembro de 2007 17:37
  •  

    Ainda bem que funcionou direito Daniel,

     

    Se puder ajudar mais fico a disposição

     

    Abraços

    quarta-feira, 7 de novembro de 2007 11:03
  • Ola Cristiano,

    Adquiri recentemente uma balaca Toeldo PRIX III, e tenho interesse no seu software.

    Obrigado

    Adonai Fernandes
    quarta-feira, 26 de agosto de 2009 05:03
  • Pessoal, minha balança é a 8217 checkout, ela exige que seja enviado um ascII para a balança, tendo assim como retorno o peso. Como envio esse ascII para a balança? Obrigado. Meu e-mail caso tenham algo pronto :  avnnoleto@hotmail.com. Obrigado.
    segunda-feira, 4 de janeiro de 2010 17:47
  • Ola Daniel, Teu sistema ficou bom? estou iniciando no mundo do C# e logo de cara estou enfrentando esse desafio de fazer um comunicação com balanças. estou tentando acompanhar o seu raciocínio, mas como sou iniciante, estou tendo problemas.

    Sera que voce poderia me enviar o fonte deste seu módulo para análise?

    Lhe serei muito grato.

    Atenciosamente;

    Ederson Souza

    terça-feira, 24 de abril de 2012 19:11
  • Estou passando pelo menos problema com balança,

    porem consigo escutar certinho os dados trato as informações vinda em ASCII porem as vez  o peso vem quebrado por exemplo:

    20,4 vem certo

    21,5 vem o 21 e depois vem o 5 como se fosse duas pesagem e depois vem certo

    28,55

    depois vem errado de novo...e assim vai.....

    O que pode ser? vcs já passaram por isso?
    quarta-feira, 1 de agosto de 2012 15:15