2017-04-01 139 views
0

我正在使用名爲IDCartao的全局字符串變量來保存來自rfid卡的ID。在搜索到ID後,我在帶有enc28j60的服務器上搜索它們,如果ID在服務器上,我發出一聲嘟嘟聲,如果不是,則發出兩聲嘟嘟聲。但是,我有全局字符串IDCartao在函數循環中有問題,它具有正確的ID值,但是當我在另一個名爲my_callback的函數中搜索此值時,我沒有正確的值,我只需要有空字符串「」。具有不同函數中的兩個值的全局變量Arduino

/** 
* Pinagem Leitor RFID: 
* CLK  - Pino 13 
* MISO - Pino 12 
* MOSI - Pino 11 
* SDA  - Pino 10 
* RST  - Pino 09 
* GND  - GND Arduino 
* 3.3  - 3.3v do Arduino 
* NC  - Não Conectado 
*/ 

/** 
* Pinagem Módulo Ethernet: 
* 5v  - Não Conectado 
* LNT - Não Conectado 
* CLK - Não Conectado 
* SO  - Pino 12 
* WOL - Não Conectado 
* SCK - Pino 13 
* ST  - Pino 11 
* RST - Não Conectado 
* CS  - Pino 8 
* Q3  - 3.3v do Arduino 
* GND - GND Arduino 
*/ 

/** 
* Pinagem de Outros componentes: 
* BUZZER - Pino 7 
*/ 

//DECLARAÇÃO DAS BIBLIOTECAS UTILIZADAS NO PROJETO 
#include <SPI.h> //Biblioteca que permite a comunicação com dispositivos SPI (Serial Peripheral Interface), sendo o Arduino como dispositivo principal 
#include <MFRC522.h> //Biblioteca do Leitor RFID 
#include <EtherCard.h> //Biblioteca do Módulo Ethernet 


//DECLARAÇÃO DOS PINOS UTILIZADOS NO ARDUINO 
#define PINO_SDA 10 //Constante que define onde o pino SDA do leitor RFID está ligado 
#define PINO_RST 9 
#define BUZZER 7 

MFRC522 mfrc522 (PINO_SDA, PINO_RST); //Cria instância MFRC522 
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; //mac do módulo ethernet 
byte Ethernet::buffer[500]; 
static uint32_t timer; 
const char website[] PROGMEM = "192.168.0.103"; //endereço IP do servidor no Raspberry Pi 
String conteudo;  //Armazena nessa variável todas as informações contidas no servidor 
unsigned int tamanho; //variável para guardar o tamanho do retorno do servidor 
static char *IDCartao; 

//ESCOPO DAS FUNÇÕES 
void lerID(); 
void my_callback (byte status, word off, word len); 
void acessoLiberado(); 
void acessoNegado(); 
void testaValor(); 

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


    SPI.begin(); 
    pinMode (BUZZER, OUTPUT); 
    mfrc522.PCD_Init(); //Inicia MFRC522 (Leitor RFID) 
    delay(100); 
    if (ether.begin(sizeof Ethernet::buffer, mymac, 8) == 0) { 
    Serial.println("Falha ao acessar o Modulo Ethernet"); 
    } 
    else { 
    Serial.println("Modulo Ethernet conectado!"); 
    } 
    if (!ether.dhcpSetup()) { 
    Serial.println("DHCP failed"); 
    } 
    ether.printIp("IP: ", ether.myip); 
    ether.printIp("GW: ", ether.gwip); 
    ether.printIp("DNS: ", ether.dnsip); 

    if (!ether.dnsLookup(website)) { 
    Serial.println("DNS failed"); 
    } 
    ether.printIp("SRV: ", ether.hisip); 
    delay(100); 
    IDCartao = (char*) calloc (12, sizeof(char)); 
    Serial.println("Setup finalizado!"); 
    Serial.println ("Aproxima"); 
    *IDCartao = "WAGNER"; 
} 

void loop() { 
    ether.packetLoop(ether.packetReceive()); 
    //String card = lerID(); 
    //card.toCharArray(IDCartao, card.length()+1); 
    //*IDCartao = lerID(); 
    lerID(); 
    if (IDCartao[0] != '\0') { //Se um cartão tiver sido aproximado e sua ID lida com sucesso 
    //Serial.print ("ID DO CARTAO: "); 
    //Serial.write (IDCartao); 
    delay(100); 
    if (millis() > timer) { 
     Serial.println("VAI LER SITE"); 
     timer = millis() + 5000; 
     Serial.println(); 
     testaValor(); 
     ether.browseUrl(PSTR("/"), "", website, my_callback); 
    } 
    delay(5000); 
    testaValor3(); 
    Serial.println("CONTEUDO:"); 
    Serial.print(conteudo); 
    } 

} 

