Thiago Lima Costa Postado Outubro 12, 2012 Denunciar Share Postado Outubro 12, 2012 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 ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcelo Utikawa da Fonseca Postado Outubro 16, 2012 Denunciar Share Postado Outubro 16, 2012 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thiago Lima Costa Postado Outubro 17, 2012 Autor Denunciar Share Postado Outubro 17, 2012 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 ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcelo Utikawa da Fonseca Postado Outubro 17, 2012 Denunciar Share Postado Outubro 17, 2012 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thiago Lima Costa Postado Outubro 18, 2012 Autor Denunciar Share Postado Outubro 18, 2012 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 ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcelo Utikawa da Fonseca Postado Outubro 18, 2012 Denunciar Share Postado Outubro 18, 2012 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thiago Lima Costa Postado Outubro 18, 2012 Autor Denunciar Share Postado Outubro 18, 2012 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:16Conversor Online Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcelo Utikawa da Fonseca Postado Outubro 19, 2012 Denunciar Share Postado Outubro 19, 2012 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; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thiago Lima Costa Postado Outubro 19, 2012 Autor Denunciar Share Postado Outubro 19, 2012 Cara valeu deu certo certo o código que você mandou, fiz só as adequações para o meu uso e deu beleza !!Muito obrigado ! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Thiago Lima Costa
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
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.