搜索
bottom↓
回复: 67

51的程序做了快两年了,但程序质量一直不理想,怎么才能提高自己的编程水平啊???希望高手指

[复制链接]

出0入0汤圆

发表于 2011-6-27 16:54:21 | 显示全部楼层 |阅读模式
如题!!!
修改内容: 增加了一个GPS数据处理程序,供新手参考,望高手指点程序质量好坏!!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-6-27 17:01:44 | 显示全部楼层
看别人的程序,比如看看uc os,或者uboot,或者linux

出0入0汤圆

 楼主| 发表于 2011-6-27 17:34:32 | 显示全部楼层
现在写的程序一般都是顺序结构,刚刚了解了状态机,现在还用不好。 想知道一些编程时像状态机这样的方法和技巧;

出0入0汤圆

发表于 2011-6-27 17:39:36 | 显示全部楼层
回复【2楼】jdzjk06  
现在写的程序一般都是顺序结构,刚刚了解了状态机,现在还用不好。 想知道一些编程时像状态机这样的方法和技巧;
-----------------------------------------------------------------------

2年 才 了解 状态机,有点晚哦

出0入0汤圆

 楼主| 发表于 2011-6-27 17:48:13 | 显示全部楼层
回复【3楼】823032003 尼美根
-----------------------------------------------------------------------

是啊 一直都属于闭门造车,公司很小,什么都是自学!!所以有点迷茫……

出0入0汤圆

发表于 2011-6-27 17:55:00 | 显示全部楼层
编程这个东西,主要是一个编程的思想,别给你讲几句,抵你自已搞半年。

出0入0汤圆

发表于 2011-6-27 17:55:03 | 显示全部楼层
多做项目就能快速提高

出0入0汤圆

发表于 2011-6-27 17:58:14 | 显示全部楼层
我也两年了 状态机都不懂

出0入0汤圆

发表于 2011-6-27 18:01:45 | 显示全部楼层
盲目也不行,我之前也是急,C语言,操作系统,英语,STM32杂七杂八一起学,弄的大半年过去感觉还是没什么进步

出0入0汤圆

发表于 2011-6-27 18:08:10 | 显示全部楼层
先看多点别人写的好程序吧,所谓熟读唐诗三百首,不会作诗也会吟

出0入0汤圆

发表于 2011-6-27 18:10:05 | 显示全部楼层
一方面,深入单片机内部,熟悉微机原理,了解C语言的编译和汇编程序。这样非常有助于写出很高效的代码,以及解决一些c语言容易出现的“““莫名其妙”””的问题。
二方面,系统学习算法。
三方面,读读操作系统源码或者其他高质量的代码,如1楼所说的。

只要上面三方面可以做到,保证编程水平突飞猛涨。

出0入0汤圆

发表于 2011-6-27 19:21:18 | 显示全部楼层
告诉一个方法,懒点,但是不要躲,总是闲麻烦,然后想办法让其简单即是,好的编程方法最终都是最省事的。

出0入0汤圆

发表于 2011-6-27 20:57:56 | 显示全部楼层
回复【10楼】mitchell  
一方面,深入单片机内部,熟悉微机原理,了解c语言的编译和汇编程序。这样非常有助于写出很高效的代码,以及解决一些c语言容易出现的“““莫名其妙”””的问题。
二方面,系统学习算法。
三方面,读读操作系统源码或者其他高质量的代码,如1楼所说的。
只要上面三方面可以做到,保证编程水平突飞猛涨。
-----------------------------------------------------------------------

学习一下

出0入0汤圆

发表于 2011-6-27 21:22:13 | 显示全部楼层
回复【10楼】mitchell   
一方面,深入单片机内部,熟悉微机原理,了解c语言的编译和汇编程序。这样非常有助于写出很高效的代码,以及解决一些c语言容易出现的“““莫名其妙”””的问题。
二方面,系统学习算法。
三方面,读读操作系统源码或者其他高质量的代码,如1楼所说的。
只要上面三方面可以做到,保证编程水平突飞猛涨。
-----------------------------------------------------------------------

再学习一下

出0入0汤圆

发表于 2011-6-27 22:14:36 | 显示全部楼层
51单片机最好是用状态机,其它的算法结构对于小空间来说不好使

出0入0汤圆

 楼主| 发表于 2011-6-27 22:31:55 | 显示全部楼层
确实啊,别人指点一下胜过自己搞半年,关键是没人指导,呵呵!!也没有太多的项目,目前快一年了就一直围绕一个项目不断的完善完善再完善,但读起自己的程序来感觉还是不那么理想,不精练、不高效! 上面大家提的意见都很好,很感谢大家!!回头整理个自己写的GPS数据分拣的程序,给新手做个参考,顺便也让高手评价评价,看看质量怎么样!!

出0入0汤圆

发表于 2011-6-27 22:51:13 | 显示全部楼层
二方面,系统学习算法。
如果能指点一下看什么书就好了

出0入0汤圆

发表于 2011-6-27 23:19:11 | 显示全部楼层
回复【15楼】jdzjk06
确实啊,别人指点一下胜过自己搞半年,关键是没人指导,呵呵!!也没有太多的项目,目前快一年了就一直围绕一个项目不断的完善完善再完善,但读起自己的程序来感觉还是不那么理想,不精练、不高效! 上面大家提的意见都很好,很感谢大家!!回头整理个自己写的gps数据分拣的程序,给新手做个参考,顺便也让高手评价评价,看看质量怎么样!!
-----------------------------------------------------------------------

我估计你的问题在于规划不够。应该是过分注重开发效率(速度)而忽视了设计。
就像写作,没有一个好的提纲。写到哪里算哪里,然后试下来,有问题再修修补补,结果程序结构越来越差。

如果你无法改变你的工作环境,我说句可能让你丧气的话:你很难改变。

如果有可能,我建议你可以进入大公司,感受一下研发的过程应该是怎样的。

出0入0汤圆

 楼主| 发表于 2011-6-28 08:27:44 | 显示全部楼层
回复【17楼】Cliff
-----------------------------------------------------------------------

非常支持您的观点!!!可是现在的水平有限,大公司不好进啊!

出0入0汤圆

 楼主| 发表于 2011-6-28 08:31:18 | 显示全部楼层
上一个采集卫星定位信息,并把采集到的原始字符数据转换成压缩BCD格式,由于程序结构不好,是从整个项目程序中复制过来的一小段,可能会有个别全局变量在该段程序中未注明:

/*
采集到的原始定位数据:$GPRMC,170034.00,A,3928.04929,N,11800.89192,E,0.023,,300411,,,A*72end

*/


uchar   *GpsC[7]={GPS.HMS,GPS.State,GPS.N,GPS.E,GPS.Speed,GPS.Course,GPS.YMD};
extern  struct GPSDATAC{
uchar *HMS;                            //定位模块中采集到的时间时分秒
uchar *State;                        //定位状态 A V X
uchar *N;                                    //纬度
uchar *E;                                        //经度
uchar *Speed;                            //速度
uchar *Course;                      //航向
uchar *YMD;                //日期年月日
}GpsPointer;
extern  struct GPSDATA{
uchar HMS[6];
uchar State[4];
uchar N[6];
uchar E[7];
uchar Speed[6];
uchar Course[6];
uchar YMD[7];
}GPS;

/*
***********************************************************************
函数名称: 航向处理
函数功能: 将从GPS模块采集到的航向字符串转换成BCD码
入口参数: 要转换的字符串 ,转换结果存放的地址
出口参数: 转换后的BCD字节数
***********************************************************************
*/
uchar  GpsCourseProcess(uchar *courseAscii,uchar *courseBCD)
{
uchar i,j;
uint  ZsBin=0,ZsBcd=0;
uchar  XsBin=0,XsBcd=0;
uchar BiytNumber=0;
   for(i=0;i<5;i++){
        if(courseAscii[0]==',')  { return 0;        }         ///////courseBCD[0]=0x00;        return 0;
                if(courseAscii=='.'){
                   for(j=0;j<i;j++){
                               ZsBin=ZsBin*10;
                                ZsBin+=(courseAscii[j]-'0');
                       }
                   if(courseAscii[i+1]!=','&&courseAscii[i+2]!=','){
                              XsBcd=((courseAscii[i+1]-'0')<<4)|(courseAscii[i+2]-'0');
                      }else{
                            XsBcd=0x00;
                          }
                   if(ZsBin>99){
                       BinToBcd(ZsBin,&ZsBcd);
                           courseBCD[0]=0x06;                                   //航向字段字节数
                           courseBCD[1]=0x02;                                   //0x02表示BCD数据格式,数据为正数,小数点后有两位有效数字
                           courseBCD[2]=0x04;                  //航向的寄存器号
                           courseBCD[3]=ZsBcd>>8;
                           courseBCD[4]=ZsBcd&0xff;
                           courseBCD[5]=XsBcd;
                           BiytNumber=6;
                           break;
                           }else{
                           BinToBcd(ZsBin,&ZsBcd);
                           courseBCD[0]=0x05;                                  //航向字段字节数
                           courseBCD[1]=0x02;                                  //0x02表示BCD数据格式,数据为正数,小数点后有两位有效数字
                           courseBCD[2]=0x04;                 //航向的寄存器号
                           courseBCD[3]=ZsBcd&0xff;
                           courseBCD[4]=XsBcd;
                           BiytNumber=5;
                           break;
                           }
                  }
       }         
  return BiytNumber;
}

/*
***********************************************************************
函数名称: 速度处理
函数功能: 将GPS模块采集到的速度字符串转换为BCD码格式,并且原来的单位是
           海里/小时,转换为千米/小时,
入口参数: 要转换的字符串
出口参数: 无
***********************************************************************
*/
uchar GpsSpeedProcess(uchar *speedAscii,uchar *speedBCD)
{
uchar i,j;
uchar BiytNumber=0;                                                           //转换后的BCD码位数
uint speedZsBin=0,speedZsBcd=0,speedXsBcd=0;
uchar speedXsBin=0;
  for(i=0;i<4;i++)
     {
           if(speedAscii[0]==',') {  return 0;}            /// speedBCD[0]=0x00;        return 0;
       if(speedAscii=='.'){
                    for(j=0;j<i;j++){
                             speedZsBin=speedZsBin*10;
                           speedZsBin+=(speedAscii[j]-'0');
                      }
                  speedZsBin=speedZsBin*1.852;                              //海里转换为公里  整数部分       
                  if(speedAscii[i+1]!=','&&speedAscii[i+2]!=','){
                             speedXsBin=(speedAscii[i+1]-'0')*10+(speedAscii[i+2]-'0');
                     }else{
                           speedXsBin=0x00;
                         }
                  speedXsBin=speedXsBin*1.852;
                  if(speedXsBin>99){
                           speedZsBin+=1;
                     }          
                  BinToBcd(speedXsBin,&speedXsBcd);
                  if(speedZsBin>99){
                           BinToBcd(speedZsBin,&speedZsBcd);
                           speedBCD[0]=0x06;                           //速度字段的字节数
                           speedBCD[1]=0x02;                           //0x02表示BCD数据格式,数据为正数,小数点后有两位有效数字
                           speedBCD[2]=0x03;               //速度的寄存器号0x03
                           speedBCD[3]=speedZsBcd>>8;
                           speedBCD[4]=speedZsBcd&0xff;
                           speedBCD[5]=speedXsBcd&0xff;
                           BiytNumber=6;
                           break;
                        }else{
                           BinToBcd(speedZsBin,&speedZsBcd);
                           speedBCD[0]=0x05;                          //速度字段的字节数
                           speedBCD[1]=0x02;                          //0x02表示BCD数据格式,数据为正数,小数点后有两位有效数字
                           speedBCD[2]=0x03;                  //速度的寄存器号0x03
                           speedBCD[3]=speedZsBcd&0xff;
                           speedBCD[4]=speedXsBcd&0xff;
                           BiytNumber=5;
                           break;
                        }
             }
     }
  return BiytNumber;
}

