GPS模块调试 __packed是字节对齐的意思。 1、__packed是字节对齐的意思。 比如说int float double char它的总大小是4 + 4 + 8 + 1 = 17 但如果不用__packed的话,系统将以默认的方式对齐(假设是4字节),那么它占4 + 4 + 8 + 4 = 20;(不足4字节以4字节补齐)。 用align修饰数组后,可以去掉packed关键字了. 对齐的使用: 1.__align(num) 这个用于修改最高级别对象的字节边界。在汇编中使用LDRD或者STRD时 就要用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。 这个修饰对象的命令最大是8个字节限制,可以让2字节的对象进行4字节 对齐,但是不能让4字节的对象2字节对齐。 __align是存储类修改,他只修饰最高级类型对象不能用于结构或者函数对象。 2.__packed __packed是进行一字节对齐 1.不能对packed的对象进行对齐 2.所有对象的读写访问都进行非对齐访问 3.float及包含float的结构联合及未用__packed的对象将不能字节对齐 4.__packed对局部整形变量无影响 5.强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定 义为packed。 __packed int* p; //__packed int 则没有意义 '\0'不是指ASCII码值,它是字符,它的ASCII码值是0,也就是ASCII码表的第一个字符。 sprintf((char *)dtbuf,"Validsatellite:%02d",gpsx.posslnum); //用于定位的卫星数 使用sprintf函数直接可以将各个数据和这个字母连接在一起 Dtbuf 设置的缓存目录 后面是要显示连在一起的东西 l 复制地址的时候 u8 *p =buf ; //这样赋值就正常 , *p ; p = buf;却不可以 这要引起足够的重视
难点程序//GPS校验和计算 //buf:数据缓存区首地址 //len:数据长度 //cka,ckb:两个校验结果. void Ublox_CheckSum(u8 *buf,u16 len,u8*cka,u8*ckb) { u16i; *cka=0;*ckb=0; for(i=0;i<len;i++) { *cka=*cka+buf; //一个使用buf相加 *ckb=*ckb+*cka;//统计所有的cka的值 } } //str转换为数字,以','或者'*'结束 //buf:数字存储区 //dx:小数点位数,返回给调用函数 //返回值:转换后的数值 int NMEA_Str2num(u8 *buf,u8*dx) { u8*p=buf; u32ires=0,fres=0; u8ilen=0,flen=0,i; u8mask=0; intres; while(1)//得到整数和小数的长度 { if(*p=='-'){mask|=0X02;p++;}//是负数 //这里使用mask只是遍历一遍查找特殊的字符以供后续程序使用 if(*p==','||(*p=='*'))break;//遇到结束了 if(*p=='.'){mask|=0X01;p++;}//遇到小数点了 elseif(*p>'9'||(*p<'0')) //有非法字符 { ilen=0; flen=0; break; } if(mask&0X01)flen++;//小数个数计数 elseilen++;// 整数个数计数 p++; //P的目的是将数组先遍历一遍 } //前面是遍历函数 if(mask&0X02)buf++; //去掉负号 for(i=0;i<ilen;i++) //得到整数部分数据 { ires+=NMEA_Pow(10,ilen-1-i)*(buf-'0'); } if(flen>5)flen=5; //最多取5位小数 *dx=flen; //小数点位数 for(i=0;i<flen;i++) //得到小数部分数据 { fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0'); //分数就是在整数的后面的值,所以呀直接就是在ilen+1+i 就可以满足题意了 //这里的1是指小数点的字符数 } res=ires*NMEA_Pow(10,flen)+fres; //这个处理了之后还是得到的是整数 if(mask&0X02)res=-res; returnres; } //从buf里面得到第cx个逗号所在的位置 //返回值:0~0XFE,代表逗号所在位置的偏移. // 0XFF,代表不存在第cx个逗号 u8 NMEA_Comma_Pos(u8 *buf,u8 cx) { u8*p=buf; //这里两个必须要都是同样的u8*不然不能加减 while(cx) { if(*buf=='*'||*buf<''||*buf>'z')return 0XFF;//遇到'*'或者非法字符,则不存在第cx个逗号 if(*buf==',')cx--; buf++; } returnbuf-p; } Ø 下面这个程序可以实现字符串转数字的功能 if(*p == '-') {mask = 0x01;p++;} //mask的作用就是做一个标志 if(*p==','||(*p=='*'))break;//遇到结束了前面的只是做个标记而已 if(*p=='.'){mask|=0X02;p++;}//遇到小数点了 elseif(*p>'9'||(*p<'0')) //有非法字符 { fcnt= 0; icnt=0; break; } if(mask&0x02)fcnt ++; elseicnt++; p++;// 最后这个p才是实现移动位置的关键 l 当一个程序中有传递过来的数组时(实质是指针)先复制指针地址再做其他的事情。先要遍历一遍特殊字符,用mask来标记。 l 抢占优先级和响应优先级,其实是一个中断所包含的两个优先级,其中前者是对抢占优先级的级别划分,后者是相同抢占优先级的优先级别的划分。 比如: 中断A抢占优先级比B高,那么A的中断可以在B里面触发,忽略响应优先级; A和B抢占优先级相同,则A、B的响应优先级决定谁先响应。
程序学习: 1. 字符串转数字的方法。 2. 特定字符的检查,数据提取。 3. 多个逗号后面的数据提取。 4. 结构体数据的使用。
|