2017-04-01 31 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