/*
***********************************************************************
函数名称: 日期、时间处理函数
函数功能: 处理采集到的GPS模块的时间和日期,处理后的日期时间以
           年高位、年低位、月、日、时、分、秒顺序排列,格式为压缩
                   BCD格式;
入口参数: 要处理的时间,要处理的日期,时间处理结果存放地址,
           日期处理结果存放地址        ,uchar *ResultBcdHMS,uchar *ResultBcdYMD
出口参数:
************************************************************************
*/
void GpsDataTimeProcess(uchar *timeHMS,uchar *dayYMD,uchar *ResultBcdHMS,uchar *ResultBcdYMD)
{
uchar TimeBinHMS[3];             //TimeBinHMS[0]---时;TimeBinHMS[1]---分;TimeBinHMS[2]---秒
uint  DayBinYMD[3];                                 //DayBinYMD[0]---年; DayBinYMD[1]---月; DayBinYMD[2]--日
uint  Year=0;
receive_count_com1=0;
  if(timeHMS[0]==','||dayYMD[0]==',')
   {
          //ResultBcdHMS[0]=0x00;
        //ResultBcdYMD[0]=0x00;
        return;
   }
   else
   {
/*--------------------------日期、时间字符串转BIN--------------*/
   TimeBinHMS[0]=(timeHMS[0]-'0')*10+(timeHMS[1]-'0');
   TimeBinHMS[1]=(timeHMS[2]-'0')*10+(timeHMS[3]-'0');
   TimeBinHMS[2]=(timeHMS[4]-'0')*10+(timeHMS[5]-'0');
   DayBinYMD[0]=(dayYMD[4]-'0')*10+(dayYMD[5]-'0')+2000;
   DayBinYMD[1]=(dayYMD[2]-'0')*10+(dayYMD[3]-'0');
   DayBinYMD[2]=(dayYMD[0]-'0')*10+(dayYMD[1]-'0');
/*-------------------------------------END--------------------*/
   TimeBinHMS[0]+=8;
/*----------------------------------------调整日期---------------------------------------------*/
   if(TimeBinHMS[0]>=24){         //如果大于等于24小时,侧需要调整日期   
          TimeBinHMS[0]-=24;
          DayBinYMD[2]++;
          switch(DayBinYMD[1])
            {
                 case 1: case 3:
                 case 5: case 7:
                 case 8: case 10:
                                   if(DayBinYMD[2]>31)
                                   {
                                           DayBinYMD[2]=1;
                                        DayBinYMD[1]++;
                                   }  
                         break;
                 case 4: case 6:
                 case 9: case 11:
                         if(DayBinYMD[2]>30)
                                   {
                                           DayBinYMD[2]=1;
                                        DayBinYMD[1]++;
                                   }  
                         break;
                 case 12: if(DayBinYMD[2]>31)
                                   {
                                           DayBinYMD[2]=1;
                                        DayBinYMD[1]=1;
                                        DayBinYMD[0]++;
                                   }
                                  break;
                 case 2:  if((DayBinYMD[0]%400==0)||((DayBinYMD[0]%4==0)&&(DayBinYMD[0]%100!=0))){                 //闰年
                            if(DayBinYMD[2]>29){
                                           DayBinYMD[2]=1;
                                           DayBinYMD[1]=3;
                                          }
                                   }else{                                                                                     //平年
                                            if(DayBinYMD[2]>28){
                                           DayBinYMD[2]=1;
                                           DayBinYMD[1]=3;
                                          }
                                   }
                          break;
                 default: break;
                }
     }
/*---------------------------------------------------END----------------------------------------*/
/*-------------------------------时间转换--------------------------------*/       
         ResultBcdHMS[0]=0x06;
         ResultBcdHMS[1]=0x00;
         ResultBcdHMS[2]=0x06;             //时间的寄存器号
         ResultBcdHMS[3]=((TimeBinHMS[0]/10)<<4)|(TimeBinHMS[0]%10);
         ResultBcdHMS[4]=((TimeBinHMS[1]/10)<<4)|(TimeBinHMS[1]%10);
         ResultBcdHMS[5]=((TimeBinHMS[2]/10)<<4)|(TimeBinHMS[2]%10);
/*----------------------------------END----------------------------------*/
/*--------------------------------日期转换-------------------------------*/         
         ResultBcdYMD[0]=0x07;
         ResultBcdYMD[1]=0x00;
         ResultBcdYMD[2]=0x07;             //日期的寄存器号
         BinToBcd(DayBinYMD[0],&Year);
         ResultBcdYMD[3]=Year>>8;
         ResultBcdYMD[4]=Year&0xff;
         ResultBcdYMD[5]=(((uchar)DayBinYMD[1]/10)<<4)|(DayBinYMD[1]%10);
         ResultBcdYMD[6]=(((uchar)DayBinYMD[2]/10)<<4)|(DayBinYMD[2]%10);
/*----------------------------------END----------------------------------*/
  }
}
/*
*****************************************************************
函数名称: GPS数据分拣
函数功能: 分拣采集到的GPS数据,把不同段数据首地址送给各自的指针
入口参数: 要分拣的GPS原始数据
出口参数: 无
*****************************************************************
*/
void GpsDataFenjian(uchar *GpsD)
{
uchar i,Dhao=0;
  for(i=0;i<150;i++){
     if(GpsD==','){
            Dhao++;
                switch(Dhao)
              {
                   case 1:  GpsPointer.HMS=&GpsD[i+1];      
                            break;
                   case 2:  GpsPointer.State=&GpsD[i+1];
                            break;
                   case 3:  GpsPointer.N=&GpsD[i+1];
                            break;
                   case 5:  GpsPointer.E=&GpsD[i+1];
                            break;
                   case 7:  GpsPointer.Speed=&GpsD[i+1];
                            break;
                   case 8:  GpsPointer.Course=&GpsD[i+1];
                            break;
                   case 9:  GpsPointer.YMD=&GpsD[i+1];
                            break;
                   default: break;
                  }
          }
         if(Dhao==10) break;
     }
  GPS.State[0]=0x04;                 
  GPS.State[1]=0x00;
  GPS.State[2]=0x05;
  switch(GpsPointer.State[0])
      {
           case 65:  GPS.State[3]=0x65;
                     //此处添加点亮GPS定位状态指示灯语句,定位有效
                                 break;
           case 86:  GPS.State[3]=0x86;
                     //此处添加熄灭GPS定位状态指示灯语句,定位无效
                                 break;
           default:  GPS.State[3]=0x88;
                     break;          
          }
  //return  GPS.State[3];
}

