我正在尝试使用gps和gprs盾牌进行arduino工作。到现在为止还挺好。 当我对注释行进行注释时,我的代码会起作用,如果我取消注释它们就会停止工作。
甚至更早的事件也会失败。例如,我必须输出GPRS Registered
和GPRS AT Ready
,但不会发生。
我的arduino有可能被损坏吗?
这是代码。
请注意,我测试了使用实际屏蔽发送到gprs shield的命令,它可以正常工作。
#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 :(得分:3)
我会直接将屏蔽TX和RX连接到PC的串口,然后手动发出命令并查看响应。由于回复将阐明您的问题和解决方案。这可以通过Arduino上的一些跳转来完成。
RST关闭ATmega328,其他人将TX / RX跳转到Cell设备和基站FTDI芯片之间,连接到PC的USB串口。
如果您使用Arduino的IDE串行监视器,请注意正确设置LineFeed。
您正在尝试使用三种设备:
你实际上只使用2对Tx和Rx引脚,而不是3对。请注意,Arduino Core已经定义了串行类,以便在引脚0和1上使用硬件UART。但是,您在GPS上为0,1定义了SoftwareSerial(也就是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时将无线电的uart路由到FTDI直接电脑控制。虽然这可以用于Arduino的CPU,但FTDI需要在Tristate中。
解决方案是屏蔽上的一些跳线,将0,1以外的引脚用于未使用的引脚,并将相应的SoftwareSerial移动到这些引脚。虽然确保0,1引脚没有连接在屏蔽之间,但堆叠时可能会将它们弯曲掉。