Bom dia a todos,

Preciso realizar a leitura de um produto via código de barras e capturar a informação do código para realizar outras ações, mas só consegui imprimir a informação na serial, pois ele imprime caracter a caracter. Preciso capturar essa informação e colocar em uma variável mas já procurei em vários lugares e não descobri como fazer.

Segue parte código usado nesse teste.

void setup()
{
   Serial.begin( 115200 );
   Serial.println("Start");
   

   if (Usb.Init() == -1) {
    Serial.println("OSC did not start.");
   }

   delay( 200 );

   HidKeyboard.SetReportParser(0, &Prs);
}

void loop()
{
   Usb.Task();//aqui eu queria colocar o valor em uma variável e não consigo
}

Exibições: 348

Responder esta

Respostas a este tópico

Bom dia GBS,

Recomendações:
1. Remova seu sketch da área de texto do seu tópico;
2. Leia http://labdegaragem.com/forum/topics/sugest-o-de-como-postar
3. Comente as linhas do seu sketch. Fica mais fácil entender o que vc quer fazer com cada
     linha e facilita a ajuda.
4. Clique em : " Deseja carregar arquivos? " e depois em " Escolher arquivo" e anexe o arquivo
    com o seu sketch.

RV

Qual arduino esta usando ?

Qual o modelo do leituro ?

Qual biblioteca ?

Adianto que pergunto algumas vezes para complementar a informaçao enriquecendo o site. Outro que veja logo depois pode pegar seu exemplo de hardware e dar continuidade. Pode ajudar mais gente... Não necessariamente afeta a resposta. Mas o intuito é transformar seu "case" num tutorial, até. 

Se entendi ja funciona mandando para a serial mas nao vi onde ele manda para a serial.

Nao conheco esse leitor e biblioteca, mas pelo resultado do google diria que é essa:

https://github.com/felis/USB_Host_Shield_2.0/blob/master/examples/H...

Que tem o trecho:

void KbdRptParser::OnKeyPressed(uint8_t key)
{
Serial.print("ASCII: ");
Serial.println((char)key);
};

Onde de fato ele retorna, por absurdo que pareça, apenas para a serial. Aih é Void...

Sugiro modificar esse trecho.

Criar 2 variaveis globais.

Uma string e uma bool.

A cada novo caracter encontrado vc adiciona o caracter na string. 

Se for um enter em vez de acrescentar vc seta a variavel bool, que vai indicar que recebeu uma linha completa.

A ultima vez que usei leitores de codigo de barras para PC adaptados para microcontrolador eles ainda eram PS2 (o conector e não o videogame) . Naquela epoca vc recebia exatamente igual a uma digitaçao e tinha uma configuraçao por strap para adicionar um enter ao final. Sempre vinha ligado, melhor forma.

Boa tarde, 

Me parece que seu Barcode reader usa USB, não é ?

Esta usando Host Shield ? Ou Arduino DUE ?

https://www.circuitsathome.com/mcu/connecting-barcode-scanner-ardui...

Se fosse Barcode serial :

https://arduino.stackexchange.com/questions/8473/how-to-get-serial-...

1 - Estou usando arduino UNO

2 - Leitura via USB

3 - Bibliotecas utilizadas no pacote: USB_Host_Shield-master

usbhid.h
usbhub.h
hiduniversal.h
hidboot.h
SPI.h

4 - Ao Chamar o método Usb.Task(), ele já imprimi o valor na serial

Vou tentar fazer o que mencionou acima, mas não estou encontrando esse método dentro da biblioteca.

Obrigado desde já.

Então é só verificar na biblioteca qual o tipo do retorno, então você armazena em uma variável, tipo:

var teste = Usb.Task();

Foi a primeira tentativa que fiz, colocar USB.task() em uma variável, mas o problema é que esse método retorna um carácter a cada Loop(). Então se o código de barras te 10 números ex: 1527482645. A cada Loop ele imprime um caracter até chegar no final da sequência numérica.

Então, na minha dica, se vc for somando em uma String, vide:

https://www.arduino.cc/reference/en/language/variables/data-types/s...

Vc pode criar uma string e ir adicionando os caracteres que vierem nela. 

Quando vc perceber (if) que veio o enter (\n) vc processa o conjunto que veio.

Aproveitei a madrugada para ler sobre essa biblioteca, funções e métodos, até abrir partes dos seus códigos, notei que não é no USB.Task() que está imprimindo, está apenas fazendo com que a biblioteca execute suas tarefas (Meio óbvio rsrs), então ela possui métodos que fazem a captura do que foi executado, para esse caso de teclado, você vai ter que usar KbdRptParser::OnKeyPressed, que no momento deve está assim:

void KbdRptParser::OnKeyPressed(uint8_t key)
{
   Serial.print("ASCII: ");
   Serial.println((char)key);
};

Ou seja, ela captura o resultado da tarefa e imprime, para adaptar para as suas necessidades, seria algo mais ou menos assim:

// Antes de tudo precisa ter uma string para armazenar o conteúdo que vai ser juntado

String conteudo = "";

void KbdRptParser::OnKeyPressed(uint8_t key)
{
   //Serial.print("ASCII: ");
   //Serial.println((char)key);

   conteudo += (char)key;
}; 

Aí você analisa esse conteudo e quando receber "\n", significa que chegou ao final da informação.

Só lembrando que quando receber o final da informação você deve limpar a string para receber a nova informação que pode chegar, apenas com conteudo = "";

Para chegar a essa conclusão, eu abrir o arquivo Usb.cpp da biblioteca e também dei uma lida em alguns tópicos, mas principalmente esse abaixo:

https://www.circuitsathome.com/mcu/connecting-barcode-scanner-ardui...

Não sei se entendi, mas seria para criar o método: KbdRptParser::OnKeyPressed(uint8_t key) no arquivo Usb.cpp, porque não encontrei ele nesse arquivo.

Outra coisa é que o único print que encontro no método é o da imagem abaixo:

Obrigado pelo feedback de vcs, fiquei meio ocupado com outros problemas e vou mexer novamente no código na segunda-feira. Aí compartilho o resultado com vcs.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço