Serial port Arduino和GSM2Click板(Quectel M95)

Serial port Arduino和GSM2Click板(Quectel M95),serial-port,arduino,gsm,Serial Port,Arduino,Gsm,我试图将Arduino UNO板与GSM2Click板连接,GSM2Click板上嵌入了Quectel M95模块。 开关已正确设置Vcc=5V。我用外部直流电源为两块板供电。 我已建立了以下连接: ARDUINO pin | GSM pin: 3 (TX) RX

我试图将Arduino UNO板与GSM2Click板连接,GSM2Click板上嵌入了Quectel M95模块。 开关已正确设置Vcc=5V。我用外部直流电源为两块板供电。 我已建立了以下连接:

      ARDUINO pin                   |          GSM pin:
                   3 (TX)                                              RX                                   
                   2 (RX)                                              TX
                   8                                                   STA
                   7                                                   PWK (always high)
gsm2click板似乎处于活动状态,因为开关电源和网络都已打开(网络led闪烁)。 我正在尝试获取发送AT命令,但始终得到0作为答案:

#include <SoftwareSerial.h>

const int PWK= 7; // Analog output pin that the LED is attached to
const int STA= 8;
const int RX=2;
const int TX=3;
int STA_value;



SoftwareSerial mySerial(RX,TX); // RX, TX


void setup() {                
  // initialize the digital pin as an output.
  pinMode(PWK, OUTPUT);   // questo pin serve per accendere il dispositivo GSM
  pinMode(STA, INPUT);   

  pinMode(RX,INPUT);
  pinMode(TX,OUTPUT);


  gsmOn();


  Serial.begin(9600);  //Init seriale sw
  Serial.println("Arduino serial initialized!");
  delay(10); 

  mySerial.begin(9600);  //init seriale hw
  Serial.println("Software serial initialized!");
  delay(10); 



}




// the loop routine runs over and over again forever:
  void loop() 
  {

      sendCommand("AT");
      delay(10);

      readSerial();
      delay(1000);         

  }


void sendCommand(char* msg)
{ 
  mySerial.print(msg);
  Serial.println(msg);
  delay(1); 

}

void readSerial()
{
  while(mySerial.available()>0)
  {
    Serial.print(mySerial.read());
    delay(1);  
  }


}



void gsmOn() 
{ 
  // Takes 30 seconds to complete
  digitalWrite(PWK, HIGH);   // turn the Phone on
  delay(2);
}
#包括
常数int PWK=7;//LED连接到的模拟输出引脚
常数int STA=8;
常数int RX=2;
常数int TX=3;
int STA_值;
软件串行mySerial(接收、发送);//接收,发送
无效设置(){
//将数字管脚初始化为输出。
pinMode(PWK,输出);//根据accendere il dispositivo GSM提供pin服务的请求
pinMode(STA,输入);
pinMode(接收、输入);
pinMode(发送、输出);
gsmOn();
Serial.begin(9600);//Init Serial sw
println(“Arduino串行初始化!”);
延迟(10);
mySerial.begin(9600);//init serial hw
println(“软件串行初始化!”);
延迟(10);
}
//循环例程会一直反复运行:
void循环()
{
sendCommand(“AT”);
延迟(10);
readSerial();
延迟(1000);
}
void send命令(char*msg)
{ 
mySerial.print(msg);
Serial.println(msg);
延迟(1);
}
void readSerial()
{
while(mySerial.available()>0)
{
Serial.print(mySerial.read());
延迟(1);
}
}
void gsmOn()
{ 
//需要30秒才能完成
digitalWrite(PWK,高);//打开手机
延迟(2);
}
有什么建议吗


提前感谢大家

您的代码有一些问题,所以我在修改后粘贴代码,并尝试理解我想告诉您的内容

#include <SoftwareSerial.h>

const int PWK= 7; // Analog output pin that the LED is attached to
const int STA= 8;
const int RX=2;
const int TX=3;
int STA_value;



 SoftwareSerial mySerial(RX,TX); // RX, TX


 void setup() {                
// initialize the digital pin as an output.
 pinMode(PWK, OUTPUT);   // questo pin serve per accendere il dispositivo GSM
 pinMode(STA, INPUT);   

 //pinMode(RX,INPUT);   //if u want to use this as serial port then don't declare this   I/O
 //pinMode(TX,OUTPUT);


gsmOn();


Serial.begin(9600);  //Init seriale sw
Serial.println("Arduino serial initialized!");
delay(10); 

mySerial.begin(9600);  //init seriale hw
Serial.println("Software serial initialized!");
delay(10); 
 }

 // the loop routine runs over and over again forever:
