2013-01-31 4 views
1

Я пытаюсь сделать свою работу arduino с помощью gps и gprs-щита. Все идет нормально. Мой код работает, когда я прокомментировал строки, и перестает работать, если я раскомментирую их.Странное поведение при раскомметке

Еще более ранние события терпят неудачу. Например, я должен принимать выходные данные GPRS Registered и GPRS AT Ready, но этого не происходит.

Есть ли шанс, что мой ардуино поврежден?

Вот код.

Обратите внимание, что я тестировал команды, которые я посылаю на экран 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 к последовательному порту ПК напрямую, а затем вручную выдал команды и посмотрел ответы. Поскольку ответы будут освещены вашей проблемой и решением. Это может быть сделано просто несколько прыжков на откидном RST Arduino

  1. к GND
  2. скачка от 0 до 2 и 1 до 3. (я, возможно, что в обратном направлении от 0 до 3 и 1 к 2.)

RST отключает ATmega328, а остальные переходят в режим TX/RX между сотовым устройством и базовым чипом FTDI на последовательный порт USB ПК.

Если вы используете последовательный монитор IDE Arduino, обратите внимание, чтобы правильно установить LineFeed.


Вы пытаетесь использовать три устройства:

  1. SoftwareSerial клетки (2,3);
  2. Программное обеспечениеSerial uart_gps (0,1);
  3. Serial.print

Где вы только фактически используя 2 пары передающих и приемных штифтами, а не 3 пары. Обратите внимание, что Serial Class уже определен Arduino Core для использования аппаратного UART на выводах 0 и 1. Но все же вы определяете SoftwareSerial (aka UART) на 0,1 для GPS. Следовательно, две вещи, использующие одни и те же контакты - проблема.

Начальная работа SMS, так как uart_gps.begin отключает аппаратное обеспечение uart, используемое Serial.begin. Так работают ваши cell.prints. Но тогда ваши Serial.prints конфликтуют с вашим uart_gps, и все идет плохо.

Не уверены в ваших точных симптомах, но сначала необходимо устранить проблемы с ресурсами. Глядя на экран GPS и GPRS, я вижу, что перемещение выбирается, когда вы находитесь между 0,1 и 2,3. Где 0,1 - это мое первоначальное предложение помешать процессору Arduino в RESET, который затем три-состояниями использует контакты 0 и 1, позволяя экрану при выборе в 0,1 для маршрутизации радиоуправления в FTDI для прямого Управление ПК. В то время как это может быть использовано для процессора Arduino, но тогда FTDI должно быть в Tristate.

Решение - это некоторые перемычки на щите, для использования штырей, отличных от 0,1, к неиспользуемым контактам и перемещение соответствующего программного обеспечения на эти контакты. Убедившись, что контакты 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. – mpflaga

+0

Я использую diecimila. Возможно, это конфликт контактов 0,1, но я не понимаю, как я могу отправить sms и не могу создать сокет tcp. Я попытаюсь удалить серийный код и заменить контрольные точки светодиодами, чтобы узнать, если это проблема. – kechapito

Смежные вопросы