找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5226|回复: 3
收起左侧

arduino实现的neo-6m的gps模块spi接口的oled显示程序

[复制链接]
ID:465223 发表于 2019-3-12 16:39 | 显示全部楼层 |阅读模式
自己弄来玩一下,交流交流
IMG_20190114_161656.jpg
单片机源程序如下:
  1. //此处为了兼容其他的多串口Arduino板子
  2. #define GpsSerial  Serial
  3. #define DebugSerial Serial//用的是同一串口


  4. #include "U8glib.h"
  5. int L = 13; //LED指示灯引脚
  6. U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9);  // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
  7. struct
  8. {
  9.         char GPS_Buffer[80];
  10.         bool isGetData;                //是否获取到GPS数据
  11.         bool isParseData;        //是否解析完成
  12.         char UTCT[11];                //UTC时间
  13.         char weidu[11];                //纬度
  14.         char N_S[2];                //N/S
  15.         char jingdu[12];                //经度
  16.         char E_W[2];                //E/W
  17.         bool isUsefull;                //定位信息是否有效
  18. } Save_Data;

  19. const unsigned int gpsRxBufferLength = 600;
  20. char gpsRxBuffer[gpsRxBufferLength];
  21. unsigned int ii = 0;


  22. void setup()        //初始化内容
  23. {
  24.         GpsSerial.begin(9600);                        //定义波特率9600,和我们店铺的GPS模块输出的波特率一致
  25.         DebugSerial.begin(9600);
  26.         DebugSerial.println("GPS information");
  27.         DebugSerial.println("Please wating...");

  28.         Save_Data.isGetData = false;
  29.         Save_Data.isParseData = false;
  30.         Save_Data.isUsefull = false;

  31. }

  32. void loop()                //主循环
  33. {
  34.         gpsRead();        //获取GPS数据
  35.         parseGpsBuffer();//解析GPS数据
  36.         printGpsBuffer();//输出解析后的数据
  37.         // DebugSerial.println("\r\n\r\nloop\r\n\r\n");
  38. // picture loop
  39.   u8g.firstPage();  
  40.   do {
  41.    draw();
  42.   } while( u8g.nextPage() );
  43.   
  44.   // rebuild the picture after some delay
  45.   delay(5000);
  46. }

  47. void draw(void) {
  48.   // graphic commands to redraw the complete screen should be placed here  
  49. // u8g.setFont(u8g_font_unifont);
  50.   //u8g.setPrintPos(0, 20);
  51.   // call procedure from base class, http://arduino.cc/en/Serial/Print
  52.   //u8g.print("Hello World!");
  53.    u8g.setFont(u8g_font_unifont);
  54.     u8g.setPrintPos(0, 10);
  55.     u8g.print("UTCT =  ");
  56.     u8g.setPrintPos(50, 10);
  57.     u8g.print(Save_Data.UTCT);
  58.    
  59.      u8g.setFont(u8g_font_unifont);
  60.       u8g.setPrintPos(0, 20);
  61.       u8g.print("weidu = ");
  62.        u8g.setPrintPos(65, 20);
  63.       u8g.print(Save_Data.weidu);
  64.       
  65.       u8g.setFont(u8g_font_unifont);
  66.       u8g.setPrintPos(0, 30);
  67.       u8g.print("N_S = ");
  68.       u8g.setPrintPos(45, 30);
  69.       u8g.print(Save_Data.N_S);
  70.       
  71.       u8g.setFont(u8g_font_unifont);
  72.        u8g.setPrintPos(0, 40);
  73.       u8g.print("jingdu = ");
  74.       u8g.setPrintPos(65, 40);
  75.       u8g.print(Save_Data.jingdu);
  76.      
  77.       u8g.setFont(u8g_font_unifont);
  78.       u8g.setPrintPos(0, 50);
  79.       u8g.print("E_W = ");
  80.       u8g.setPrintPos(45, 50);
  81.       u8g.print(Save_Data.E_W);

  82.        u8g.setFont(u8g_font_unifont);
  83.       u8g.setPrintPos(5, 60);
  84.       u8g.print("GPS Information ");
  85.    

  86. }

  87. void errorLog(int num)
  88. {
  89.         DebugSerial.print("ERROR");
  90.         DebugSerial.println(num);
  91.         while (1)
  92.         {
  93.                 digitalWrite(L, HIGH);
  94.                 delay(300);
  95.                 digitalWrite(L, LOW);
  96.                 delay(300);
  97.         }
  98. }

  99. void printGpsBuffer()//输出解析后的数据
  100. {
  101.         if (Save_Data.isParseData)
  102.         {
  103.                 Save_Data.isParseData = false;
  104.                
  105.                 DebugSerial.print("Save_Data.UTCT = ");
  106.                 DebugSerial.println(Save_Data.UTCT);
  107.    
  108.    
  109.    
  110.      
  111.    
  112.                 if(Save_Data.isUsefull)
  113.                 {
  114.                         Save_Data.isUsefull = false;
  115.      
  116.    
  117.                         DebugSerial.print("Save_Data.weidu = ");
  118.                         DebugSerial.println(Save_Data.weidu);
  119.                         DebugSerial.print("Save_Data.N_S = ");
  120.                         DebugSerial.println(Save_Data.N_S);
  121.                         DebugSerial.print("Save_Data.jingdu = ");
  122.                         DebugSerial.println(Save_Data.jingdu);
  123.                         DebugSerial.print("Save_Data.E_W = ");
  124.                         DebugSerial.println(Save_Data.E_W);
  125.      
  126.                 }
  127.                 else
  128.                 {
  129.                         DebugSerial.println("data is wrong");
  130.      
  131.       
  132.                
  133.         }
  134. }
  135. }

  136. void parseGpsBuffer()//解析GPS数据
  137. {
  138.         char *subString;
  139.         char *subStringNext;
  140.         if (Save_Data.isGetData)
  141.         {
  142.                 Save_Data.isGetData = false;
  143.                 DebugSerial.println("**************");
  144.                 DebugSerial.println(Save_Data.GPS_Buffer);

  145.                
  146.                 for (int i = 0 ; i <= 6 ; i++)
  147.                 {
  148.                         if (i == 0)
  149.                         {
  150.                                 if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
  151.                                         errorLog(1);        //解析错误
  152.                         }
  153.                         else
  154.                         {
  155.                                 subString++;
  156.                                 if ((subStringNext = strstr(subString, ",")) != NULL)
  157.                                 {
  158.                                         char usefullBuffer[2];
  159.                                         switch(i)
  160.                                         {
  161.                                                 case 1:memcpy(Save_Data.UTCT, subString, subStringNext - subString);break;        //获取UTC时间
  162.                                                 case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break;        //获取UTC时间
  163.                                                 case 3:memcpy(Save_Data.weidu, subString, subStringNext - subString);break;        //获取纬度信息
  164.                                                 case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break;        //获取N/S
  165.                                                 case 5:memcpy(Save_Data.jingdu, subString, subStringNext - subString);break;        //获取经度度信息
  166.                                                 case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break;        //获取E/W

  167.                                                 default:break;
  168.                                         }

  169.                                         subString = subStringNext;
  170.                                         Save_Data.isParseData = true;
  171.                                         if(usefullBuffer[0] == 'A')
  172.                                                 Save_Data.isUsefull = true;
  173.                                         else if(usefullBuffer[0] == 'V')
  174.                                                 Save_Data.isUsefull = false;

  175.                                 }
  176.                                 else
  177.                                 {
  178.                                         errorLog(2);        //解析错误
  179.                                 }
  180.                         }


  181.                 }
  182.         }

  183. }


  184. void gpsRead() //获取GPS数据
  185. {
  186.         while (GpsSerial.available())
  187.         {
  188.                 gpsRxBuffer[ii++] = GpsSerial.read();
  189.                 if (ii == gpsRxBufferLength)clrGpsRxBuffer();
  190.         }

  191.         char* GPS_BufferHead;
  192.         char* GPS_BufferTail;
  193.         if ((GPS_BufferHead = strstr(gpsRxBuffer, "$GPRMC,")) != NULL || (GPS_BufferHead = strstr(gpsRxBuffer, "$GNRMC,")) != NULL )
  194.         {
  195.                 if (((GPS_BufferTail = strstr(GPS_BufferHead, "\r\n")) != NULL) && (GPS_BufferTail > GPS_BufferHead))//"\r\n"回车换行的符号
  196.                 {
  197.                         memcpy(Save_Data.GPS_Buffer, GPS_BufferHead, GPS_BufferTail - GPS_BufferHead);
  198.                         Save_Data.isGetData = true;

  199.                         clrGpsRxBuffer();
  200.                 }
  201.         }

  202. }

  203. void clrGpsRxBuffer(void)
  204. {
  205.         memset(gpsRxBuffer, 0, gpsRxBufferLength);      //清空
  206.         ii = 0;
  207. }
复制代码

所有资料51hei提供下载:
程序.rar (2.26 KB, 下载次数: 35)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:595997 发表于 2019-8-14 15:23 来自手机 | 显示全部楼层
您好,gps的tx接哪脚?
回复

使用道具 举报

ID:645611 发表于 2019-11-20 11:30 | 显示全部楼层
您好,想问下楼主下载文件编译后出现U8glib.h: No such file or directory的错误,是因为没有这个头文件的原因吗
回复

使用道具 举报

ID:79544 发表于 2020-9-14 11:21 | 显示全部楼层
suimodeyaoyuan 发表于 2019-11-20 11:30
您好,想问下楼主下载文件编译后出现U8glib.h: No such file or directory的错误,是因为没有这个头文件的 ...

安装这个库就行啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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