搜索
bottom↓
回复: 30

请教C51里for (u8Count = 0; u8Count < 256; u8Count ++)不能正常运行吗?

[复制链接]

出0入0汤圆

发表于 2022-5-8 12:40:32 | 显示全部楼层 |阅读模式
单片机型号是STC1K08,程序如下:
  1. #include "main.h"

  2. extern bit Time500MsFlag;

  3. xdata volatile uint8_t u8Buffer_Write[256] = {0};

  4. int main(void) {
  5.         volatile uint8_t u8Count;

  6.         /** 初始化系统,包括MCU和外部设备资源 */
  7.         Init_System();

  8.         // printf("System Initial OK!\r\n");

  9.         for (u8Count = 0; u8Count < 256; u8Count ++) {
  10.                 u8Buffer_Write[u8Count] = u8Count;
  11.         }

  12.         Uart_Send_Data(UART1, u8Buffer_Write, 256);

  13.         /** 系统循环 */
  14.         while (1) {
  15.                 if (Time500MsFlag == 1) {
  16.                         Time500MsFlag = 0;
  17.                         Set_LED(LED0, TOGGLE);
  18.                 }

  19.         }
  20. }
复制代码


烧入单片机后死在for (u8Count = 0; u8Count < 256; u8Count ++)这一句,把<256改成255可以运行,改成<=255也运行不了。我不明白这个程序有什么问题,求来个大神指点一下。

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

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981

出0入4汤圆

发表于 2022-5-8 12:56:13 | 显示全部楼层
u8Count 最大是255,你在for循环中,u8Count加到255后变0
这个for循环一直跳不出来,肯定是死在这里了。。。。

你将u8Count 定义成int试下

出0入4汤圆

发表于 2022-5-8 12:56:55 | 显示全部楼层
楼主自己不是已经发现问题了吗?
u8的变量,从0~255,那么你Count < 256,这个条件会一直被满足,自然就无法退出循环,死在这里了。

出0入17汤圆

发表于 2022-5-8 12:57:03 来自手机 | 显示全部楼层
8位无符号数最大就是255,<256肯定死循环呀

出0入0汤圆

 楼主| 发表于 2022-5-8 13:01:29 | 显示全部楼层
看了下,应该是u8Count最大值是255,再加1成256时溢出变成0,所以一直循环下去。但是为什么改成for (u8Count = 0; u8Count <= 255; u8Count ++) 也是死在循环里出不来呢?

出0入0汤圆

 楼主| 发表于 2022-5-8 13:03:32 | 显示全部楼层
u8Count改成int是正常的,但是for (u8Count = 0; u8Count <= 255; u8Count ++) 也是死在循环里,这里是先取值比较,再执行执行++吧?

出590入1001汤圆

发表于 2022-5-8 13:09:52 | 显示全部楼层
mangolu 发表于 2022-5-8 13:01
看了下,应该是u8Count最大值是255,再加1成256时溢出变成0,所以一直循环下去。但是为什么改成for (u8Coun ...
(引用自5楼)

u8型的,0-255小于256和小于等于255有区别吗

出0入0汤圆

 楼主| 发表于 2022-5-8 13:16:28 | 显示全部楼层
SUPER_CRJ 发表于 2022-5-8 13:09
u8型的,0-255小于256和小于等于255有区别吗
(引用自7楼)

小于256可以理解,因为值永远不会等于256或大于,但是<=255理解不了,因为值能等于255啊。

出0入0汤圆

 楼主| 发表于 2022-5-8 13:18:57 | 显示全部楼层
SUPER_CRJ 发表于 2022-5-8 13:09
u8型的,0-255小于256和小于等于255有区别吗
(引用自7楼)

哦,哈哈,想到了!之前一直在这个误区。

出0入0汤圆

 楼主| 发表于 2022-5-8 13:25:22 | 显示全部楼层
这个再请教个问题,为什么STC关电的时候,串口会收到一个0x00:



这个是STC本身串口通讯协议发出的吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入1119汤圆

发表于 2022-5-8 13:40:14 | 显示全部楼层
本帖最后由 Himem 于 2022-5-8 13:42 编辑
mangolu 发表于 2022-5-8 13:25
这个再请教个问题,为什么STC关电的时候,串口会收到一个0x00:


(引用自10楼)


下电的低电平 按串口解析是这样的
ch340忽略了停止位?其他型号usb串口可能不会收到00

出0入0汤圆

 楼主| 发表于 2022-5-8 13:47:36 | 显示全部楼层
Himem 发表于 2022-5-8 13:40
下电的低电平 按串口解析是这样的
ch340忽略了停止位?其他型号usb串口可能不会收到00 ...
(引用自11楼)

手上STM32的板子印象里没有这样啊,其他的板子印象里也没有这样的。

出5入16汤圆

发表于 2022-5-8 15:33:07 来自手机 | 显示全部楼层
有些编译器会警告的。

出0入0汤圆

发表于 2022-5-10 08:39:17 | 显示全部楼层
楼主是做调试时用到串口发送数据来显示吗?

出0入30汤圆

发表于 2022-5-10 11:45:27 | 显示全部楼层
本帖最后由 ycheng2004 于 2022-5-10 12:59 编辑

这样试一下,
for (u8Count = 0;u8Count <= 255; )
        {
                u8Buffer_Write[u8Count] = u8Count;
                u8Count ++;
        }

出0入90汤圆

发表于 2022-5-10 12:03:02 | 显示全部楼层
真幸福,从好多年前开始,遇到的软件问题都只能自己研究解决了。

出0入0汤圆

 楼主| 发表于 2022-5-10 16:01:34 | 显示全部楼层
maxking 发表于 2022-5-10 08:39
楼主是做调试时用到串口发送数据来显示吗?
(引用自14楼)

其实是想把内部EEPROM数据显示出来,结构搞成死循环:)这段时间一直用STM32,都是unit32_t型,所以一进来就晕了

