Como enviar dados via serial para um nodeMCU

Olá

Estou tentando enviar um código de barra de um Mega para um nodeMCU esp8266. Eu já consigo ler dados corretamente com o nodemcu, o meu problema é como enviar esse código de barras do mega de forma correta. Eu estou usando o mega com um shield usb acoplado para conectar o leitor de código de barras, este código chega para mim em decimal da tabela ASCII, por isso aquela condição “if(key>=48 && key <=57)”. Quando escrevo Serial1.write(key) o mega simplesmente transforma meu código de barras que estava sendo lido certo em números “1”. Se alguém puder me ajudar ficarei extremamente grato, é para meu TCC.

CÓDIGO:

#include <Usb.h>
#include <usbhub.h>
#include <hidboot.h>

USB Usb;
//USBHub Hub(&Usb);
HIDBoot<HID_PROTOCOL_KEYBOARD>
Keyboard(&Usb);

class KbdRptParser : public KeyboardReportParser
{

protected:
virtual void OnKeyDown (uint8_t mod, uint8_t key);
virtual void OnKeyPressed(uint8_t key);
};

void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
uint8_t c = OemToAscii(mod, key);

if (c)
OnKeyPressed(c);
}

/* what to do when symbol arrives */
void KbdRptParser::OnKeyPressed(uint8_t key)
{
static uint32_t next_time = 0; //watchdog
static uint8_t current_cursor = 0; //tracks current cursor position

next_time = millis() + 200; //reset watchdog

if(key>=48 && key <=57)

//Serial.print(key - 48);
Serial1.write(key-48);
Serial.print(Serial1.write(key-48));

};

KbdRptParser Prs;

void setup()
{
Serial.begin( 115200 );
Serial.println(“Start”);
Serial1.begin (115200);
if (Usb.Init() == -1) {
Serial.println(“OSC did not start.”);
}

delay( 200 );

Keyboard.SetReportParser(0, (HIDReportParser*)&Prs);

delay( 200 );
}

void loop()
{
Usb.Task();

}

Code_scanner_without_liquidcrystal_By_Oleg.ino (1.25 KB)

Primeiro, o que é que já fizeste para perceber o problema?
Já meteste o Mega ligado ao computador para garantir que os dados são enviados correctamente?
Já enviaste dados como uma string entre ambos para perceber se a comunicação funciona?

Porque fazes isto?

Serial1.write(key-48);

Porque não print? Aliás porque não fazer um print sem converteres de ASCII para binário? Estás a enviar um byte... enviar em binário ou em ASCII é igual. Ou pretendes depois enviar algo diferente?

Já pensaste que a ordem interna dos bytes pode ser diferente entre os dois chips?

Por último, o NodeMCU parece ter duas portas série... porque não evitar a ligação USB entre os dois?

Olá amigo, boa tarde.

Bom, desde o início.

Primeiro: Percebemos o problema na leitura feita no NodeMCU. O Node estava ligado ao PC e fizemos uso do monitor serial, enquanto liamos os dados do Mega.

Segundo: Sim. Se o que está perguntando é em relação a leitura feita no Mega, utilizamos o monitor serial para conferir o código. No caso, (Key - 48) nos gera o código de barras correto.

Terceiro: Como string não. Mas a comunicação já foi feita da maneira demonstrada no código anexado. Na verdade é ai que se encontra o problema. O Node lê algo do tipo"111111". Pra conferirmos, fizemos um print da função Serial.write que utilizamos. No próprio monitor serial do Mega é mostrado o "111111". Portanto, o erro não se encontra na leitura feita pelo NodeMCU. Por algum motivo, o código que lemos corretamente assim como explicado na segunda parte, é convertido no código errado "111111".

Quarto: Nós já testamos com print também. O erro persistiu da mesma maneira.

Quinto: Durante alguns testes feitos com o Node tivemos problemas para usar as portas Seriais. Contudo, no momento estamos utilizando SoftwareSerial, que funcionou bem, tanto na leitura do Mega quanto para leitura de um outro dispositivo serial utilizado no projeto.