我正在为大学项目开发Arduino板(微处理器:ATMega328P)。我想构建一个GPS跟踪器,用于接收数据,存储数据并通过SIGFOX模块重新传输。
基本上,我能够接收数据,并且能够通过串行发送简单的SIGFOX命令。
#include <TinyGPS++.h>
#include <String.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 4800;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
void setup()
{
Serial.begin(115200);
ss.begin(GPSBaud);
Serial.println(F("DeviceExample.ino"));
Serial.println(TinyGPSPlus::libraryVersion());
Serial.println();
}
void loop()
{
// This sketch displays information every time a new sentence is correctly encoded.
while (ss.available() > 0)
if (gps.encode(ss.read())) {
Serial.print(gps.location.lat(), 6); // 4 bytes
Serial.print(F(",")); // 1 byte
Serial.print(gps.location.lng(), 6); // 4 bytes
Serial.print('\n');
delay(4000);
}
if (millis() > 5000 && gps.charsProcessed() < 10){
Serial.println(F("No GPS detected: check wiring."));
while (true);
}
}
这样可以在屏幕上正确打印我需要存储的两个值(纬度和经度)。
这是TinyGPS ++。cpp中的代码的一部分:
double TinyGPSLocation::lat()
{
updated = false;
double ret = rawLatData.deg + rawLatData.billionths / 1000000000.0;
return rawLatData.negative ? -ret : ret;
}
double TinyGPSLocation::lng()
{
updated = false;
double ret = rawLngData.deg + rawLngData.billionths / 1000000000.0;
return rawLngData.negative ? -ret : ret;
}
现在,我想存储这些数据并通过SIGFOX模块发送。
SIGFOX命令是:
'N X'
其中N表示要传输的字节数,X表示字节的值。例如:'1 255'是1个字节,值为255,并返回FF作为输出。
问题是值是 double 的,所以我不知道如何在SIGFOX命令中编写它们。
另一个问题是我不知道如何在代码中创建两个串行通信。我试过了,但似乎没有用。
提前非常感谢您。
最佳答案
我在SIGFOX上看到了一些API信息,我假设是这样。即使不是,它也足够接近我要提出的观点。
https://support.sigfox.com/apidocs#operation/getDevice
您需要一定程度地了解IEEE 754是什么,因为根据我的经验,如果您查看原始位流,这就是设备来回传递数据的方式。
https://en.wikipedia.org/wiki/IEEE_754
因此,这是您在大多数平台上发送超过8个字节并为浮点数发送4个字节的两倍。当您在 Debug模式下将鼠标悬停在屏幕上时,IDE /编译器会为您处理这件事,并为您提供带小数点的数字。
要制作另一个串行端口,您需要制作另一个变量并传入该设备的波特率等。