7850|20

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

晕菜!新手碰到怪问题!普通的循环语句都来刁难我! [复制链接]

Keil编译环境,main中除了初始化的语句就只有一个循环
unsigned char i;
for(i=0;i<10;i++)
{
   Serial_One_SendData(i);
}
  按理说应该循环10次,用十六进制显示的话依次输出01 02 03 。。09.但事实上只循环了两次或者三次的样子 ,输出的字节也是乱七八糟。如果将10改为128,可不得了了,竟然成死循环了!跳不出来了!如果将unsigned char 改为int 型,只执行一次就跳出来了。要多奇怪有多奇怪!Serial_One_SendData()函数是经过验证的串口发送函数,在写这个循环前用起没问题。

最新回复

main里边有死循环等待吗?   详情 回复 发表于 2009-5-25 02:15
点赞 关注

回复
举报

6

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
你需要把这么大数组放到程序空间。按道理讲,编译器应该对你抱怨过了。

使用 const code 修饰一下你定义的变量应该可以解决。

 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
1.感觉很有可能是堆栈出问题了,调试的时候检查下堆栈,一般崩溃了是能在堆栈观察串口看到一大排堆栈调用
2.另外看下RAM区是不是有数组越界了
3.如果i是全局变量,仔细检查下是不是用其他地方用到了i,循环变量不要设成全局的
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
不好说, 就这么几句语句。

当然可能是还是内存使用的问题:
1. 堆栈溢出;
2. 数组越界;
3. 如指针错误;
4. ...
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
串口波特率问题?
串口线问题?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
绝对不会是这个循环的问题,其它代码引起的
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
请把所有代码都贴出来,相信大家可以帮你解决!
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 
今天上午我把所有的不相关函数和常变量申明全屏蔽后,只留了main和Serial_One_SendData两个,就没问题了可以正常循环然后把字符送出来。然后添加了显示屏初始化和清屏两个函数,也没问题。于是我把头文件里定义的一个二维数组放开,又出问题了,不能清屏了。这个数组大概是93*16字节的样子,即所有可显字符(从!到~)的字模(16*8点阵)。所以我怀疑先前循环不对头可能就是有这个数组。运行时这个数组是放在哪里的?是不是和哪里地址冲突了?但是这个数组必须要。我不知道出问题的原因和解决的方法。代码我晚上贴上来吧,中午没时间。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
补充一下,我用的STC12C5A60S2,程序空间60K,RAM1280字节,是不是和这些有关
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 7 楼 cctvcq 的回复:
今天上午我把所有的不相关函数和常变量申明全屏蔽后,只留了main和Serial_One_SendData两个,就没问题了可以正常循环然后把字符送出来。然后添加了显示屏初始化和清屏两个函数,也没问题。于是我把头文件里定义的一个二维数组放开,又出问题了,不能清屏了。这个数组大概是93*16字节的样子,即所有可显字符(从!到~)的字模(16*8点阵)。所以我怀疑先前循环不对头可能就是有这个数组。运行时这个数组是放在哪里的?是不是和哪里…


这个93*16的应该是CODE型的吧,检查下那2个函数是不是把i冲掉了
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

11
 
unsigned char i;
for(i=0;i <10;i++)
{
  Serial_One_SendData(‘A’);
}

先这样,看能出10个A吗?

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
我的循环语句都是用的int i,还是第一次看见使用char型的。是不是使用的单片机类型不一样?
 
 
 

回复

1

帖子

0

TA的资源

禁止访问

13
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
刚算了一下96*16=1488程序不出错才怪。
楼主定义成code或者xdata应该就好了。
另循环变量大小可以的话还是用uchar比较好,速度会快点。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
定义成code型的就OK了。分数有限不能一一答谢各位的热心帮助。区区5分表达不了解决问题的喜悦。多谢各位兄弟姐妹。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
先自己把整个程序检查一遍吧,
再不行还是把代码全贴出来的好。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 
从lz给的代码看没什么问题,就是缺了在尾部添加while(1);的习惯。你的问题应该是出在Serial_One_SendData()上或者是其他子程序篡改了i,指针有误,甚至是跑飞等等。建议把完整的代码贴出来,这样就可以帮你了~
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
应该是数组定义有问题,请把数组定义贴出来,如果数组值不需要变化,直接定义成 unsigned char code ar[],如果值要变化可定义成unsigned char  xdata ar[ ]   at  addr   ,明确给出你数组的位置addr, 不要定义在data 区     
-----------------------------------
[url=http://www.unionmcu.com.cn][/url]
---------------------------------
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
Stack 出了问题!
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

20
 
可以明确是我定义的数组的问题。因为我把这个数组只缩小到只有几个元素就没问题了。周一我试试大家说的unsigned char code 。实在很抱歉,程序没法拷贝出来,USB口被封了。数组是不变化的。
另:我就是这么申明的
unsigned char array[][16]=
{
{0x10,......0x00};
{0x00,......0x3f};
...
...
{ 0x00,......0xff},
};
共93*16字节。这种没指明的方法是怎么默认的?放在RAM里?
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表