/*
**************************************************************************
函数名称: 经纬度字符转BCD
函数功能: 将从GPS模块中提取的字符串形式的经纬度信息转换成BCD码格式
入口参数: 要转换的经纬度字符串,转换结果存放地址(存放形式: 度  分 格式),寄存器号
出口参数: 转换后的BCD码的字节数
**************************************************************************
*/
uchar GpsNE_AscToBcd(uchar *p,uchar *q,uchar re)
{
uchar i,j,n;
uchar BiytNumb=0;                 //返回转换后的BCD码字节个数
uint  NEH=0;                              //存放整数部分
uint  NEL=0;                      //存放小数部分
uint  XsBcd16=0;
uint  ZsBcd16=0;
/*-------------将字符串转换为BIN----------*/
   if(p[0]==',')
     {       
        //  q[0]=0;
          return 0;
         }
   for(i=0;i<15;i++)
     if(p=='.'){                                          //寻找小数点
           for(j=i-2;j<i+4;j++){
             if(p[j]=='.') continue;
                 NEL=NEL*10;                                  ///分的转换
             NEL+=(p[j]-'0');
             }
           NEL=NEL/6;
           for(j=0;j<i-2;j++){
             NEH=NEH*10;
                 NEH+=(p[j]-'0');
                 }
          break;
         }
/*------------------END-------------------*/
   n=NEH;
/*-----------------------转换分----------*/
   BinToBcd(NEL,&XsBcd16);                                  //转换分
/*------------------------END------------*/
/*-------------------转换度---------------*/
   BinToBcd(NEH,&ZsBcd16);                              //转换度
   if(n>99){
     q[0]=0x07;
         q[1]=0x04;
         q[2]=re;
         q[3]=ZsBcd16>>8;                                  //保存度的高字节
     q[4]=ZsBcd16&0xff;                                               //保存度的低字节
         q[5]=XsBcd16>>8;                                     //保存分的高字节
     q[6]=XsBcd16&0xff;                            //保存分的低字节
     BiytNumb=7;
    }else{
     q[0]=0x06;
         q[1]=0x04;
         q[2]=re;
         q[3]=ZsBcd16&0xff;                                  //保存度,单字节
         q[4]=XsBcd16>>8;                                     //保存分的高字节
     q[5]=XsBcd16&0xff;                            //保存分的低字节
     BiytNumb=6;
    }
/*---------------------END---------------*/
   return  BiytNumb;
}
/*
************************************************************************
函数名称: 二进制转BCD码函数
函数功能: 将16位二进制数据转换为压缩BCD码格式
入口参数: 要转换的16位的二进制数据和转换结果的地址
出口参数: 转换后的两字节压缩BCD码
说    明: 本函数专门为GPS的经纬度设计,故要转换的二进制数据有
           范围大小的限制,因为转换结果为两字节BCD码,故转换结
                   果最大为9999,所以要转换的二进制数据不大于0x270F
************************************************************************
*/         
uchar BinToBcd(uint Bin16,uint *Bcd16)
{
uchar BcdNumb=0;
uchar i;
for(i=0;i<16;i++){                               
      if((*Bcd16&0X0F)>=5)                    //大于等于5加3
            {
                  *Bcd16=(((*Bcd16&0x0F)+3)&0x0f)|(*Bcd16&0xfff0);
                }
          if(((*Bcd16&0Xf0)>>4)>=5)                //大于等于5加3
            {
                  *Bcd16=(((((*Bcd16&0Xf0)>>4)+3)&0x0f)<<4)|(*Bcd16&0xff0f);
                }         
         if(((*Bcd16&0X0F00)>>8)>=5)                     //大于等于5加3
            {
              *Bcd16=(((((*Bcd16&0x0F00)>>8)+3)&0x0f)<<8)|(*Bcd16&0xf0ff);
                }
          if(((*Bcd16&0Xf000)>>12)>=5)               //大于等于5加3
            {
                  *Bcd16=(((((*Bcd16&0Xf000)>>12)+3)&0x0f)<<12)|(*Bcd16&0x0fff);
                }         
          *Bcd16=(*Bcd16<<1)|(bit)(Bin16&0x8000);
          Bin16=Bin16<<1;
      }            
return BcdNumb;
}

出0入0汤圆

发表于 2011-6-28 10:24:32 | 显示全部楼层
要以战养战,实践中学习,只要程序功能对,不死机,质量就不错

