Bom dia a todos.

Seguinte estou com um problema aqui na leitura de uma serial com o Arduino que se trata do seguinte.

Quando faço a leitura e jogo no Monitor de terminal os dados aparecem mas se eu copiar e colar no notepad nao aparece nada, somente uns riscos.

O código que esta no arduino segue abaixo:

char inData[20]; // Allocate some space for the string
char inChar=-1; // Where to store the character read
byte index = 0; // Index into array; where to store the character

int x;
String str;
String dados;

void setup() {
Serial.begin(9600);
Serial.write("Iniciando");
Serial.write("\n");
}

void loop() 
{
if(Serial.available() > 0)
{
str = Serial.readString();
x = Serial.parseInt();

Serial.print(str);
Serial.print("\n");
delay(100);
Serial.flush();
}
}

Aqui esta a leitura do Monitor:

DATA: 21/09/16 HORA: 09:55:03

U Iniciando Ciclo
Programa Pacotes
U DATA: 21/09/16 HORA: 09:55:15
U Lote: 00000000
Ciclo: 00000000055
Autoclave: 01
Tempo T1
****** Pre-Vacuo ******
00:00 26
00:01 26

Reparem que no texto acima o U no notepad aparece como uma seta virada para esquerda.

Alguem tem uma ideia de como posso resolver isso pois agora eu vou implementar uma logica que vai gravar essa leitura em um pendrive. Parece que no Monitor tem alguns caracters em formato ASCII

Desde ja grato pela ajuda.

Exibições: 1937

Responder esta

Respostas a este tópico

Apenas um chute. Experimente substituir o \n por \r\n ou \n\r.
Não lembro aqui cabeça a sequência correta.

Oi RD, boa tarde.

De onde veem estes dados?

DATA: 21/09/16 HORA: 09:55:03

Iniciando Ciclo ........  

etc.....

Você os  digita no serial monitor?

Pois eles não fazem parte do code.

Rui

Tudo bom.

Estes dados estam dentro do CLP. 

Na verdade eu estou monitorando uma porta serial que o CLP tem. Essa porta esta ligada em uma impressora FH190 Custom.

O meu projeto tem como objetivo remover a impressora, capturar os dados que o CLP envia, guardar em um arquivo texto para posteriormente serem exportados em um PC para uma planilha e dai sim o pessoal responsável faz as impressões que desejarem.

Eu tenho de guardar tudo. O que esta me atrapalhando são so caracteres que não consigo codificar ou troca-los.

Por que você não captura apenas uma faixa de caracteres conhecidos. A faixa entre os 32 e 151 mais o CR (13) e LF(10) seria uma boa tentativa.

Segue um script que montei aqui que faz isso:

char c;
void setup() {
Serial.begin(9600);
Serial.write("Iniciando");
Serial.write("\n");
}
void loop()
{
if (Serial.available() > 0)
{
c = Serial.read();
if ((( c > 31) && ( c < 152 ) ) || ( (c == 13) || ( c == 10))) {
Serial.print(c);
}
delay(50);
}
}

Obs. Não cheguei a testar, apenas compilei.

Nao entendi......

Da uma olhada na tabela ASCII http://ic.unicamp.br/~everton/aulas/hardware/tabelaASCII.pdf

Cada caractere tem uma representação númérica.

No exemplo eu leio caractere a caractere e guardo em uma variável do tipo CHAR, onde só envio para serial quando a variável for dentro de uma determinada faixa.

No caso a faixa entre 32 e 151 abrangem letras, números, espaço, alguns caracteres especiais, acentuação. Já o 10 seria o caractere LN (Line feed), o 13 é o caractere (Car return (ou algo do tipo) que seria o ENTER).

No caso o exemplo que montei segue com um pequeno problema

Em vez de 

if (Serial.available() > 0) // Se tiver algo na serial faça

Deveria vir

while (Serial.available() > 0 ) // Enquanto tiver algo na serial faça

 

Código com alteração:

char c;
void setup() {
Serial.begin(9600);
Serial.write("Iniciando");
Serial.write("\n");
}
void loop()
{
while (Serial.available() > 0 ) // Enquanto tiver algo na serial faça
{
c = Serial.read(); // Leio um caracter do buffer da serial e guardona variável C
if ((( c > 31) && ( c < 152 ) ) || ( (c == 13) || ( c == 10))) { // Testo se está entre 32 e 151 , ou 10 e 13 - Dúvidas leia tabela ASCII
Serial.print(c); // Caso verdade eu envio de volta pela serial
}
delay(50);
}
}

Valeu pela ajuda.

Vou testar e aviso.

Vitor tudo bom.

Testei o programa que vc enviou e resolveu algumas coisas porem nao todas.

Eu fiz um teste em um programa que pega tudo que entra pela serial e ai sim da pra ver o que acontece.

Estou colocando a imagem do resultado.

Uma outra coisa - eu consigo fazer o tratamento do que ler ou não como você fez so que um de cada vez?

Valeu.

Anexos

Não entendi o que quiz dizer com "um de cada vez".

O que seria?

Vi que voce em uma unica linha ja fez o tratamento do que a serial pegar.

Pensei em fazer um if para cada conjunto - funcionaria tambem, nao?

Se voce ver pela imagem ainda tem caracteres que estão passando, entao pensei em tratar eles separado.

Chefe, pela imagem vi que não tem nada acentuado.

Você poderia tratar os números e sinais com a faixa 40 até 62, poderia pegar as letras do alfabeto com a faixa 65 a 122, adiciona espaço (32), enter 13 e lf 10. 

Sem testar apenas aqui ficaria algo mais ou menos assim:

if (

 ((c > 39) && ( c < 63)) // primeira faixa com os números

|| // Ou

((c>64) && ( c < 123)) // Letras maiusculas e minusculas

|| // Ou

((c == 32) /* Espaço*/ || ( c == 13 ) /* ENTER */ || (c = 10) /* LF */)

){

Acredito que o LF é preciso apenas por que você quer ler no notepad, se não me engano ele precisa da combinação CR+LF, mais não tenho certeza.

Provavelmente se abrir no WordPad irá conseguir ver melhor.

Agora uma dúvida, se você pode ler direto no computador para que está utilizando um Arduino ? (Só curiosidade mesmo).

Acontece que esse projeto é para ser colocado em uma central de esterilização em um hospital. Ele fica monitorando os equipamentos de esterilização e gravando os logs da operação.

Hoje esses aparelhos tem impressoras Custom mas a manutenção e a própria impressora custam caro. Então seria uma alternativa para recolher os dados doc Clps das maquina.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço