改进代码 #include <SoftwareSerial.h> #include <TinyGPS.h> #include <LiquidCrystal.h> // 定义GPS模块的引脚 #define RXPin 4 #define TXPin 3 // 定义LCD12864的引脚 #define RS 8 #define EN 9 #define D4 4 #define D5 5 #define D6 6 #define D7 7 SoftwareSerial gpsSerial(RXPin, TXPin); TinyGPS gps; LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); void setup() { gpsSerial.begin(9600); lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0, 0); lcd.print("GPS Test"); } void loop() { while (gpsSerial.available()) { if (gps.encode(gpsSerial.read())) { displayInfo(); } } } void displayInfo() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Lat: "); lcd.print(gps.location.lat(), 6); lcd.setCursor(0, 1); lcd.print("Lng: "); lcd.print(gps.location.lng(), 6); }
时间: 2023-12-10 17:39:40 浏览: 227
这份代码看起来已经相当简洁了,但是还是有一些地方可以进一步改进:
1. 在 `setup()` 函数中,应该将显示器的光标固定在左上角,而不是默认位置:
```
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
```
2. 如果 GPS 模块一直没有数据输出,程序将一直卡在 `while` 循环中,从而导致其他任务无法执行。为了解决这个问题,可以设置一个计时器,在一定时间内没有接收到数据就跳出循环:
```
unsigned long timeout = millis() + 1000; // 设置超时时间为1秒钟
while (gpsSerial.available() > 0 && millis() < timeout) {
if (gps.encode(gpsSerial.read())) {
displayInfo();
break;
}
}
```
3. 在 `displayInfo()` 函数中,可以先将经纬度值存储到变量中,再将其打印到显示器上。这样可以避免在打印过程中调用 `gps.location.lat()` 和 `gps.location.lng()` 两次,提高了代码的效率:
```
float lat = gps.location.lat();
float lng = gps.location.lng();
lcd.print("Lat: ");
lcd.print(lat, 6);
lcd.setCursor(0, 1);
lcd.print("Lng: ");
lcd.print(lng, 6);
```
阅读全文