出0入0汤圆

发表于 2011-6-28 11:35:39 | 显示全部楼层
看起来挺难受.多用用结构体

出0入0汤圆

发表于 2011-6-28 11:51:29 | 显示全部楼层
混混

出0入0汤圆

发表于 2011-6-28 13:41:15 | 显示全部楼层
看起来挺难受.多用用结构体   说的对
但是不会使用也没办法啊

出0入0汤圆

 楼主| 发表于 2011-6-28 14:59:49 | 显示全部楼层
热烈欢迎高手批评指教!!!

出0入0汤圆

发表于 2011-6-28 15:04:00 | 显示全部楼层
一年,不知状态机

出0入0汤圆

发表于 2011-6-28 15:23:16 | 显示全部楼层
回复【19楼】jdzjk06  
-----------------------------------------------------------------------

中间有个函数看着很不舒服,修改了一下,功能应该和原来的一样。
其他就没有仔细看了,有些函数代码过长,不够简洁。你去看看linux的原码,大多数函数都是很简短的几行。


原来的代码为:
void GpsDataFenjian(uchar *GpsD)
{
        uchar i,Dhao=0;
        for(i=0;i<150;i++){
                if(GpsD==','){
                        Dhao++;
                        switch(Dhao)
                        {
                        case 1:  GpsPointer.HMS=&GpsD[i+1];      
                                break;
                        case 2:  GpsPointer.State=&GpsD[i+1];
                                break;
                        case 3:  GpsPointer.N=&GpsD[i+1];
                                break;
                        case 5:  GpsPointer.E=&GpsD[i+1];
                                break;
                        case 7:  GpsPointer.Speed=&GpsD[i+1];
                                break;
                        case 8:  GpsPointer.Course=&GpsD[i+1];
                                break;
                        case 9:  GpsPointer.YMD=&GpsD[i+1];
                                break;
                        default: break;
                        }
                }
                if(Dhao==10) break;
        }
        GPS.State[0]=0x04;  
        GPS.State[1]=0x00;
        GPS.State[2]=0x05;
        switch(GpsPointer.State[0])
        {
        case 65:  GPS.State[3]=0x65;
                //此处添加点亮GPS定位状态指示灯语句,定位有效
                break;
        case 86:  GPS.State[3]=0x86;
                //此处添加熄灭GPS定位状态指示灯语句,定位无效
                break;
        default:  GPS.State[3]=0x88;
                break;   
        }
        //return  GPS.State[3];
}

修改为:

void GpsDataFenjian(uchar *GpsD)
{
        uchar i = 150, Dhao = 0;

        while(i--){
                if(*GpsD++ == ','){
                        switch(++Dhao){
                        case 1:  GpsPointer.HMS = GpsD;      
                                break;
                        case 2:  GpsPointer.State = GpsD;
                                break;
                        case 3:  GpsPointer.N = GpsD;
                                break;
                        case 5:  GpsPointer.E = GpsD;
                                break;
                        case 7:  GpsPointer.Speed = GpsD;
                                break;
                        case 8:  GpsPointer.Course = GpsD;
                                break;
                        case 9:  GpsPointer.YMD = GpsD;
                                break;
                        case 10:
                                GPS.State[0] = 0x04;  
                                GPS.State[1] = 0x00;
                                GPS.State[2] = 0x05;
                                //此处添加点亮GPS定位状态指示灯语句,定位有效
                                //此处添加熄灭GPS定位状态指示灯语句,定位无效
                                GPS.State[3] = (GpsPointer.State[0] == 65) ? 0x65 : \
                                        (GpsPointer.State[0] == 86) ? 0x65 : 0x88;
                                break;
                        }
                }
        }
}

出0入0汤圆

 楼主| 发表于 2011-6-28 20:35:04 | 显示全部楼层
回复【26楼】mitchell
-----------------------------------------------------------------------

受益了!! 不知道该怎么提高这方面的能力呢,推荐一些方法或书籍吧!!!

出0入4汤圆

发表于 2011-6-28 21:10:22 | 显示全部楼层
我来补一个数据接收功能,(作者不知道是谁了)

void gps_test(void)

{

    char cInputChar;

    char nStrBuf[200];

        int  set_baud,i = 0;

        uart_change_baud(UART1,9600);

        while(1)

        {

                cInputChar = uart_tran();                       

                        if (cInputChar == '$')

                        {

                                if(i != 0)

                                {

                                        if(!strncmp(nStrBuf,"$GPRMC ", 6))                // Format: $GPRMC,DATA,...,DATA

                                        {

                                                nStrBuf = cInputChar;

                                                gps_info(MSG_GPRMC,&nStrBuf[6]);

                                        }

                                }

                                i = 0;

                        }

                        nStrBuf = cInputChar;

                        i++;

        }

}

