none
[RESOLVIDO] - Como copiar um trecho de dados de uma string ? RRS feed

  • Discussão Geral

  • Boa tarde pessoal.

    Estou iniciando na área de programação e estou desenvolvendo uma aplicação de comunicação serial, onde, recebo strings de dados com algumas informações na qual preciso separá-las por categorias, por exemplo:

    Uma string de conexão : STX8abcdefETX<CRC>

    Uma string de Parâmetros: STXNabcdefETX<CRC>

    onde, o CRC possui dois caracteres.

    O que preciso fazer é monitorar a porta serial e quando chegar a string, identificar o inicio (STX), continuar lendo a mesma até encontrar o (ETX), contar mais dois caracteres e inserir em um listbox, o conteúdo lido.

    As strings chegam todas juntas, por exemplo: STX8abcdefETX<CRC>STXNabcdefETX<CRC>, qual método utilizar ? Pois já utilizei Substring, split, mas como os tamanhos podem variar, as vezes pego o conteúdo errado.

    Obrigado pela ajuda!


    quinta-feira, 13 de julho de 2017 17:41

Todas as Respostas

  • Lapnasc,

    Você deve estar utilizando o método ReadLine, por isso todo conteúdo vem de uma só vez.

    Tente substituindo pelo Read (https://msdn.microsoft.com/pt-br/library/34t733fh(v=vs.110).aspx), com ele você consegue especificar a quantidade de caracteres devem ser lidos por vez.


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.


    quinta-feira, 13 de julho de 2017 18:23
  • Bom dia Juliano, obrigado pelo retorno.

       Eu não uso o ReadLine, estou usando o ReadExisting. Abaixo ilustro o incio de meu código na recepção serial.

     public void RecepcaoSerialControleProtocoloStx(object s, EventArgs e)
            {
                //************************INICIO RECEPÇÃO DE DADOS ***********************************************//
                //DATA DA ALTERAÇÃO: 28/06/2017
                //CRIADO POR: LUCIANO NASCIMENTO

                Thread.Sleep(400);
                bufferRx += bufferRx = Program.frmPrincipal.serialCom.ReadExisting();

                Crc crc = new Crc();
                string _valores = bufferRx;

                char[] separadores = new char[] { ';', ',', '/', '-', '.', 'S', '\r', '\n' };
                //char[] separadores = new char[] { 'S','\n','\r' };

                string[] arr = _valores.Split(separadores, StringSplitOptions.RemoveEmptyEntries);

                foreach (var item in arr)
                {
                    try
                    {
                        stringFinal = "S" + item;

                        listBox1.SelectedIndex = listBox1.Items.Count - 1;
                        listBox1.SelectedIndex = -1;
                        listBox1.Items.Add(bufferRx);

                        stx = stringFinal.Substring(3, 1);

                        switch(stx)
                        {
                            case "N":                            
                                txtTamanhoJn.Text = stringFinal.Length.ToString();
                                txtStringRecebida.Text = stringFinal;
                               
                                crc.enviaCrc = stringFinal.Substring(0, 269);
                                crc.calculaCrc(stringFinal.Substring(0, 269));


                                txtCrcAscNrecebido.Text = stringFinal.Substring(269);
                                string ascJnRecebido = txtCrcAscNrecebido.Text;

                                txtCrcAscJn.Text = crc.recebeCrc;
                                string ascJn = txtCrcAscJn.Text;

                                txtCrcHexJn.Text = crc.recebeCrcHex;
                                
                                if (ascJn == ascJnRecebido)
                                {
                                    pnlGreenStxJn.BackColor = Color.LightGreen;
                                    pnlRedStxJn.BackColor = Color.Gainsboro;
                                }
                                else
                                {
                                    pnlRedStxJn.BackColor = Color.Red;
                                    pnlGreenStxJn.BackColor = Color.Gainsboro;
                                }
                                break;

    sexta-feira, 14 de julho de 2017 13:49
  • Boa tarde a todos...

    Após alguns dias quebrando a cabeça, consegui equacionar o problema ..segue abaixo a solução:

    while (true)
                {
                    posicaoSTX = bufferRx.IndexOf("STX");

                    if (posicaoSTX != -1)
                    {
                        posicaoETX = bufferRx.IndexOf("ETX");
                        if (posicaoETX != -1 && (bufferRx.Length >= (posicaoETX + 5)))
                        {
                            posicaoETX += 3;
                            stringFinal = bufferRx.Substring(posicaoSTX, (posicaoETX - posicaoSTX) + 2);
                            bufferRx = bufferRx.Remove(0, posicaoETX);
                            trataProtocolo(stringFinal);
                        }
                        else break;
                    }
                    else break;
                }

    Agradeço aos amigos pelas sugestões..

    quarta-feira, 2 de agosto de 2017 15:12