出0入0汤圆

 楼主| 发表于 2022-5-10 16:04:35 | 显示全部楼层
ycheng2004 发表于 2022-5-10 11:45
这样试一下,
for (u8Count = 0;u8Count
(引用自15楼)

这样子是不行的,看我上面有说到了。因为u8最大值是255,这个一直成立的,一加到256,就溢出成0了。

出0入224汤圆

发表于 2022-5-10 16:05:39 | 显示全部楼层
ycheng2004 发表于 2022-5-10 11:45
这样试一下,
for (u8Count = 0;u8Count
(引用自15楼)

这不是一样出不来吗

出0入30汤圆

发表于 2022-5-10 16:42:52 | 显示全部楼层
有什么方法,u8Count for循环可以计数256次/0xFF次,
不要定义u16,

出0入224汤圆

发表于 2022-5-10 16:58:55 | 显示全部楼层
ycheng2004 发表于 2022-5-10 16:42
有什么方法,u8Count for循环可以计数256次/0xFF次,
不要定义u16,
(引用自20楼)

for(u8Count=0;u8Count<=255;u8Count++)
{
   //做你的事
  if( u8Count == 255 )
  {
     break ;
  }
}

出0入30汤圆

发表于 2022-5-10 17:38:40 | 显示全部楼层
yyts 发表于 2022-5-10 16:58
for(u8Count=0;u8Count
(引用自21楼)

多谢,

出0入0汤圆

 楼主| 发表于 2022-5-10 17:50:52 | 显示全部楼层
ycheng2004 发表于 2022-5-10 16:42
有什么方法,u8Count for循环可以计数256次/0xFF次,
不要定义u16,
(引用自20楼)
  1. uint8_t u8Count = 255;

  2. do {
  3.         /* code */
  4. } while (-- u8Count);
复制代码


这样 应该是可以的吧?

出0入0汤圆

发表于 2022-5-10 17:51:40 | 显示全部楼层
我之前玩这个片子,int最大是ffff,搞得我bug找了好长时间

出0入217汤圆

发表于 2022-5-10 23:14:21 | 显示全部楼层
uint8_t u8Count = 255;

do {
        /* code */
} while (u8Count--);
这样可以

出0入30汤圆

发表于 2022-5-10 23:30:05 | 显示全部楼层
ehengio 发表于 2022-5-10 23:14
uint8_t u8Count = 255;

do {
(引用自25楼)

少一次吧?为0不执行,

出0入0汤圆

 楼主| 发表于 2022-5-11 00:50:38 | 显示全部楼层
ycheng2004 发表于 2022-5-10 23:30
少一次吧?为0不执行,
(引用自26楼)

先执行一次DO,再while判断的

出0入30汤圆

发表于 2022-5-11 08:46:33 | 显示全部楼层
mangolu 发表于 2022-5-11 00:50
先执行一次DO,再while判断的
(引用自27楼)


uint8_t u8Count =1;
初试设置为1,那会执行几次/* code */ ?
u8Count =0; 是不是就不执行/* code */ ?不是就少一次了,

出0入0汤圆

 楼主| 发表于 2022-5-11 20:14:33 | 显示全部楼层
ycheng2004 发表于 2022-5-11 08:46
uint8_t u8Count =1;
初试设置为1,那会执行几次/* code */ ?
u8Count =0; 是不是就不执行/* code */ ?不 ...
(引用自28楼)

随便写个代码验证:

-- u8Count:



u8Count --:



所以:

  1.         uint8_t u8Count = 255;

  2.         do {
  3.                 Uart_Send_Data(UART1, &u8Count, 1);
  4.         } while (u8Count --);
复制代码


是可以执行256次的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入30汤圆

发表于 2022-5-11 22:21:44 | 显示全部楼层
mangolu 发表于 2022-5-11 20:14
随便写个代码验证:

-- u8Count:
(引用自29楼)

试了一下,u8Count 后减--确定可以,谢谢,

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-9-1 07:31

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

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