出0入0汤圆

发表于 2011-6-28 21:30:40 | 显示全部楼层
回复【27楼】jdzjk06  
回复【26楼】mitchell
-----------------------------------------------------------------------
受益了!! 不知道该怎么提高这方面的能力呢,推荐一些方法或书籍吧!!!
-----------------------------------------------------------------------

看代码吧:lwIP,很不错,代码类型同lz的应用非常类似。另外,系统库,类似(stdio.h, stdlib.h, string.h, ...)这些库里的各个函数的实现源码看一看,收货也不小。再者,操作系统如果不想深入学习,就看看设备驱动程序。
书籍我也想不起来,根据侧重点去搜吧。

出0入0汤圆

发表于 2011-6-28 21:33:47 | 显示全部楼层
单从软件来说,直接去尝试写编译器的一部分,一年之后,就会有登高望远之感。

出0入0汤圆

发表于 2011-6-28 21:50:43 | 显示全部楼层
回复【30楼】stdio  
单从软件来说,直接去尝试写编译器的一部分,一年之后,就会有登高望远之感。
-----------------------------------------------------------------------

写过吗?很早有想法,写了一部分汇编器的实现,最后发现没啥意义。
编译器,工程量浩大。解释器还有点意义。

出0入0汤圆

发表于 2011-6-28 22:48:13 | 显示全部楼层
回复【30楼】stdio  
单从软件来说,直接去尝试写编译器的一部分,一年之后,就会有登高望远之感。
-----------------------------------------------------------------------

这个已经提到了,“一方面。。。了解C语言的编译和汇编程序”,当然,只是境界不一样了

出0入0汤圆

发表于 2011-6-28 23:47:06 | 显示全部楼层
看了大家的回复,真是受益匪浅

出0入0汤圆

发表于 2011-6-29 08:22:35 | 显示全部楼层
回复【19楼】jdzjk06
-----------------------------------------------------------------------

说不好谁写的好  你可能写的已经很好了!

乱说几句  可能混乱

第一 关键是 C语言

extern  struct GPSDATAC{
uchar *HMS;     //定位模块中采集到的时间时分秒
uchar *State;         //定位状态 A V X
uchar *N;     //纬度
uchar *E; //经度
uchar *Speed;     //速度
uchar *Course;       //航向
uchar *YMD;                //日期年月日
}GpsPointer;

这个结构体本质就是个变量类型  用extern??

uchar  用 typedef unsigned char INT8U 或 uint8_t

