




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用用 MSP430F149 单片机开发单片机开发 GSM 模块变压器报警系统学习笔记模块变压器报警系统学习笔记 2015 年年 1 月月 29 日日 18:15:20 目录: 1、GSM 模块总是发送信息到串口 2、按键中断无法退出的问题 3、Flash 写入问题 4、字符数组和字符串的拼接问题。 字符数组与字符串参考资料 1、GSM 模块总是发送信息到串口 发送的数据如下图: 问题的原因是 GSM 模块频繁的重启导致的,一部分原 因可能是电脑的 USB 接口电压不稳定,导致的 GSM 模块工 作欠压状态,故而频繁重启。这个需要在后期注意。 2、按键中断无法退出的问题 按键是普通中断,但是却出现了进入中断却无法退出 的问题。这个问题,出在了延时函数上,我选择的延时函 数是利用定时器的,这个函数可能在中断函数中影响了中 断标志,故而无法退出中断。 解决方法是使用普通的延时函数,不使用定时器就好 了。 3、Flash 写入问题 在对 Flash 写入时,使用的是别人写好的库函数,这 个库函数有个问题,问题就是每次写一位数据,就会相应 的将前面的数据都清除掉。 例如:在 F0x1000 位置写字符“a”,在 F0X1001 位置 写字符“b”,在 F0X1002 位置写“c”。得到的结果就是 “ c”。前面的数据都变成了 0X00,被清空了。我们看一 下程序: void Flash_WriteB(uchar *address,uchar data8) /FCTL1 = 0xA500+0x0002; /允许擦除 FCTL3 = 0xA500; /解锁 /*address = 0; /启动擦除 FCTL1 = 0xA500+0x0040; /允许写 *address = data8; /写入数据 FCTL1 = 0xA500; FCTL3 = 0xA500+0x0010; /锁定 原因是开启了擦除指令,擦除指令把原来的数据都给擦 除了。按理说,这个擦除指令应该只是擦除一个位置的数 据,但是,却对其他位置的数据都给擦除了。所以,修改 原函数,将原函数中的内容禁止擦除,这样,就解决了其 他问题数据再写入新数据时被擦掉了。 4、字符数组和字符串的拼接问题。 首先,怎样拼接一个字符串? 我使用的方法是 (先包含一下 string.h 头文件) 定义一个足够长度的字符串空间,uchar test111; Uchar *set=”SET”; Uchar *read=”READ”; strcpy(test1,set); strcat(test1,read); 第一条语句是把 set 字符串的内容复制到 test1 当中去, 然后,利用第二条指令,就是把第二个字符拼接到第一个 字符串中去,拼接时,自动去掉第一个字符串末尾的0, 并在重新拼接的字符串后面添加一个0。 当我把 set 部分换成是一个字符串数组时,即 uchar set11;时,使用同样的方法拼接字符串,得到的结果还是 相似,但是却无法使用字符串发送函数(即以0为末尾 识别的函数)。 因为字符数组的默认是不包含0的。我们定义一个 字符数组 uchar set3=s,e,t;,这种定义并 赋值方式,和 uchar set3;这种定义方式,实际的有效数 据就是 3,而字符数组的长度也是 3.这个字符数组的末尾, 没有0。故而导致发送函数出错。 我们应该如何定义字符数组呢?我们应该让字符数组 的最后一位多一个0,这样发送函数才会不至于出错。 我们可以这样定义: uchar set4=“; 我们多给字符数组了一位空间,这个空间,就是字符 数组用来存放“0“的。而我们在定义的时候,给字符数组赋 值成了一个空的字符串,这样,每一个字符串的末尾都必 定是“0“,所以,我们的字符数组 set3的数据就一定是 “0“,只要我们在后期处理函数中,不把这位数据给修改掉, 这样,我们得到的最新字符数组的末尾就有了“0“,可以用 于字符串的拼接和发送了。 当然,拼接的时候,还需要一次强制转换。如下: strcpy(char *)at_phone, (const char *)at_phone1); strcat(char *)at_phone,(const char *)PHONEBUFF2); strcat(char *)at_phone, (const char *)at_phone3); UART_PutStr(0,(char *)at_phone); 下面是字符数组与字符串参考资料: c c 语言字符数组与字符串的使用详解语言字符数组与字符串的使用详解 本篇文章是对 c 语言中字符数组与字符串的使用进行了详细的分析介绍,需要 的朋友参考下 1、字符数组的定义与初始化、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 char str10= I, ,a,m, ,h,a,p,p,y; 即把 10 个字符分别赋给 str0到 str910 个元素 如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组 长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 0 )。 2、字符数组与字符串、字符数组与字符串 在 c 语言中,将字符串作为字符数组来处理。(c+中不是) 在实际应用中人们关心的是有效字符串的长度而不是字符数组的长度, 例如, 定义一个字符数组长度为 100,而实际有效字符只有 40 个,为了测定字符串的 实际长度,C 语言规定了一个“字符串结束标志”,以字符0代表。 如果有一个 字符串,其中第 10 个字符为0,则此字符串的有效字符为 9 个。也就是说, 在遇到第一个字符0时,表示字符串结束,由它前面的字符组 成字符串。 系统对字符串常量也自动加一个0作为结束符。例如“C Program”共有 9 个字符, 但在内存中占 10 个字节,最后一个字节0是系统自动加上的。(通过 sizeof() 函数可验证) 有了结束标志0后,字符数组的长度就显得不那么重要了,在程序中往往依靠 检测0的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长 度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于 字符串实际长度。(在实际字符串定义中,常常并不指定数组长度,如 char str ) 说明说明:n代表 ASCII 码为 0 的字符,从 ASCII 码表中可以查到 ASCII 码为 0 的 字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它 来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别 的标志。 对 C 语言处理字符串的方法由以上的了解后,再对字符数组初始化的方法补充 一种方法即可以用字符串常量来初始化字符数组: char str =“I am happy“; 可以省略花括号,如下所示 char str =“I am happy“; 注意注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于 字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是 错误的 char str ; str=“I am happy“; 不是用单个字符作为初值,而是用一个字符串(注意:字符串的两端是用双引 号“”而不是单引号括起来的)作为初值。显然,这种方法更直观方便。(注意注意: 数组 str 的长度不是 10,而是 11,这点请务必记住,因为字符串常量“I am happy“的最后由系统自动加上一个0) 因此,上面的初始化与下面的初始化等价 char str =I, ,a,m, ,h,a,p,p,y,0; 而不与下面的等价 char str =I, ,a,m, ,h,a,p,p,y; 前者的长度是 11,后者的长度是 10. 说明:说明:字符数组并不要求它的最后一个字符为0,甚至可以不包含0,向下面 这样写是完全合法的。 char str5=C,h,i,n,a; + 可见,用两种不同方法初始化字符数组后得到的数组长度是不同的。 #include void main(void) char c1=I, ,a,m, ,h,a,p,p,y; char c2=“I am happy“; int i1=sizeof(c1); int i2=sizeof(c2); printf(“%dn“,i1); printf(“%dn“,i2); 结果:10 11 3、字符串的表示形式、字符串的表示形式 在 C 语言中,可以用两种方法表示和存放字符串: (1)用字符数组存放一个字符串 char str =“I love China“; (2)用字符指针指向一个字符串 char* str=“I love China“; 对于第二种表示方法,有人认为 str 是一个字符串变量,以为定义时把字符串常 量“I love China“直接赋给该字符串变量,这是不对的。 C 语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来 存放字符串常量,程序在定义字符串指针变量 str 时只是把字符串首地址(即存 放字符串的字符数组的首地址)赋给 str。 两种表示方式的字符串输出都用两种表示方式的字符串输出都用 printf(“%sn“,str); %s 表示输出一个字符串,给出字符指针变量名 str(对于第一种表示方法,字 符数组名即是字符数组的首地址,与第二种中的指针意义是一致的),则系统 先输出它 所指向的一个字符数据,然后自动使 str 自动加 1,使之指向下一个 字符.,如此,直到遇到字符串结束标识符 “ 0 “。 4、对使用字符指针变量和字符数组两种方法表示字符串的讨论、对使用字符指针变量和字符数组两种方法表示字符串的讨论 虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之 间是有区别的,不应混为一谈。 4.1、字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存 放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量 中(是字符串首地址) 4.2、赋值方式:赋值方式: 对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值 char str14; str=“I love China“; (但在字符数组初始化初始化时可以,即 char str14=“I love China“;) 而对字符指针变量,采用下面方法赋值: char* a; a=“I love China“; 或者是 char* a=“I love China“; 都可以 4.3、对字符指针变量赋初值(初始化初始化): char* a=“I love China“; 等价于: char* a; a=“I love China“; 而对于字符数组的初始化 char str14=“I love China“; 不能等价于: char str14; str=“I love China“; (这种不是初始化,而是赋值,而对数组这样赋值是不 对的) 4.4、如果定义了一个字符数组,那么它有确定的内存地址;而定义一个字符指 针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。 5、字符串处理函数、字符串处理函数 5.1 char *strcat(char *str1,const char *2 ); char *strcat(char *strDestination,const char *strSource ); 功能:函数将字符串 str2 连接到 str1 的末端,并返回指针 str1 注:连接前两个字符串的后面都有一个 0 ,连接时将字符串 1 后面的 0 去 掉,只在新串最后保留一个 0 5.2 char *strcpy(char *str1,const char *2 ); char *strcpy(char *strDestination,const char *strSource ); 功能:复
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司节假日安全培训课件
- 建筑施工防火安全技术措施
- 综合部主任竞聘报告
- 企业安全管理工作计划三篇
- 《记承天诗夜游》课件
- 静脉溶栓术后护理措施
- 事诸父如事父课件
- 研究生学习进展与心得汇报
- 公司级安全培训签到表课件
- 公司级安全培训意义课件
- 2025至2030年中国中试基地行业市场全景调查及发展趋向研判报告
- 承兑汇票转让协议书
- 大学生劳动就业法律问题解读(华东理工大学)智慧树知到见面课、章节测试、期末考试答案
- 二年级上册数学《观察物体》教学设计
- 心肾综合征诊疗实践指南解读
- 申请银行承兑汇票申请书
- 第15课 探寻新航路 课件(18张)
- 陆上油气长输管道建设项目主要安全设施、定量风险评价法、个人风险基准、安全预评价报告
- 餐饮5S管理培训课程
- 视神经炎的临床应用
- 债权转让承诺书样本文件范例(2024年版)
评论
0/150
提交评论