Inquiridor
[RESOLVIDO] - Como copiar um trecho de dados de uma string ?

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!
- Tipo Alterado Filipe B CastroModerator segunda-feira, 17 de julho de 2017 13:14 how to
- Editado Lapnasc quarta-feira, 2 de agosto de 2017 15:22
Todas as Respostas
-
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.
- Editado Juliano Nunes Silva Oliveira 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; -
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..