Ir para conteúdo
Fórum Script Brasil
  • 0

Olá gente tudo bem ! Estou precisando de uma ajudinha ! é o


Thiago Lima Costa

Pergunta

Olá gente tudo bem !!

Estou precisando de uma ajudinha !

é o seguinte queria desenvolver no builder c++ um software onde:

Ler dados da serial, que quando tivesse esse sequencia ex: '123TESTE' e quando ele executasse o cmd, e que isso ficasse em forma de loop, alguém pode me ajudar comecei o código assim:

{

AnsiString Str [8];

int teste;

int x = 0;

ComPort1->ReadStr(Str[x], Count);

if(x == 1)

{

if(Str[1] == '2')

{

x = 1;

x++;

system ("cmd");

}

}

}

Alguém pode me ajudar ?

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Boa tarde!

Assumindo que você já abriu e configurou corretamente a porta e está recebendo os dados, basta comparar as strings como se tivesse recebido de qualquer outro lugar, como o próprio console. Apenas aumente o tamanho do seu buffer de recepção pois, nesse caso, se receber 1 caracter a mais já vai estourar...

Note que os dados podem ainda estar sendo enviados. Nesse caso você deve continuar chamando a função de leitura até receber todo o comando. Mas como eu não conheço essa função que você está usando, não sei como você faria nesse caso. Considerando que a função retorne o número de bytes lidos, tente algo como abaixo:

char Str[1024];

x=0;
while(x<8) {
    x += ComPort1->ReadStr(&Str[x], Count);
}

if(!strncmp(Str, "123TESTE", 8)) {
    shell("cmd");
}

É isso mesmo?

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

  • 0

Amigão,

Até que esta dando mais ou menos certo só que tem um probleminha aqui que tenho que resolver antes tipo:

os dados que lendo dessa serial usei outro programa externo para monitorar e queria que quando recebesse o valor "10 C9 00 2A F3 16" que esta como hexadecimal ele executasse o cmd, mais o problema é que o builder ver a linguaguem dos dados em ASCII e os numeros de 0 à 32 são caracteres não imprimíveis onde temos 10, 16, 00 são exatamente esses caracteres. os valores tem que chegar já convertidos para poderes aparecer no memo já como valor hexadecimal, pela amor de deus me ajuda ?

Link para o comentário
Compartilhar em outros sites

  • 0

Oi!

Eu não entendi uma coisa: você recebe os dados byte a byte com os valores que você citou ou a string já formatada?

Eu acho que você recebe byte a byte. Dessa forma você não pode compara como se fosse uma string. Tem que fazer a comparação byte a byte também!

Me mande exemplos de dados, trechos de códigos... Assim fica mais fácil entender o problema e encontrar a solução.

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

  • 0

Amigão,

o meu problema é o seguinte, tenho um sistema de automação onde tem um bug, que trava o processo de comunicação chamado IEC 101, para normalizar bastar da um start/stop no processo do IEC101, no meu caso queria monitar a comunicação do mesmo mais via socket TCP/IP.

Nos monitoramentos que realizei observei que, quando a comunicação falha e o protocolo falha ele fica solicitando a reitegração do sistema através deste pacote "10 C9 00 2A F3 16" (que não é um pacote bit a bit, mais sim um pacote inteiro). Como lhe informei quando monitoro esses pacote arquivando os dados no Memo->Text os valores dos caracteres não imprimiveis, não aparecem. Por esse motivo queria saber como tratar da melhor maneira este pacote, para quando esta informação subir ele execute o comando no builder

system ("sc stop iec101slave");

system ("sc start iec101slave");

O meu grande problema é tratar esses caracteres que na linguagem de codigo ACII, não são imprimiveis como texto no Builder C++

Intendeu agora ?

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia!

Estou começando a entender agora... :)

Eu não conhecia esse protocolo. Eu procurei sobre ele e não achei muita coisa.

Primeiro: para monitorar uma porta de rede use o wireshark. Talvez até você esteja usando ele mas de qualquer forma fica a dica. :)

Quanto ao problema em si, o que eu quis dizer sobre receber byte a byte é que o seu programa primeiro recebe um byte com o valor 10, depois outro com o valor c9 e assim por diante, correto? Você não recebe a string sendo primeiro o número 1, depois o número 0, depois o espaço...

Eu não sei o que é esse memo mas de qualquer forma é aí que está o seu problema. Você não pode jogar em uma variável de texto os dados recebidos. Eles não são um texto!

E se você está monitorando os dados e salvando nessa Memo->Text então você tem um código não é? Coloque o código aqui no fórum, mesmo que não seja inteiro, apenas para podermos discutir em cima de algo mais concreto.

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

  • 0

Amigão,

o valor "10:C9:00:2A:F3:16" é um string já formado e estou demostrando a você em hexadecimal, pois o valor em ASCII seria "???*??", onde as interrogações serie os caracteris não impimiveis.

Coloca o valor hexadecimal no link abaixo e veja a conversão para ASCII, vera que os caracteres não imprimiveis não aprecem, desta forma não tenho como comparar no builder pois o builder ver em ASCII,

10:C9:00:2A:F3:16

Conversor Online

Link para o comentário
Compartilhar em outros sites

  • 0

Ok.

Então você recebe 6 bytes e os valores em hexadecimal são o que você me mostrou. Esses dados são do tipo char (1 byte) mas não são ASCII. Dessa forma você não pode usar nenhuma função de string para trabalhar com estes dados.

Veja o programa de teste que eu fiz: você primeiro digita o número de elementos e depois digita o valor de cada elemento. Eu armazeno em um array de char e depois faço a comparação. Imagine que essa parte digitada é o valor que você recebeu e a comparação é o que você precisa fazer no seu caso.

Diga se isso resolve seu problema!

#include <stdio.h>

#define MAX 100

int bincmp(char *buffer, int size)
{
    int  i;
    char teste[MAX] = { 0x10, 0xC9, 0x00, 0x2A, 0xF3, 0x16 };

    for(i=0; i < size; i++) {
        if(buffer[i] != teste[i])
            return 0;
    }

    return 1;
}

int main(void) {
    int  size, i;
    char buffer[MAX];

    printf("Quantidade de elementos: ");
    scanf("%d", &size);

    if(size > MAX) {
        printf("Maximo %d elementos!\n", MAX);
        size = MAX;
    }

    for(i=0; i<size; i++) {
        printf("Digite o valor do elemento %3d: ", i);
        scanf("%d", (int *)&buffer[i]);
    }

    printf("Valor OK ? %s\n", bincmp(buffer, size) ? "sim" : "não");

    return 0;
}

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...