void testaValor() { 
    Serial.println ("DENTRO DO TESTA VALOR"); 
    Serial.write(IDCartao); 
    Serial.println ("\nSUCESSO"); 
} 
void testaValor2() { 
    Serial.println ("DENTRO DO TESTA VALOR 2"); 
    Serial.write(IDCartao); 
    Serial.println ("\nSUCESSO"); 
} 
void testaValor3() { 
    Serial.println ("DENTRO DO TESTA VALOR 3"); 
    Serial.write(IDCartao); 
    Serial.println ("\nSUCESSO"); 
} 

void lerID() { 
    if (mfrc522.PICC_IsNewCardPresent()) { 
     if (mfrc522.PICC_ReadCardSerial()) { 
     String conteudorfid = ""; 
     byte letra; 
     for (byte i = 0; i < mfrc522.uid.size; i++) { 
      conteudorfid.concat (String (mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); 
      conteudorfid.concat (String (mfrc522.uid.uidByte[i], HEX)); 
     } 
     conteudorfid.toUpperCase(); 
     int i; 
     for (i = 0; i < conteudorfid.substring(1).length(); i++) { 
      IDCartao[i] = conteudorfid.substring(1)[i]; 
     } 
     i++; 
     IDCartao[i] = '\0'; 
     } 

    //Serial.println(IDCartao); //ID do cartão lida com sucesso 
    } 
    else { 
     IDCartao[0] = '\0'; 
    } 
} 

/** 
* Função que faz a leitura do servidor armazenando seu conteudo numa String 
*/ 
void my_callback (byte status, word off, word len) { 
    testaValor2(); 
    Ethernet::buffer[off+500] = 0; 

    conteudo = (const char*) Ethernet::buffer + off; 

    String verifica(IDCartao); 

    if (conteudo.indexOf(verifica) > 0) { //procura pela ID do cartão no servidor 
    Serial.println("Acesso liberado"); 
    Serial.println(verifica); 
    Serial.print ("POSICAO: "); 
    Serial.println (conteudo.indexOf(verifica)); 
    acessoLiberado(); 
    } 
    else { 
    Serial.println ("ACESSO NEGADO!"); 
    Serial.print ("CARTAO VERIFICA: "); 
    Serial.println (verifica); 
    Serial.print ("IDCartao: "); 
    Serial.write (IDCartao); 
    acessoNegado(); 
    } 
} 

void acessoLiberado() { 
    tone(BUZZER, 1000); //1kHz 
    //digitalWrite (LED_VERDE, HIGH); 
    delay (300); 
    noTone (BUZZER); 
    //digitalWrite (LED_VERDE, LOW); 
    *IDCartao = ""; 
} 

void acessoNegado() { 
    tone (BUZZER, 1000); 
    //digitalWrite (LED_VERMELHO, HIGH); 
    delay (150); 
    noTone (BUZZER); 
    delay (150); 
    tone (BUZZER, 1000); 
    delay (150); 
    noTone (BUZZER); 
    //digitalWrite (LED_VERMELHO, LOW); 
    *IDCartao = ""; 
} 

This is what happens. Look at the function testaValor2(), is the second function wich is called but she is called after testaValor3(). I don't know why this is happening. Sorry for the bad quality

+0

不是說英語是世界上唯一的語言,但你可能會得到,如果你翻譯的絕大多數詞彙(註釋,標識符),創造更多可讀的代碼更多的幫助;對大多數人來說。只是減少障礙。有憐憫;-) – Yunnosch

+0

我也忍不住想它可能不是一個MCVE。(http://stackoverflow.com/help/mcve) – Yunnosch

+0

函數'lerID'並不總是返回一個字符串。只要看看'else {}'部分發生了什麼。 –

回答

0

當多個功能正在編輯的全局變量,你需要讓他們揮發。例如,實例化IDCartao這樣的:

volatile String IDCartao; 

這迫使Arduino的每一個被請求時從內存中獲取的IDCartao最新值。

此處瞭解詳情:https://www.arduino.cc/en/reference/volatile

+0

感謝你回答mineralwasser,但現在我有另一個麻煩。 我現在使用揮發性字符串,但是當我編譯代碼我得到一些錯誤信息,如: 沒有匹配函數調用「HardwareSerial ::的println(揮發性串)」 你知道我需要什麼要做什麼來解決這個問題? –

+0

這可能是因爲你正在使用String對象(C++/Wiring),但該函數使用C字符串。退房:http://stackoverflow.com/questions/16290981/how-to-transmit-a-string-on-arduino。 基本上,需要轉換到CharArray(字符*): '字符* CSTRING =(字符*)malloc的(的sizeof(char)的*(outMessage.length()+ 1);' 'outMessage.stoCharArray( cString,outMessage.length()+ 1);' 'Serial1.write(cString);' – mineralwasser

+0

關於第二個想法,不要使用易失性字符串,而應該使用char數組來源:http://forum.arduino。 cc/index.php?topic = 225061.0 – mineralwasser