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

Beleza. Estava só curioso mesmo.

Boa tarde Vitor tudo bom.

So mais uma curiosidade - como eu faco para pegar os caracteres em Hexa?

Pergunto porque você reparou que naquela imagem que eu mandei tem varias chamadas para 0D, 0A e 1B

Teria como eu tratar isso ai também?

Valeu

Boa tarde.

Tudo bem sim.

Se for para comparar na codificação basta você usar com essa notação 0x00 (onde 00 é o código hexa). Agora se for para imprimir na serial o código hexa na função Serial.print, aceita um segundo parâmetro onde você passa o tipo de codificação, no caso para hexa o segundo parâmetro seria HEX. Ficaria assim "Serial.print(c, HEX);"

Qualquer dúvida veja a documentação no site arduino.cc https://www.arduino.cc/en/Serial/Print 

Blz.

Valeu mesmo. Vou testar e aviso depois.

Bom conforme eu havia falado segue o que aconteceu.

Consegui ler os dados e gravar em um arquivo de log.

Acontece que ainda esta vindo alguns caracteres indesejados.

O codigo fonte de como ficou no Arduino segue abaixo

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

int x;
String str;
String dados;

#include <SD.h>
//Pino CS do arduino UNO
#define CS 4
File myFile;
#define FILENAME "testeLog.txt"

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


pinMode(CS, OUTPUT);//Inicializando pino CS como output
if (!SD.begin(CS)) {//Inicializando SD card
Serial.println("Falha!");
return;
}
}

void loop()
{

if(Serial.available() > 0)
{
myFile = SD.open(FILENAME, FILE_WRITE);//Abrindo arquivo para gravacao
if (myFile)
{
while (Serial.available() > 0 ) // Enquanto tiver algo na serial faça
{
inChar = Serial.read(); // Leio um caracter do buffer da serial e guardona variável C
if ((( inChar > 31) && ( inChar < 152 ) ) || ( (inChar == 13) || ( inChar == 10) || (inChar != 27) || (inChar != 2))) { // Testo se está entre 32 e 151 , ou 10 e 13 - Dúvidas leia tabela ASCII
str = Serial.readString();

// String novaStr = str;
// novaStr.replace("U","");
Serial.print(str);

myFile.println(str);
myFile.println("\n");

Serial.print("\n");
delay(100);
// novaStr = "";
str = "";

myFile.close();
Serial.flush();
}
}
}
}
}

Tambem estou colocando em anexo como esta o arquivo texto recolhido no Sd Card.

Se alguem tiver alguma sugestao de como limpar este log.....

Grato.

Anexos

Boa noite.

Amigo restrinja mais as opções.

Pelo que vi, no exemplo, você tem basicamente números, letras, espaço, ENTER e alguns outros caracteres como _ - * ! . :  .

Dai só você ir alterando a sua condição (o IF).

Tenha paciência, pegue um arquivo inteiro (com tudo) como controle, provavelmente não vai abrir direito no notepad, mais talvez abra no WordPad, notepad++ , textpad entre outros. Vá construindo a sua condição aos poucos e testando.

Um exemplo abaixo de sugestão de faixas de caracteres:

Números: (c > 47) e (c  < 58)

Letras minusculas: (c > 96) e ( c < 172)

Letras maiúsculas:  ( c > 64) e ( c < 91)

@ : ( c == 64)

: (dois pontos) : ( c == 58)

Boa sorte ai.

Boa noite Vitor tudo bom.

Valeu mesmo pela dica, vou fazer.

Acontece de programação c++ eu não manjo muito. O meu ramo de trabalho é com Vb. Net voltado para automação industrial, supervisorio entre outras coisas então apanho um pouco nisso aí mas vamos lá. 

Vou fazer aqui e vou postando o resultado.

Abraço

Seguinte, to com uma duvida aqui.

Eu instalei o Notepad++ e fiz um print da tela aqui. Como eu posso fazer para tratar estes dados aqui sendo que parece que alguns deles nao sao ASC.

Se puder me orientar novamente te agradeco.

Anexos

Boa noite.

Chefe são ASCII sim, da uma olhada nessa outra tabela desse link http://187.7.106.14/marcelo/org_comp/tabelaASCII.pdf.

Pela imagem olha os códigos que consegui extrair

LF = 10
CR = 13
ESC = 27
STX = 2
SOH = 1

Agora como já conhecemos os valores não "imprimíveis" acredito que fica mais fácil o tratamento. Você poderia tentar uma técnica agora inversa da que tentou. No caso o código excluía todas as possibilidades permitindo apenas algumas faixas, acredito que como conhecemos os valores dos caracteres "problemáticos" agora, seja mais fácil fazer o inverso, permitir tudo bloqueando/filtrando apenas os caracteres determinados. 

Acredito que algo do tipo : 

/* Remove os caracteres STX = 2, SOH = 1 e ESC = 27
permitindo passar o restarnte. É preciso apenas ver
como fica o tratamento da quebra de linha, pois para
padrão notepad windows seriam a combinação de 10+13 (LF + CR) (ou invertido)
*/
if (( c > 2) && ( c != 27 ) ){
Serial.print(c);
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço