求助!程序运行很蹊跷!-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6686|回复: 17

求助!程序运行很蹊跷!

[复制链接]
发表于 2013-4-11 09:23 | 显示全部楼层 |阅读模式
本帖最后由 fangtaonj 于 2013-4-11 21:20 编辑

再次请大伙帮忙(不好意思,本人小白,处处都遇到困难),这个程序是串口读取GPS字符串,取出其中经度、维度、速度信息显示和串口打印出来。运行结果很蹊跷,现象如下:代码中两个做记号的语句为31行语句A:Serial.print(comdata);   //A和34行语句b://comdata="$GPRMC,091859.800,A,3204.8736,N,11853.4971,E,1.46,14.92,280313,,,A*56";//B,若B不屏蔽(这么用是为了调试)则屏幕和串口显示一切正常。但这个数据不是来自串口,真的程序是屏蔽语句B,这样comdata数据来自串口,通过打开语句A,发现执行语句A的结果显示comdata就是$GPRMC,091859.800,A,3204.8736,N,11853.4971,E,1.46,14.92,280313,,,A*56,和赋值语句B的内容一样,但此时打印和显示都没有了,一切都不正常,似乎B语句后的程序都不执行了一样,无法显示和打印。我感觉很奇怪但始终找不到原因,求高手帮助找明原因,谢谢!
!代码如下:

  • #include <LiquidCrystal.h>
  • String comdata = "";
  • String text4;
  • String text5;
  • String text6;
  • int i;
  • LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
  • void setup()
  • {
  •   lcd.clear();
  •   Serial.begin(9600);
  • //  delay(3000);
  • // Serial.print ("PMTK251,115200");
  • // Serial.print ("PMTK300,100,0,0,0,0");
  • Serial.print ("$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29");
  •   lcd.begin(16,2);
  •   lcd.print("GPS DEMO");
  •   delay(3000);
  •   lcd.clear();
  • }
  • void loop()
  • {//y
  •    while (Serial.available() > 0)
  • {   //y
  •    for (byte i=1;i<=70;i++);
  •    {
  • comdata += char(Serial.read());
  •     delay(2);
  •    }
  • Serial.print(comdata);   //A
  • //comdata.toUpperCase();
  • // comdata.trim();
  • //comdata="$GPRMC,091859.800,A,3204.8736,N,11853.4971,E,1.46,14.92,280313,,,A*56";//B
  • text4=(comdata.substring(comdata.indexOf('$')));
  • //Serial.println(text4);
  • text5=(text4.substring(text4.indexOf('A')+2));
  • text6=(text5.substring(0,text5.indexOf(',')));
  • Serial.print(text6);
  •   lcd.setCursor(0, 0);
  •   lcd.print((text6));
  •   text5=(text4.substring(text4.indexOf('N')+2));
  •   text6=(text5.substring(0,text5.indexOf(',')));
  •   Serial.print(text6);
  •   lcd.setCursor(0, 1);
  •   lcd.print((text6));
  •   text5=(text4.substring(text4.indexOf('E')+2));
  •   text6=(text5.substring(0,text5.indexOf(',')));
  •   Serial.print(text6);
  •   lcd.setCursor(10, 0);
  •   lcd.print((text6));
  • //    lcd.clear();
  •   comdata = "";
  • }//y
  • }


发表于 2013-4-11 22:02 | 显示全部楼层
努力看了两次,都没看懂你说的啥,你还是排下版吧
 楼主| 发表于 2013-4-11 22:19 | 显示全部楼层
奈何col 发表于 2013-4-11 22:02
努力看了两次,都没看懂你说的啥,你还是排下版吧

这个程序的目的是用串口读取GPS字符串,取出其中经度、维度、速度信息显示和串口打印出来。
运行结果却总是不对。
之前把这个程序分成两段调试。分别是串口数据读入和字符串内需要的部分挑选出来并显示。
1、第一个是读串口,在代码中基本上就是就是22行到第31行的语句。调通了,用串口工具软件发送"$GPRMC,091859.800,A,3204.8736,N,11853.4971,E,1.46,14.92,280313,,,A*56",第31行31.Serial.print(comdata); 能够正确显示该字符串,说明串口读取正确。
2、第二个是把这个字符串内需要的部分挑选出来并显示。当时用赋值语句comdata="$GPRMC,091859.800,A,3204.8736,N,11853.4971,E,1.46,14.92,280313,,,A*56";整个程序就是我附的代码中34行和之后的部分。这样做也调通了。能正常串口输出和显示屏输出。
3、然后把上面两段程序组合起来,却运行不了,不能正常执行我想要的结果,显示屏不显示,串口输出经纬度和速度也不行。去掉31行的//让它打印comdata,却又是正常的。一直找不到原因。
请奈何兄帮忙给就看看!
不知我说清楚了吗?
发表于 2013-4-11 23:44 | 显示全部楼层
你的GPS已经占用了串口了,此时就不能和PC通信了
 楼主| 发表于 2013-4-12 08:12 | 显示全部楼层
最终目的是用GPS,但是到现在为止,我都是用PC通过串口给arduino板输出一个模拟的GPS信号,同时再接受板子的输出结果,接收板子的输出结果的目的是调试程序,等调试好了Serial.print()语句就会去掉的。

第一段程序本来输出的结果就是comdata="$GPRMC,091859.800,A,3204.8736,N,11853.4971,E,1.46,14.92,280313,,,A*56",第二段程序的输入用赋值语句也让comdata为上面字符串时也正常,程序的蹊跷之处在于让第一段程序的结果(comdata)直接作为第二段程序的输入时,就不正常了。两个程序单独调试却都没问题,请奈何兄再给看看。
 楼主| 发表于 2013-4-12 08:14 | 显示全部楼层
奈何col 发表于 2013-4-11 23:44
你的GPS已经占用了串口了,此时就不能和PC通信了

最终目的是用GPS,但是到现在为止,我都是用PC通过串口给arduino板输出一个模拟的GPS信号,同时再接受板子的输出结果,接收板子的输出结果的目的是调试程序,等调试好了Serial.print()语句就会去掉的。

第一段程序本来输出的结果就是comdata="$GPRMC,091859.800,A,3204.8736,N,11853.4971,E,1.46,14.92,280313,,,A*56",第二段程序的输入用赋值语句也让comdata为上面字符串时也正常,程序的蹊跷之处在于让第一段程序的结果(comdata)直接作为第二段程序的输入时,就不正常了。两个程序单独调试却都没问题,请奈何兄再给看看。
发表于 2013-4-12 09:12 | 显示全部楼层
问题可能是出在你那个while 循环上,你gps是怎么输出的?
 楼主| 发表于 2013-4-12 10:54 | 显示全部楼层
奈何col 发表于 2013-4-12 09:12
问题可能是出在你那个while 循环上,你gps是怎么输出的?

GPS还没接,我现在用串口向板子模拟发送GPS 0183格式的GPRMC语句,具体样式就是:"$GPRMC,091859.800,A,3204.8736,N,11853.4971,E,1.46,14.92,280313,,,A*56"这样的ASCII字符串,波特率9600,没有别的类型的语句,这是因为我控制GPS只输出GPRMC语句。
 楼主| 发表于 2013-4-12 10:56 | 显示全部楼层
奈何兄您好!谢谢您!还有个现象,我把第二行语句String comdata = "";改为String comdata="$GPRMC,091859.800,A,3204.8736,N,11853.4971,E,12.34,14.92,280313,,,A*56";奇怪的刚看上去是显示都正常了,但又发模拟GPS数据的串口输入无效,无论怎么变化串口数据,都显示上面这个字符串的内容里的经纬度和速度数据,就是看上去串口输入的数据不能改变comdata。为了验证这点,我改了程序部分语句,变成:
#include <LiquidCrystal.h>   
String comdata1 = "";
String comdata;
String text4;
String text5;
String text6;
int i;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{

  lcd.clear();
  Serial.begin(9600);
//  delay(3000);
// Serial.print ("PMTK251,115200");
// Serial.print ("PMTK300,100,0,0,0,0");
Serial.print ("$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29");
  lcd.begin(16,2);
  lcd.print("GPS DEMO");
  delay(3000);
  lcd.clear();
}
void loop()
{//y
   while (Serial.available() > 0)
{   //y
   for (byte i=1;i<=70;i++);
   {
comdata1 += char(Serial.read());
    delay(2);
   }
comdata1.toUpperCase();
comdata1.trim();
comdata = comdata1;                                                                                                                                    //A:
//comdata="$GPRMC,091859.800,A,3204.8736,N,11853.4971,E,12.34,14.92,280313,,,A*56";                   //B:
Serial.print(comdata);
text4=(comdata.substring(comdata.indexOf('$')));
//Serial.println(text4);
text5=(text4.substring(text4.indexOf('A')+2));
text6=(text5.substring(0,text5.indexOf(',')));  
Serial.print(text6);
  lcd.setCursor(0, 0);
  lcd.print((text6));
  text5=(text4.substring(text4.indexOf('N')+2));
  text6=(text5.substring(0,text5.indexOf(',')));  
  Serial.print(text6);
  lcd.setCursor(0, 1);
  lcd.print((text6));
  text5=(text4.substring(text4.indexOf('E')+2));
  text6=(text5.substring(0,text5.indexOf(',')));  
  Serial.print(text6);
  lcd.setCursor(10, 0);
  lcd.print((text6));
//    lcd.clear();
  comdata1 = "";

}//y
}
主要是增加了commdata1这个变量,让前半部分用comdata1变量,后半部分用comdata变量,中间通过
commdata=commdata1给commdata变量数据看看是否接受到串口数据,结果用commdata=commdata1就不正常,用comdata="$GPRMC,091859.800,A,3204.8736,N,11853.4971,E,12.34,14.92,280313,,,A*56";就能屏幕显示(当然这个数是死的),就是说分别屏蔽语句A和语句B结果不一样,您看着是什么原因?
发表于 2013-4-12 13:04 | 显示全部楼层
你把读到的comdata,和你的comdata="$GPRMC,091859.800,A,3204.8736,N,11853.4971,E,12.34,14.92,280313,,,A*56";
比对一下,看看是不是完全一致呢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-28 15:39 , Processed in 0.075614 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表