2013-01-31 32 views
1

我试图让我的arduino使用gps和gprs盾牌。到现在为止还挺好。 我的代码工作时,我有评论线评论和停止工作,如果我取消他们的注释。取消注释代码时的奇怪行为

甚至更​​早的事件失败。例如,我必须输出GPRS RegisteredGPRS AT Ready,但它不会发生。

有没有可能导致我的arduino受损?

这是代码。

请注意,我测试了我用盾牌发送到gprs盾牌的命令,它的工作原理。

#include <SoftwareSerial.h> 
#include <TinyGPS.h> 

#define BUFFSIZ 90 

int GPRS_Registered; 
int GPRS_AT_Ready; 

char incoming_char = 0; 
char buffidx; 
char at_buffer[BUFFSIZ]; 

int firstLoop = 1; 

TinyGPS gps; 
SoftwareSerial cell(2,3); 
SoftwareSerial uart_gps(0,1); 

void sendSMS(char *msg){ 
    cell.println("AT+CMGF=1"); 
    cell.print("AT+CMGS="); 
    cell.write(34); 
    cell.print("A number here"); 
    cell.write(34); 
    cell.println(""); 
    delay(500); 
    cell.println(msg); 
    cell.write(26); 
    delay(15000); 
} 

void readATString(){ 
    char c; 
    buffidx = 0; 

    while(true){ 
    if(cell.available() > 0){ 
     c = cell.read(); 
     if(c == -1){ 
     at_buffer[buffidx] = '\0'; 
     return; 
     } 

     if(c == '\n'){ 
     continue; 
     } 

     if((buffidx == BUFFSIZ - 1) || (c == '\r')){ 
     at_buffer[buffidx] = '\0'; 
     return; 
     } 

     at_buffer[buffidx++] = c; 
    } 
    } 
} 

void processATString(){ 
    if(strstr(at_buffer, "+SIND: 8") != 0){ 
    GPRS_Registered = 0; 
    Serial.println("GPRS Network Not Available"); 
    } 

    if(strstr(at_buffer, "+SIND: 11") != 0){ 
    GPRS_Registered = 1; 
    Serial.println("GPRS Registered"); 
    } 

    if(strstr(at_buffer, "+SIND: 4") != 0){ 
    GPRS_AT_Ready = 1; 
    Serial.println("GPRS AT Ready"); 
    } 


} 

void setup(){ 
    Serial.begin(115200); 

    cell.begin(9600); 
    uart_gps.begin(4800); 

    cell.listen(); 
    Serial.println("Starting SM5100 Communication..."); 

    delay(5000); 
} 


void loop(){ 
    bool dataReady = false; 
    unsigned long chars, prev_chars = 0; 
    unsigned short sentences, failed; 

    if(firstLoop){ 
    firstLoop = 0; 
    while(GPRS_Registered == 0 || GPRS_AT_Ready == 0){ 
     readATString(); 
     processATString(); 
    } 
    Serial.println("Everything is working"); 
    } 

    uart_gps.listen(); 
    for (unsigned long start = millis(); millis() - start < 1000;){ 
    while (uart_gps.available()){ 
     char c = uart_gps.read(); 
     if (gps.encode(c)) 
     dataReady = true; 
    } 
    } 

    if (dataReady) 
    { 
    float flat, flon; 
    unsigned long age; 
    gps.f_get_position(&flat, &flon, &age); 
    Serial.print("flat: "); 
    Serial.print(flat, 6); 
    Serial.print("flon: "); 
    Serial.println(flon, 6); 

    cell.listen(); 

     // HERE IS THE PROBLEM 
// cell.println("AT+CGDCONT=1,\"IP\",\"internet\""); 
// delay(3000); 
// cell.println("AT+CGACT=1,1"); 
// delay(3000); 
// cell.println("AT+SDATACONF=1,\"TCP\",\"my.server.com\",8080"); 
// delay(3000); 
// cell.println("AT+SDATASTART=1,1"); 
// cell.println("AT+SSTRSEND=1,\"testing arduino gprs\""); 


    Serial.println("Sent data to server"); 

    } 
} 
+0

您的Arduino很可能没有损坏。 – sachleen

+0

@sachleen那么如何解释这个事实,如果我只是保留'cell.println(“AT + CGDCONT = 1,\”IP \“,\”internet \“”);'并将其更改为'Serial。 println(“AT + CGDCONT = 1,\”IP \“,\”internet \“”);'工作正常吗?如果我也改变其他线路,则会发生同样的问题。 – kechapito

+0

我不行。尝试使用仅有问题代码的新草图(以及显然让代码运行所需的任何其他内容),然后查看是否得到相同的错误。用最小的例子来工作比整个事情要容易得多。 – sachleen

回答

3

我会直接将屏蔽TX和RX连接到PC的串行端口,然后手动发出命令并查看响应。因为回应会照亮您的问题和解决方案。这可以简单地通过几个跳跃的Arduino的

  1. 跳RST进行到GND
  2. 跳0-2,1〜3。(我可能有倒退0至3和1〜2)

RST关闭ATmega328,其他人将Cell设备和基地FTDI芯片之间的TX/RX跳转到PC的USB串行端口。

如果您使用Arduino的IDE串行监视器,请注意正确设置Linefeed。


你试图使用三种设备:

  1. SoftwareSerial单元(2,3);
  2. SoftwareSerial uart_gps(0,1);
  3. Serial.Print下,如果只在实际使用2对TX和RX引脚,而不是3对

。请注意,串行类已由Arduino Core定义,以在引脚0和1上使用硬件UART。但是,您仍然正在为0,1定义SoftwareSerial(aka UART)。因此,使用相同引脚的两件事情 - 问题。

的SMS工作初始作为uart_gps.begin禁用由Serial.begin使用的硬件UART。所以你的cell.prints工作。但是,然后你的Serial.prints与你的uart_gps冲突,并且事情变坏。

不确定您的确切症状,但需要先清除资源问题。看着GPS和GPRS盾牌,我看到移动可以选择你在0,1和2,3之间的状态。其中0,1是做我原来的干扰Arduino的CPU为RESET,然后三态是使用引脚0和1的建议,使之盾选择时,0,1路由广播的UART到FTDI直接PC控制。尽管这可以用于Arduino的CPU,但是FTDI需要位于Tristate。

的解决方案是在所述屏蔽一些跳线,使用对未使用引脚大于0.1其他销和移动相应SoftwareSerial到这些引脚。同时确保0.1引脚不连接在屏蔽层之间,可能会在堆叠时弯曲它们。

+0

这些命令是正确的。我已经成功测试了它们。 – kechapito

+0

您使用的是UNO吗?如果如上所述,回合0,1。 “SoftwareSerial uart_gps(0,1);”可能存在问题上面的代码我只看到cell.print实际上只在你的注释部分中调用。它不在别处使用。所以有些东西没有按预期工作。我怀疑“Serial.print”正在搞乱你的SoftwareSerial uart_gps(0,1);并且uart_gps停止工作,因为它们出现在与serial.prints 0,1相同的引脚0,1上。确定引脚正在做什么将有助于解决问题。并描述它是如何失败的。虽然我敢打赌它的0,1的冲突。 – mpflaga

+0

我正在使用diecimila。也许这是针脚0,1的冲突,但我不明白我如何发送短信,无法创建一个TCP套接字。我会尝试删除串行代码,并用LED替换检查点,以确定是否存在问题。 – kechapito