This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR6989:在 Energia 中拆分数据串。

Guru**** 2589245 points
Other Parts Discussed in Thread: ENERGIA

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/787794/msp430fr6989-splitting-a-string-of-data-in-energia

器件型号:MSP430FR6989
主题中讨论的其他器件:Energia

大家好、

我连接了一个 GPS 模块、它为我提供了 GPS 数据、但无法在 Energia 上隔离以下数据

+QGNSSRD:$GNRMC,044927.000,A,1301.7816,N,07731.3016,E,0.00, 93.73,290319,,A*4F

因此、我需要将纬度和经度、时间和日期分开。

那么、有人能帮助我了解如何从上面获取所需的数据吗?

我在下面附上了我的代码、因为您可以看到我卡在串行读取中、请帮助我更正此问题。

char gps;
int times=1;
int count = 0;
void setup()
{
Serial.begin(115200);
delay (2000);
sery.println ("at");
delay (1000);
//Serial.println ("at+cmgf=1");
serial.println ("AT+QGNSSC?");
delay (1000);

serial.println ("AT+QGNSSC=1");
delay (1000);

serial.println ("AT+QGNSSTS?");
delay (1000);

}
void loop(){
while (count < times)
{
Serial.write ("AT+QGNSSRD="\"NMEA/RMC\");
delay (2000);
if (Serial.available ()>0)
{
GPS=Serial.Read();
String response ="";
Response +=Serial.printn
(GPS+


);return count
+
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Venkatesh、

    中的字符串函数 可以为您提供帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复、但您能给我一个示例吗? 仍然是一个新手

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您可能希望查看此示例

    然后在此处查找更多信息:


    我认为这应该提供您需要的功能。

    此致、

     Stefan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。

    这就是我在上述参考和其他网站之后提出的内容。

    我第一次使用 Arduino 尝试代码软件串行工作正常、但在使用 Energia 时、我收到软件串行错误、如下所示。

    其次、数据会改写、如下面所示、我不知道其干扰发生的地方。

    我对该数据使用了"、"作为分隔符

    GNRMC,070236.000,A,1301.7816,N,07731.3057,E,0.00, 306.11,300319,,D*70

    字符串编号的开头为0 (对于$GNRMC)和1 (对于070236.000、这是时间)、2 (对于表示有效和无效的)等。

    因此,时间、纬度和状态都很好,但我看不到经度,即使数字是正确的,也需要帮助。

    下面附上了代码和屏幕截图。

    #include 
    SoftwareSerial mySerial (3,2);
    
    String data[7];
    #define debug true
    String state、timegps、latitude、longitude;
    void setup(){
    mySerial.begin(112500);
    Serial.begin(9600);
    delay(50 );
    mySerial.println("at");
    delay (1000);
    mySerial.println ("AT+QGNSSC?");
    delay (1000);
    
    mySerial.println ("AT+QGNSSC=1");
    delay (1000);
    
    mySerial.println ("AT+QGNSSTS?");
    delay (1000);
    }
    
    void loop (){
    sendTabData ("AT+QGNSSRD="NMEA/RMC\"、1000、debug);
    if (state!=0){
    serial.println ("状态:"+state);
    serial.println("time :"+timegps);
    serial.println("Latitude:"+latity);
    serial.println("Longitude:"+经度);
    延迟(300);
    mySerial.flush();
    
    }否则{
    serial.println ("GPS initializing");
    }
    
    
    void sendTabData (String 命令、const int 超时、布尔调试){
    mySerial.println (命令);
    long int time = millis ();
    int i = 0;
    
    while ((time+timeout)> millis ())){
    while (mySerial.available ()){
    char c = mySerial.read();
    如果(c!='、'){
    data[i]+=c;
    延迟(100);
    } 否则{
    i++;
    }
    如果(i ==7){
    延迟(100);
    转至 exitL;
    }
    }}exitL:
    
    if (调试){
    状态=数据[2];
    timegps =数据[1];
    Latitude =数据[3];
    经度=data[5];
    }
    
    字符串 sendData (字符串命令,const int 超时,布尔调试){
    字符串响应="";
    mySerial.println (命令);
    long int 时间=毫秒();
    int i = 0;
    
    while ((time+timeout)>毫秒()){
    while (mySerial.available ()){
    char c = mySerial.read();
    响应+=c;
    
    }
    }
    如果(调试){
    serial.print(Response);
    }
    返回响应;
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    SoftwareSerial 只能使用、或者没有硬件串行接口的较旧器件

    对于 F6989、您可以使用两个实现的硬件接口、如所示

    串行
    SERIAL1

    对于软件-您应该消除延迟、否则可能会出现输入缓冲区溢出:

    while (((time+timeout)> millis ()){
    while (Serial.available ()){
    char c = Serial.read();
    如果(c!='、'){
    data[i]+=c;
    //delay (100);
    } 否则{
    i++;
    }
    如果(i ==7){
    //延迟(100);
    转至 exitL;
    }
    }
    

    此致、

     Stefan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢你的答复。

    硬件序列的工作非常感谢。

    但是数据完全混乱,就像上述答复中所说的那样,如果我加上延迟,串行监视器上没有显示任何内容,但是当删除延迟时,我在串行监视器上得到这些值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    这看起来很奇怪。

    您可以再次共享更新后的代码吗?

    此致、

     Stefan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    此处是更新的代码、没有太多更改、只是消除了延迟。

    另外、请查看为什么数据像上述图片一样重叠、而不是在每次显示新旧值时给出新值。

    string data[6];
    #define debug true
    String state、timegps、latitude、longitude;
    void setup(){
    Serial1.begin(112500);
    Serial.begin(19200);
    delay(50 );
    Serial1.println ("at");
    delay (1000);
    SERIAL1.println ("AT+QGNSSC?");
    delay (1000);
    
    Serial1.println ("AT+QGNSSC=1");
    delay (1000);
    
    Serial1.println ("AT+QGNSSTS?");
    delay (1000);
    }
    
    void loop (){
    sendTabData ("AT+QGNSSRD="NMEA/RMC\"、1000、debug);
    delay (500);
    if (state!=0){
    serial.println ("状态:"+state);
    serial.println("time :"+timegps);
    serial.println("Latitude:"+latity);
    serial.println("Longitude:"+经度);
    延迟(2000年);
    SERIAL1.flush();
    
    }否则{
    serial.println ("GPS initializing");
    }
    
    
    void sendTabData (String 命令、const int 超时、布尔调试){
    Serial1.println (命令);
    long int time = millis ();
    int i = 0;
    
    while ((time+timeout)> millis ())){
    while (Serial1.available ()){
    char c = Serial1.read();
    如果(c!='、'){
    data[i]+=c;
    //delay (70);
    } 否则{
    i++;
    }
    如果(i ==6){
    //延迟(70);
    
    转至 exitL;
    }
    }
    
    exitL:
    if (debug){
    状态=数据[2];
    timegps =数据[1];
    Latitude =数据[3];
    经度=data[5];
    }
    
    字符串 sendData (字符串命令,const int 超时,布尔调试){
    字符串响应="";
    Serial1.println (命令);
    long int 时间=毫秒();
    int i = 0;
    
    while ((time+timeout)>毫秒()){
    while (Serial1.available ()){
    char c = Serial1.read();
    响应+=c;
    
    }
    }
    如果(调试){
    serial.print(Response);
    }
    返回响应;
    } 

    string data[6];#define debug trueString state、timegps、latitude、longitude;void setup(){Serial1.begin(112500);Serial.begin(19200);delay(50); Serial1.println("at");delay (1000);Serial1.println("AT+QGNSSC?");delay (1000);
    SERIAL1.println ("AT+QGNSSC=1);delay (1000);
    SERIAL1.println ("AT+QGNSSTS?");delay (1000);}
    void loop(){sendTabData("AT+QGNSSRD="NMEA/RMC\"",1000,debug);  delay(500); if (state !=0){  Serial.println("State :+status);  Serial.println("time :"+timegps);  Serial.println("latitude+2000")    ;Longitude+latitude!"(Litude+latitude!"!"!"!"!"Longitudituditude!"!"!"!"(Litudituditude!"!+     SERIAL1.flush();   }else {  Serial.println("GPS initializing"); }}
    void sendTabData (字符串命令、const int timeout、布尔调试){Serial1.println (命令); long int time = millis (); int i = 0;
     while ((time+timeout)> millis ()){  while (Serial1.available ()){   char c = Serial1.read ();   if (c!='、'){      data[i]+=c;     //delay (70);   }否则{     i++;     }   if (i =6){    // delay (70);          goto exitL;   }  } exitL : if (debug){  state = data[2];  timegps = data[1];  latitude = data[3];  longit=data[5];   }String sendData (String 命令、const int 超时、debug    ){String Response ="";Serial1.println (command);int long (命令)= 0;int time (布尔值= 0)
     while ((time+timeout)> millis ()){  while (Serial1.available ()){   char c = Serial1.read();   Response +=c;      }  } if (debug){   Serial.print(response);   }   返回响应;   }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您在数据输入处理方面遇到一些问题。

    首先、您需要清除缓冲区。

    第二个您的输入流应该被完全接收、即使是刷新、似乎仍有一些数据进入。

    您可以尝试以下函数、这样也无需执行跳转以退出。

    void sendTabData (String command、const int timeout、布尔调试){
    Serial1.println (command);
    long int time = millis ();
    int i = 0;
    
    for (i=0;i<6;i++) data[i]="";
    i = 0;
    while (time+timeout)> millis ()){
    while (Serial1.available ()){
    char c = Serial1.read();
    如果(I < 6){
    如果(c!='、'){
    data[i]+=c;
    } 否则{
    i++;
    }
    }
    
    }
    如果(调试){
    状态=数据[2];
    timegps =数据[1];
    Latitude =数据[3];
    经度=DATA[5];
    }
    
    

    此致、

     Stefan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊,Stefan,谢谢你,非常感谢
    我在这里住了两天,谢谢 much...it的工作方式就像一个美丽的地方...我实际上评论了出口部分,但是数据一直像垃圾一样...但是现在是 works....no,我明白了
    再次感谢。

    您能不能看一下这个齿?
    e2e.ti.com/.../788788
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    顺便说一下:清零只能确保 TX 完成但不会清空 RX 缓冲区-至少这是串行中的实现。

    此致、
    Stefan