void loop() 
{
uint8_t answer=0;

// checks if the module is started
answer = sendCommand("AT", "OK", "OK", 2000);
if (answer == 1)
{
Serial.println("OK");
 }
  else
 Serial.println("Not Responding");
  delay(1000);         
  }
 int8_t sendCommand(char* ATcommand, char* expected_answer1, 
    char* expected_answer2, unsigned int timeout){
uint8_t x=0,  answer=0;
char response[100];
unsigned long previous;
memset(response, '\0', 100);    // Initialize the string
delay(100);
while( mySerial.available() > 0)
{
mySerial.read();    // Clean the input buffer
}
Serial.println(ATcommand);    // Send the AT command to serial port 
mySerial.println(ATcommand);    // Send the AT command to gsm module
previous = millis();
// this loop waits for the answer
do{
    // if there are data in the UART input buffer, reads it and checks for the asnwer
    if(mySerial.available() != 0){    
        response[x] = mySerial.read();
        x++;
        // check if the desired answer 1  is in the response of the module
        if (strstr(response, expected_answer1) != NULL)    
        {
            answer = 1;
        }
        // check if the desired answer 2 is in the response of the module
        else if (strstr(response, expected_answer2) != NULL)    
        {
            answer = 2;
        }
    }
}
// Waits for the asnwer with time out
while((answer == 0) && ((millis() - previous) < timeout)); 

return answer;
    }
void gsmOn() 
 { 
 // Takes 30 seconds to complete
 digitalWrite(PWK, HIGH);   // turn the Phone on
delay(2);
}
#包括
常数int PWK=7;//LED连接到的模拟输出引脚
常数int STA=8;
常数int RX=2;
常数int TX=3;
int STA_值;
软件串行mySerial(接收、发送);//接收,发送
无效设置(){
//将数字管脚初始化为输出。
pinMode(PWK,输出);//根据accendere il dispositivo GSM提供pin服务的请求
pinMode(STA,输入);
//pinMode(RX,INPUT);//如果您想将其用作串行端口,则不要声明此I/O
//pinMode(发送、输出);
gsmOn();
Serial.begin(9600);//Init Serial sw
println(“Arduino串行初始化!”);
延迟(10);
mySerial.begin(9600);//init serial hw
println(“软件串行初始化!”);
延迟(10);
}
//循环例程会一直反复运行:
void循环()
{
uint8_t answer=0;
//检查模块是否已启动
应答=发送命令(“AT”,“OK”,“OK”,2000);
如果(答案=1)
{
Serial.println(“OK”);
}
其他的
Serial.println(“无响应”);
延迟(1000);
}
int8发送命令(字符*ATcommand,字符*预期应答1,
字符*应为\u应答2,无符号整数超时){
uint8_t x=0,答案=0;
字符响应[100];
长前未签名;
memset(响应'\0',100);//初始化字符串
延迟(100);
while(mySerial.available()>0)
{
mySerial.read();//清除输入缓冲区
}
Serial.println(ATcommand);//将AT命令发送到串行端口
mySerial.println(ATcommand);//将AT命令发送到gsm模块
上一个=毫秒();
//这个循环等待答案
做{
//如果UART输入缓冲区中有数据,则读取该数据并检查asnwer
如果(mySerial.available()!=0){
response[x]=mySerial.read();
x++;
//检查模块的响应中是否有所需答案1
if(strstr(响应,预期回答1)!=NULL)
{
答案=1;
}
//检查模块的响应中是否有所需答案2
else if(strstr(响应,预期回答2)!=NULL)
{
答案=2;
}
}
}
//等待asnwer超时
而((answer==0)和((millis()-previous)

如果您仍然有任何问题,请留下评论

我尝试了您的代码,它可以正常工作。但是我有一个评论,为什么你要检查两个可能的答案?也许模块有时会给出错误的答案?您决定使用函数strstr()进行比较有什么特殊意义吗?实际上@divivoma这是一个大型代码(项目)的一部分我们发送这样的AT命令,期望有两个答案,所以这将对您在未来的进一步处理和GSM模块做一些好的事情完全有帮助,否则您可以避免1个答案。没有使用strstr的特殊原因,但这是用于两个字符串比较的内置函数,易于使用。如果你的问题解决了,那么你应该投票表决这个答案OK。现在清楚了。对不起,我不能把它作为答案投票,因为我的声誉仍然很低。我一拿到它就去做。