Serial port Arduino和GSM2Click板(Quectel M95)
我试图将Arduino UNO板与GSM2Click板连接,GSM2Click板上嵌入了Quectel M95模块。 开关已正确设置Vcc=5V。我用外部直流电源为两块板供电。 我已建立了以下连接: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 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。现在清楚了。对不起,我不能把它作为答案投票,因为我的声誉仍然很低。我一拿到它就去做。