Jump to content
Fórum Script Brasil
  • 0

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


Thiago Lima Costa

Question

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 to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...