ESP32 的 Serial2 没有响应(NEO 6M GPS)
Serial2 of ESP32 not responding( NEO 6M GPS)
我正在做一个自动驾驶汽车项目,我有一个 NEO 6M GPS 模块,我使用 ESp32 作为电路板,该模块与 Arduino 和 Nodemcu 配合良好。但不是 ESP32,原因是它不支持软件序列号,所以我从 https://www.youtube.com/watch?v=GwShqW39jlE&feature=emb_title
那里寻求帮助
我添加了硬件序列号,但仍然没有输出我提供了下面的代码
#include<HardwareSerial.h>//No extra libray installed
#define RXD2 16
#define TXD2 17
HardwareSerial gps_serial(2);
void setup() {
Serial.begin(115200);
Serial.printf("LETS START");
gps_serial.begin(115200, SERIAL_8N1, RXD2, TXD2);
}
void loop() {
while (gps_serial.available()) {
Serial.print(char(gps_serial.read())); // read from gps, write to serial debug port
Serial.print("I am here");
}
}
串行监视器上的输出是LETS START
下面还提供了在其他板上工作的其他代码,经过编辑以在 ESP32
中工作
#include <WiFi.h>
//#include <WiFiClient.h>
#include <WiFiServer.h>
#include <TinyGPS++.h> // library for GPS module
//#include <SoftwareSerial.h>
//#include <ESP8266WiFi.h>
TinyGPSPlus gps; // The TinyGPS++ object
//SoftwareSerial ss(4, 5); // The serial connection to the GPS device
HardwareSerial Serial2(2);
const char* ssid = "***********"; //ssid of your wifi
const char* password = "***********"; //password of your wifi
float latitude , longitude;
int year , month , date, hour , minute , second;
String date_str , time_str , lat_str , lng_str;
int pm;
WiFiServer server(80);
void setup()
{ Serial2.begin(115200);
Serial.begin(115200);
//ss.begin(9600);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password); //connecting to wifi
while (WiFi.status() != WL_CONNECTED)// while wifi not connected
{
delay(500);
Serial.print("."); //print "...."
}
Serial.println("");
Serial.println("WiFi connected");
server.begin();
Serial.println("Server started");
Serial.println(WiFi.localIP()); // Print the IP address
}
void loop()
{
while (Serial2.available() > 0) //while data is available
if (gps.encode(Serial2.read())) //read gps data
{
if (gps.location.isValid()) //check whether gps location is valid
{
latitude = gps.location.lat();
lat_str = String(latitude , 6); // latitude location is stored in a string
longitude = gps.location.lng();
lng_str = String(longitude , 6); //longitude location is stored in a string
}
if (gps.date.isValid()) //check whether gps date is valid
{
date_str = "";
date = gps.date.day();
month = gps.date.month();
year = gps.date.year();
if (date < 10)
date_str = '0';
date_str += String(date);// values of date,month and year are stored in a string
date_str += " / ";
if (month < 10)
date_str += '0';
date_str += String(month); // values of date,month and year are stored in a string
date_str += " / ";
if (year < 10)
date_str += '0';
date_str += String(year); // values of date,month and year are stored in a string
}
if (gps.time.isValid()) //check whether gps time is valid
{
time_str = "";
hour = gps.time.hour();
minute = gps.time.minute();
second = gps.time.second();
minute = (minute + 30); // converting to IST
if (minute > 59)
{
minute = minute - 60;
hour = hour + 1;
}
hour = (hour + 5) ;
if (hour > 23)
hour = hour - 24; // converting to IST
if (hour >= 12) // checking whether AM or PM
pm = 1;
else
pm = 0;
hour = hour % 12;
if (hour < 10)
time_str = '0';
time_str += String(hour); //values of hour,minute and time are stored in a string
time_str += " : ";
if (minute < 10)
time_str += '0';
time_str += String(minute); //values of hour,minute and time are stored in a string
time_str += " : ";
if (second < 10)
time_str += '0';
time_str += String(second); //values of hour,minute and time are stored in a string
if (pm == 1)
time_str += " PM ";
else
time_str += " AM ";
}
}
WiFiClient client = server.available(); // Check if a client has connected
if (!client)
{
return;
}
// Prepare the response
String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n <!DOCTYPE html> <html> <head> <title>GPS DATA</title> <style>";
s += "a:link {background-color: YELLOW;text-decoration: none;}";
s += "table, th, td </style> </head> <body> <h1 style=";
s += "font-size:300%;";
s += " ALIGN=CENTER> GPS DATA</h1>";
s += "<p ALIGN=CENTER style=""font-size:150%;""";
s += "> <b>Location Details</b></p> <table ALIGN=CENTER style=";
s += "width:50%";
s += "> <tr> <th>Latitude</th>";
s += "<td ALIGN=CENTER >";
s += lat_str;
s += "</td> </tr> <tr> <th>Longitude</th> <td ALIGN=CENTER >";
s += lng_str;
s += "</td> </tr> <tr> <th>Date</th> <td ALIGN=CENTER >";
s += date_str;
s += "</td></tr> <tr> <th>Time</th> <td ALIGN=CENTER >";
s += time_str;
s += "</td> </tr> </table> ";
s += "</body> </html>";
client.print(s); // all the values are send to the webpage
delay(100);
}
当我 运行 它时,我确实在串行监视器上获得了 IP 地址,但是当我访问该地址时,这些字段是空白的。
所以我的理解是与 GPS 模块的串行通信不工作。我在网上尝试了很多其他解决方案,但根本没有用。
我正在使用 ESP32 DevKit V1,30 针版本
不知道你用的是哪个ESP32模块,有两个show stoppers
NEO-6M GPS 模块需要 5 V,ESP32 引脚提供最大 3.6V - 正常 3.3V
一些 ESP32 模块会屏蔽某些引脚,以将它们用于 SD 卡、相机、液晶显示器或其他板载功能。因此,请查看您的 esp32 板变体的数据表。
如果 HWSerial2 存在,代码应该没问题
如果你使用低于 1.03 的 ESP32 版本你必须定义 HWSerial,
ESP32 1.04 以上就没有必要了
#define RXD2 16
#define TXD2 17
...
HardwareSerial Serial2(2);
...
Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
并为GSM模块提供5V电源。
编辑 2:感谢 hcheung 问最基本的事情
解决方案是 OP 在 GPS 上使用 RX 到 RX 和 TX 到 TX,而不是 RX ESP 引脚到 RX,反之亦然。
所以问题解决了
我正在做一个自动驾驶汽车项目,我有一个 NEO 6M GPS 模块,我使用 ESp32 作为电路板,该模块与 Arduino 和 Nodemcu 配合良好。但不是 ESP32,原因是它不支持软件序列号,所以我从 https://www.youtube.com/watch?v=GwShqW39jlE&feature=emb_title
那里寻求帮助我添加了硬件序列号,但仍然没有输出我提供了下面的代码
#include<HardwareSerial.h>//No extra libray installed
#define RXD2 16
#define TXD2 17
HardwareSerial gps_serial(2);
void setup() {
Serial.begin(115200);
Serial.printf("LETS START");
gps_serial.begin(115200, SERIAL_8N1, RXD2, TXD2);
}
void loop() {
while (gps_serial.available()) {
Serial.print(char(gps_serial.read())); // read from gps, write to serial debug port
Serial.print("I am here");
}
}
串行监视器上的输出是LETS START
下面还提供了在其他板上工作的其他代码,经过编辑以在 ESP32
#include <WiFi.h>
//#include <WiFiClient.h>
#include <WiFiServer.h>
#include <TinyGPS++.h> // library for GPS module
//#include <SoftwareSerial.h>
//#include <ESP8266WiFi.h>
TinyGPSPlus gps; // The TinyGPS++ object
//SoftwareSerial ss(4, 5); // The serial connection to the GPS device
HardwareSerial Serial2(2);
const char* ssid = "***********"; //ssid of your wifi
const char* password = "***********"; //password of your wifi
float latitude , longitude;
int year , month , date, hour , minute , second;
String date_str , time_str , lat_str , lng_str;
int pm;
WiFiServer server(80);
void setup()
{ Serial2.begin(115200);
Serial.begin(115200);
//ss.begin(9600);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password); //connecting to wifi
while (WiFi.status() != WL_CONNECTED)// while wifi not connected
{
delay(500);
Serial.print("."); //print "...."
}
Serial.println("");
Serial.println("WiFi connected");
server.begin();
Serial.println("Server started");
Serial.println(WiFi.localIP()); // Print the IP address
}
void loop()
{
while (Serial2.available() > 0) //while data is available
if (gps.encode(Serial2.read())) //read gps data
{
if (gps.location.isValid()) //check whether gps location is valid
{
latitude = gps.location.lat();
lat_str = String(latitude , 6); // latitude location is stored in a string
longitude = gps.location.lng();
lng_str = String(longitude , 6); //longitude location is stored in a string
}
if (gps.date.isValid()) //check whether gps date is valid
{
date_str = "";
date = gps.date.day();
month = gps.date.month();
year = gps.date.year();
if (date < 10)
date_str = '0';
date_str += String(date);// values of date,month and year are stored in a string
date_str += " / ";
if (month < 10)
date_str += '0';
date_str += String(month); // values of date,month and year are stored in a string
date_str += " / ";
if (year < 10)
date_str += '0';
date_str += String(year); // values of date,month and year are stored in a string
}
if (gps.time.isValid()) //check whether gps time is valid
{
time_str = "";
hour = gps.time.hour();
minute = gps.time.minute();
second = gps.time.second();
minute = (minute + 30); // converting to IST
if (minute > 59)
{
minute = minute - 60;
hour = hour + 1;
}
hour = (hour + 5) ;
if (hour > 23)
hour = hour - 24; // converting to IST
if (hour >= 12) // checking whether AM or PM
pm = 1;
else
pm = 0;
hour = hour % 12;
if (hour < 10)
time_str = '0';
time_str += String(hour); //values of hour,minute and time are stored in a string
time_str += " : ";
if (minute < 10)
time_str += '0';
time_str += String(minute); //values of hour,minute and time are stored in a string
time_str += " : ";
if (second < 10)
time_str += '0';
time_str += String(second); //values of hour,minute and time are stored in a string
if (pm == 1)
time_str += " PM ";
else
time_str += " AM ";
}
}
WiFiClient client = server.available(); // Check if a client has connected
if (!client)
{
return;
}
// Prepare the response
String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n <!DOCTYPE html> <html> <head> <title>GPS DATA</title> <style>";
s += "a:link {background-color: YELLOW;text-decoration: none;}";
s += "table, th, td </style> </head> <body> <h1 style=";
s += "font-size:300%;";
s += " ALIGN=CENTER> GPS DATA</h1>";
s += "<p ALIGN=CENTER style=""font-size:150%;""";
s += "> <b>Location Details</b></p> <table ALIGN=CENTER style=";
s += "width:50%";
s += "> <tr> <th>Latitude</th>";
s += "<td ALIGN=CENTER >";
s += lat_str;
s += "</td> </tr> <tr> <th>Longitude</th> <td ALIGN=CENTER >";
s += lng_str;
s += "</td> </tr> <tr> <th>Date</th> <td ALIGN=CENTER >";
s += date_str;
s += "</td></tr> <tr> <th>Time</th> <td ALIGN=CENTER >";
s += time_str;
s += "</td> </tr> </table> ";
s += "</body> </html>";
client.print(s); // all the values are send to the webpage
delay(100);
}
当我 运行 它时,我确实在串行监视器上获得了 IP 地址,但是当我访问该地址时,这些字段是空白的。 所以我的理解是与 GPS 模块的串行通信不工作。我在网上尝试了很多其他解决方案,但根本没有用。
我正在使用 ESP32 DevKit V1,30 针版本
不知道你用的是哪个ESP32模块,有两个show stoppers
NEO-6M GPS 模块需要 5 V,ESP32 引脚提供最大 3.6V - 正常 3.3V
一些 ESP32 模块会屏蔽某些引脚,以将它们用于 SD 卡、相机、液晶显示器或其他板载功能。因此,请查看您的 esp32 板变体的数据表。
如果 HWSerial2 存在,代码应该没问题
如果你使用低于 1.03 的 ESP32 版本你必须定义 HWSerial,
ESP32 1.04 以上就没有必要了
#define RXD2 16
#define TXD2 17
...
HardwareSerial Serial2(2);
...
Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
并为GSM模块提供5V电源。
编辑 2:感谢 hcheung 问最基本的事情
解决方案是 OP 在 GPS 上使用 RX 到 RX 和 TX 到 TX,而不是 RX ESP 引脚到 RX,反之亦然。
所以问题解决了