if(courseAscii[i+1]!=','&&courseAscii[i+2]!=','){
改为  if((courseAscii[i+1]!=',')&&(courseAscii[i+2]!=',')){


break 不能随意用

uchar i,j;
改为uchar i = 0;
    uchar j = 0;

感觉你写的已经很好了

推荐 misra2004   代码大全

自己到google关键字

出0入0汤圆

发表于 2011-6-29 23:30:47 | 显示全部楼层
小白,学习

出0入0汤圆

 楼主| 发表于 2011-6-30 10:35:30 | 显示全部楼层
很感谢楼上的指教!!!我会继续努力……  呵呵!

出0入0汤圆

发表于 2011-7-1 10:48:20 | 显示全部楼层
回复【14楼】19001579  
-------------------------------------------------------------------
兄台,你说用状态机的思想编程可有什么书可以学习的,或者资料

出0入0汤圆

发表于 2011-7-8 23:20:35 | 显示全部楼层
看了UCOS的操作系统的书很受益,可以借鉴很多东西到程序中

出0入0汤圆

发表于 2011-10-28 21:02:54 | 显示全部楼层
mark..

出0入0汤圆

发表于 2011-10-28 21:44:58 | 显示全部楼层
什么叫状态机

出0入0汤圆

发表于 2011-10-28 22:30:00 | 显示全部楼层
本人深有同感,英语一般,这方面资料还都是英文的,想进步好难啊

出0入0汤圆

发表于 2011-10-29 21:42:47 | 显示全部楼层
什么叫 单片机 的状态机。。。。 是不是中断里处理标志位,主函数是个大循环,标志位有变,就处理,否则查下一个标志位,以此类推循环

出0入0汤圆

发表于 2011-10-30 15:48:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-30 16:53:45 | 显示全部楼层
学习了 受益匪浅

出0入0汤圆

发表于 2011-10-30 19:22:17 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-10-30 20:04:27 | 显示全部楼层
还不了解状态机,学习了。

出0入0汤圆

发表于 2011-10-30 20:14:53 | 显示全部楼层
受教了。。。

出0入0汤圆

发表于 2011-10-30 20:19:57 | 显示全部楼层
能解决问题,不在乎程序用多少高深的描述。

出0入0汤圆

发表于 2011-10-30 20:23:21 | 显示全部楼层
楼主写的不算差,起码变量和函数定义方面很规范。

但函数里if else和SWITCH CASE纠缠的太厉害,能否把功能好好划分一下,都弄成独立的函数。


另:C中定义变量,H中声明变量。
把和硬件有关的都定义一个公共头文件中,用英文单词替代,
这样换其他不同的芯片,也只是修改头文件中的和硬件有关的,其他不用动。

多写多看其他人写的代码。比如UCOS ,LINUX,MFC等等。

出0入0汤圆

发表于 2011-10-30 23:24:07 | 显示全部楼层
小白在此观摩~~

出0入0汤圆

发表于 2011-11-1 15:46:00 | 显示全部楼层
从你们的言论中我找到了我的缺点,从你们的言论中我找到了我的将来,从你们的言论中我找到了归宿,衷心的谢谢各位的分享!

出0入0汤圆

 楼主| 发表于 2011-11-4 15:06:12 | 显示全部楼层
...

出0入0汤圆

发表于 2011-11-4 15:22:34 | 显示全部楼层
对于编程能力,应该还可以,最近想学51单片机,可惜硬件是我的硬伤啊。编程倒是还行,毕竟用C/C++做开发有3年了。求LZ指导我51硬件方面的知识,我可以和LZ交流下编程知识。。呵呵。不知道咋样?
QQ:308378975

出0入0汤圆

发表于 2011-11-4 15:27:55 | 显示全部楼层
所谓的状态机,实际上应该是在面向对象的语言里用的一种设计模式,当然在C语言里也可以用,这样是程序的逻辑更清晰,大概的思路就是改变状态的同时,也改变程序的行为。在C语言里面,你可以简单的用结构体数组来实现状态机。类似这样:

typedef void (*pfnFunc)();

typedef struct state
{
     char state;
     pfnFunc proc;
}STATE_T;

然后用状态和对应的状态的行为(也就是函数)来初始化数组,然后。在处理的时候,就是使用状态来决定行为,代码会非常简洁,就不会有大段大段的if else 或者switch case的语句啦。。。。。呵呵。当然我说的是最简单的实现,自己可以慢慢完善他。。。。。LZ多交流。

出0入0汤圆

发表于 2011-11-4 16:21:01 | 显示全部楼层
确实是,我也是在闭门造车,内省中

出0入0汤圆

发表于 2011-11-4 16:26:12 | 显示全部楼层
学习学习!!!

出0入0汤圆

发表于 2011-11-4 21:58:11 | 显示全部楼层
回复【楼主位】jdzjk06
-----------------------------------------------------------------------

一方面,深入单片机内部,熟悉微机原理,了解c语言的编译和汇编程序。这样非常有助于写出很高效的代码,以及解决一些c语言容易出现的“““莫名其妙”””的问题。
二方面,系统学习算法。
三方面,读读操作系统源码或者其他高质量的代码
  
楼主,我需要个程序帮我编编的

是基于PT100热电阻的51单片机温度检测报警系统的

出0入0汤圆

发表于 2011-11-4 22:21:53 | 显示全部楼层
我经常遇到这样的问题
知道流程怎么去走
但是用C语言写不出来算法

出0入0汤圆

发表于 2011-11-5 22:30:17 | 显示全部楼层
学习了,谢谢了

出0入0汤圆

发表于 2011-12-29 13:59:16 | 显示全部楼层
想学习,但不知道从哪里入手呀

出90入0汤圆

发表于 2012-2-22 22:08:51 | 显示全部楼层
标记一下~

出0入0汤圆

发表于 2012-2-23 17:37:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-23 19:43:05 | 显示全部楼层
我是一般二本学校大二学生,学51时间半年,看到你们的留言,感触很深,也看到差距之大。毕业后不想考研希望各位指导学什么就业比较好。求教?

出0入0汤圆

发表于 2012-2-23 20:24:00 | 显示全部楼层
单片机的内核和C语言的基础对于初学者来说比较关键的。有条件的话自己去电子市场购买一些小型元器件和单面板自己搭电路开发一些小型设备。要理论和和实践结合进步才快。

出0入0汤圆

发表于 2012-2-24 14:45:59 | 显示全部楼层
了解,学习

出0入0汤圆

发表于 2012-2-24 15:02:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-25 15:39:06 | 显示全部楼层
我学单片机学的也是

感觉一头雾水的啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 23:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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