Как я могу получить целое число из RFID-метки от Arduino Mega до NodeMCU 1.0 по последовательной связи?

Я хочу, чтобы номер из RFID-метки, считываемый считывателем, подключенным к Arduino Mega, оказался строкой на NodeMCU, подключенном к Mega. Я пытаюсь подтвердить, что строка находится на NodeMCU с помощью последовательного монитора. С кодом ниже последовательный монитор для NodeMCU печатает "receivedChars:" только, а не номер из тега. Что я упускаю?

Код для Arduino Mega


#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 53
#define RST_PIN 5
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Создать экземпляр MFRC522.


String sent = "n";
String UID_string = ""; 

void setup() {

    SPI.begin();            // Init SPI bus
    mfrc522.PCD_Init(); // Init MFRC522 card
    Serial.begin(115200); // Инициализация последовательной связи с ПК
    Serial.println("Running Version Jan5a");
    Serial.println("Mega:Serial Monitor initialized at 115200 baud...");
    Serial3.begin(9600); // Инициализировать последовательную связь с ESP
    Serial.println("Mega:Serial Port 3 for NodeMCU initialized at 9600 baud...");
    Serial.println("Mega: Scan PICC to see UID and type...");
}

////////


void SendUIDtoESP() {

if (sent == "n") {
  Serial.print("sent= ");
  Serial.print(sent);
  //if (UID_string.length() > 0)  {
  UID_string = "Hello World"; //test line
  Serial3.print("<");
  Serial3.print(String(UID_string));
  Serial3.print(">");
  Serial.println("Mega:Sending UID string to ESP");
  sent = "y";
  Serial.print("after sending, sent= ");
  Serial.print(sent);
//  } else {
 //   Serial.println("Mega: Error: UID-string not set yet!");
  //}

}
} // end Send UID to ESP

void loop {
SendUIDtoESP() ;
}

Код для NodeMCU




int numChars = 0;
String receivedChars = "";
boolean newData = false;
String tag = "";
unsigned long lastTime = 0;
unsigned long timerDelay = 5000;


SoftwareSerial s(D1,D2);// назначение контактов для отправки данных и получения данных от NodeMCU к Arduino Mega rx, tx

void setup() {
Serial.begin(9600); 
    s.begin(9600);
    Serial.println("NodeMCU: Waiting for serial connection with Mega to be available over s");
  while (! s.available() >0){
    Serial.print("."); // ожидание
    return;
  }
  Serial.println("NodeMCU: Looks like Mega is available."); 
} // end void setup

 void recvWithStartEndMarkers() { //слушать Мега
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = '<';
    char endMarker = '>';
    char rc;
 
    while (s.available() > 0 && newData == false) {
        rc = s.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                Serial.println(rc);
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // завершает строку
                recvInProgress = false;
                ndx = 0;
                newData = true;     
            }
        }
        else if (rc == startMarker) {
          Serial.println("startMarker received");
            recvInProgress = true;
        }     
    }
} // end recvWithStartEndMarkers()

void loop() {
recvWithStartEndMarkers();
}

, 👍1

Обсуждение

почему Мега? У NodeMCU тоже есть SPI, @Juraj

что это?: Строка UID_string = (Строка)UID_unsigned;, @Juraj

Я думаю, что я взял блок, содержащий эту строку отсюда: https://github.com/miguelbalboa/rfid/issues/63#issuecomment-66874814, @Jonathan Talbot

Я использую NodeMCU для Wi-Fi для Mega (здесь не отражено, чтобы сократить длину кода); Я использую Mega, потому что планирую добавить неизвестное количество компонентов в будущем и думаю, что мне нужны порты., @Jonathan Talbot

Определите, действительно ли последовательная связь работает так, как ожидалось ... начните с простого скетча "привет, мир"., @jsotola

@jsotola вы предлагаете протестировать Мега-отправку "привет, мир" в NodeMCU?, @Jonathan Talbot

да, это гарантировало бы, что два устройства смогут взаимодействовать ... еще одна вещь, при печати "Полученных символов" также печатайте длину "Полученных символов" ... некоторые символы не печатаются, @jsotola

@jsotola Спасибо, что указал мне на этот уровень основ. Похоже, он не работает с жестко закодированным Uid_string = "Привет, мир" в Мега-коде (кажется, ничего не проходит, и значение длины не выводится). Я поработаю над этим. Я где-то читал, что использование SerialMonitor на порту USB micro-B NodeMCU может помешать последовательной связи (особенно D1, D2 / Mega 15,14) с Mega. Может ли это быть проблемой здесь?, @Jonathan Talbot

Ваш код nodemcu также напечатает "receivedChars", если ничего не было получено. Возможно, вы захотите переместить этот код в оператор if конечного маркера (поэтому печатайте только тогда, когда было получено полное сообщение). Как вы соединили mega и nodemcu?, @chrisl

@Обновление jsotola: Я сосредоточился на том, чтобы просто передать "Привет, мир!" и отобразить его на последовательном мониторе для ESP, и это теперь работает. Я удалил раздел RFID, потому что я думаю, что настоящая проблема заключается в преобразовании массива символов в строку на ESP, а не в считывании RFID на Mega. Однако последовательный монитор ESP выводит "Получено от startMarker" в одной строке, а затем каждый символ "Привет, мир!" в другой строке. Если кто-нибудь может помочь мне получить "Привет, мир!" в ESP в виде строки, которую я могу добавить к URL-адресу в качестве параметра, я должен быть настроен (я думаю)., @Jonathan Talbot