单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1339|回复: 1
收起左侧

求大神看下STC12C5A60S2单片机串口程序

[复制链接]
里本来 发表于 2017-5-19 14:46 | 显示全部楼层 |阅读模式
编译之后的提示
Build target 'Target 1'
linking...
Program Size: data=117.0 xdata=121 code=1707
creating hex file from "gps2"...
"gps2" - 0 Error(s), 0 Warning(s).
我想知道为什么在串口助手里连我标红的那两行串口测试的两串字符也不显示


  1. #include<STC12C5A60S2.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #define false 0
  6. #define true 1

  7. //定义数组长度
  8. #define GPS_Buffer_Length 80
  9. #define UTCTime_Length 11
  10. #define latitude_Length 11
  11. #define N_S_Length 2
  12. #define longitude_Length 12
  13. #define E_W_Length 2

  14. #define gpsRxBufferLength  76
  15. char idata gpsRxBuffer[gpsRxBufferLength];
  16. unsigned char RX_Count;



  17. //函数或者变量声明
  18. void Delay_ms(unsigned int n);

  19. void printGpsBuffer();
  20. void parseGpsBuffer();
  21. void errorLog(int num);
  22. void Uart_Init();
  23. void UartPrintf(unsigned char *p);
  24. void UartPrintASCII(unsigned char c);
  25. void Uart_Init();
  26. void UartPrintf(unsigned char *p);
  27. void UartPrintASCII(unsigned char c);
  28. extern void clrStruct();


  29. struct SaveData
  30. {
  31.         char GPS_Buffer[GPS_Buffer_Length];
  32.         char isGetData;                //是否获取到GPS数据
  33.         char isParseData;        //是否解析完成
  34.         char UTCTime[UTCTime_Length];                //UTC时间
  35.         char latitude[latitude_Length];                //纬度
  36.         char N_S[N_S_Length];                //N/S
  37.         char longitude[longitude_Length];                //经度
  38.         char E_W[E_W_Length];                //E/W
  39.         char isUsefull;                //定位信息是否有效
  40. } xdata Save_Data;





  41. #define gpsRxBufferLength  76
  42. char idata gpsRxBuffer[gpsRxBufferLength];
  43. unsigned char RX_Count=0;

  44. void main()
  45. {
  46.         unsigned char i = 0;
  47.         Uart_Init();
  48.         Delay_ms(10);

  49.         [color=#ff0000]UartPrintf("Welcome to use!");                                             //测试串口是正确[/color]
  50. [color=#ff0000]        UartPrintf("ILoveMCU.taobao.com");[/color]

  51.         clrStruct();        //清空缓存数组


  52.         while(1)
  53.         {
  54.                 parseGpsBuffer();
  55.                 printGpsBuffer();
  56.         }
  57. }
  58. void Uart_Init()                                                                     
  59. {
  60.         SCON = 0X50;  //UART方式1;8位UART
  61.         REN  = 1;     //允许串行口接收数据
  62.         PCON = 0x00;  //SMOD=0;波特率不加倍
  63.         TMOD = 0x20;  //T1方式2,用于产生波特率
  64.         TH1  = 0xFD;  //装初值
  65.         TL1  = 0xFD;
  66.         TR1  = 1;     //启动定时器1
  67.         EA   = 1;     //打开全局中断控制
  68.         ES   = 1;     //打开串行口中断        
  69. }

  70. void UartPrintf(unsigned char *p)                                //发送字符串
  71. {        
  72.          while(*p)
  73.          {
  74.                  SBUF=*(p++);
  75.                 while(TI==0)
  76.                 {

  77.                 };
  78.                 TI=0;
  79.         }   
  80. }

  81. void UartPrintASCII(unsigned char c)                                //发送一个字符
  82. {
  83.     TI=0;   
  84.     SBUF=c;   
  85.     while(TI==0);   
  86.     TI=0;   
  87. }


  88. void RECEIVE_DATA(void) interrupt 4 using 3                          
  89. {
  90.         unsigned char temp = 0;
  91.         char i = 0;
  92.         ES=0;
  93.         temp = SBUF;
  94.         RI = 0;
  95.         
  96.         if(temp == ')
  97.         {
  98.                 RX_Count = 0;        
  99.         }
  100.                
  101.         if(RX_Count <= 5)
  102.         {
  103.            gpsRxBuffer[RX_Count++] = temp;
  104.         }
  105.         else if(gpsRxBuffer[0] == ' &gpsRxBuffer[4] == 'M' && gpsRxBuffer[5] == 'C')                        //确定是否收到"GPRMC/GNRMC"这一帧数据
  106.         {
  107.                 gpsRxBuffer[RX_Count++] = temp;
  108.                 if(temp == '\n')                                                                           
  109.                 {
  110.                         memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);      //清空
  111.                         memcpy(Save_Data.GPS_Buffer, gpsRxBuffer, RX_Count);         //保存数据
  112.                         Save_Data.isGetData = true;
  113.                         RX_Count = 0;
  114.                         memset(gpsRxBuffer, 0, gpsRxBufferLength);      //清空                                
  115.                 }
  116.                
  117.                 if(RX_Count >= 75)
  118.                 {
  119.                         RX_Count = 75;
  120.                         gpsRxBuffer[RX_Count] = '\0';//添加结束符
  121.                 }                        
  122.         }
  123.         ES=1;
  124. }

  125. void clrStruct()
  126. {
  127.         Save_Data.isGetData = false;
  128.         Save_Data.isParseData = false;
  129.         Save_Data.isUsefull = false;
  130.         memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);      //清空
  131.         memset(Save_Data.UTCTime, 0, UTCTime_Length);
  132.         memset(Save_Data.latitude, 0, latitude_Length);
  133.         memset(Save_Data.N_S, 0, N_S_Length);
  134.         memset(Save_Data.longitude, 0, longitude_Length);
  135.         memset(Save_Data.E_W, 0, E_W_Length);
  136.         
  137. }
  138. void errorLog(int num)
  139. {
  140.         
  141.         while (1)
  142.         {
  143.                   UartPrintf("ERROR");
  144.                 UartPrintASCII(num+0x30);
  145.                 UartPrintf("\r\n");
  146.         }
  147. }

  148. void parseGpsBuffer()
  149. {
  150.         char *subString;
  151.         char *subStringNext;
  152.         char i = 0;
  153.         if (Save_Data.isGetData)
  154.         {
  155.                 Save_Data.isGetData = false;
  156.                 UartPrintf("**************\r\n");
  157.                 UartPrintf(Save_Data.GPS_Buffer);

  158.                
  159.                 for (i = 0 ; i <= 6 ; i++)
  160.                 {
  161.                         if (i == 0)
  162.                         {
  163.                                 if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
  164.                                         errorLog(1);        //解析错误
  165.                         }
  166.                         else
  167.                         {
  168.                                 subString++;
  169.                                 if ((subStringNext = strstr(subString, ",")) != NULL)
  170.                                 {
  171.                                         char usefullBuffer[2];
  172.                                         switch(i)
  173.                                         {
  174.                                                 case 1:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break;        //获取UTC时间
  175.                                                 case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break;        //获取UTC时间
  176.                                                 case 3:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;        //获取纬度信息
  177.                                                 case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break;        //获取N/S
  178.                                                 case 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break;        //获取经度信息
  179.                                                 case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break;        //获取E/W

  180.                                                 default:break;
  181.                                         }

  182.                                         subString = subStringNext;
  183.                                         Save_Data.isParseData = true;
  184.                                         if(usefullBuffer[0] == 'A')
  185.                                                 Save_Data.isUsefull = true;
  186.                                         else if(usefullBuffer[0] == 'V')
  187.                                                 Save_Data.isUsefull = false;

  188.                                 }
  189.                                 else
  190.                                 {
  191.                                         errorLog(2);        //解析错误
  192.                                 }
  193.                         }


  194.                 }
  195.         }
  196. }

  197. void printGpsBuffer()
  198. {
  199.         if (Save_Data.isParseData)
  200.         {
  201.                 Save_Data.isParseData = false;
  202.                
  203.                 UartPrintf("Save_Data.UTCTime = ");
  204.                 UartPrintf(Save_Data.UTCTime);
  205.                 UartPrintf("\r\n");

  206.                 if(Save_Data.isUsefull)
  207.                 {
  208.                         Save_Data.isUsefull = false;
  209.                         UartPrintf("Save_Data.latitude = ");
  210.                         UartPrintf(Save_Data.latitude);
  211.                         UartPrintf("\r\n");


  212.                         UartPrintf("Save_Data.N_S = ");
  213.                         UartPrintf(Save_Data.N_S);
  214.                         UartPrintf("\r\n");

  215.                         UartPrintf("Save_Data.longitude = ");
  216.                         UartPrintf(Save_Data.longitude);
  217.                         UartPrintf("\r\n");

  218.                         UartPrintf("Save_Data.E_W = ");
  219.                         UartPrintf(Save_Data.E_W);
  220.                         UartPrintf("\r\n");
  221.                 }
  222.                 else
  223.                 {
  224.                         UartPrintf("GPS DATA is not usefull!\r\n");
  225.                 }
  226.                
  227.         }
  228. }

  229. //****************************************************
  230. //MS延时函数
  231. //****************************************************
  232. void Delay_ms(unsigned int n)
  233. {
  234.         unsigned int  i,j;
  235.         for(i=0;i<n;i++)
  236.                 for(j=0;j<123;j++);
  237. }
复制代码
回复

使用道具 举报

手插肚兜 发表于 2018-6-15 22:40 | 显示全部楼层
SUBF被占用了,没清空
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

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