OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8250|回复: 23

我用串口1循环发送字节,只能发送257个字节,超过257个字节,程序就卡死了

[复制链接]

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
发表于 2014-2-24 09:34:48 | 显示全部楼层 |阅读模式

//串口1发送字节
//dat:待发送的字节
void UART1_SendByte(u8 dat)
{  
 USART1->DR=dat;
 while((USART1->SR&0X40)==0);   //等待发送结束   
}

//串口1发送数据函数
//ucaBuffer:待发送数组首地址
//unNumber:待发送数组的长度
void UART1_SendData(u8 *ucaBuffer,u16 ucNumber)
{
 u16 ucCount=0;
 unsigned int checksum;
    checksum = CRC16(ucaBuffer,ucNumber-2);    //CRC16校验计算最后两位的校验值  u16 CRC16(u8 *p, u16 datalen)函数原型没有问题
    *(ucaBuffer+(ucNumber-2)) = checksum;
    *(ucaBuffer+(ucNumber-1)) = checksum>>8;
 USART1_TXMode;     //置串口1连接的485处于发送模式
 USART1->SR&=~(1<<6);    //清除发送完成标志
 for(ucCount=0;ucCount<ucNumber;ucCount++)
  UART1_SendByte(*(ucaBuffer+ucCount));
 USART1_RXMode;     //置串口1连接的485处于接收模式  
}


我在程序当中测试UART1_SendData(u8 *ucaBuffer,u16 ucNumber)函数
如下:
/**********(1)测试可以*****************/    
u16 i;
 for(i=0;i<255;i++)
  *(p+i)=0XEE;
UART1_SendData(p_Buff,257);
/**********(2)测试不可以*****************/    
u16 i;
 for(i=0;i<256;i++)
  *(p+i)=0XEE;
UART1_SendData(p_Buff,258);

(1)测试发257个字节完全没问题,可是(2)发258个字节及以上我的整个程序就卡死了,这是为什么?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-24 09:42:45 | 显示全部楼层
回复【楼主位】zhp:
---------------------------------
看着没什么问题,你jtag跟踪一下看下死在什么地方
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-24 09:46:23 | 显示全部楼层
回复【楼主位】zhp:
---------------------------------
这个函数
void UART1_SendByte(u8 dat)
{  
 USART1->DR=dat;
 while((USART1->SR&0X40)==0);   //等待发送结束   
}
改为这样试下
void UART1_SendByte(u8 dat)

 while((USART1->SR&0X40)==0);   //等待发送结束 
 USART1->DR=dat;
    
}
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-2-24 09:54:56 | 显示全部楼层
回复【3楼】Badu_Space:
回复【楼主位】zhp: --------------------------------- 这个函数 void UART1_SendByte(u8 dat) {    USART1->DR=dat;  while((USART1->SR&0X40)==0);   //等待发送结束    } 改为这样试下 void UART1_SendByte(u8 dat) {   while((USART1->SR&0X40)==0);   //等待发送结束   USART1->DR=dat;      }
---------------------------------
呵呵,我测试了不行,改成那样,发送2个字节就卡了
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-2-24 11:14:13 | 显示全部楼层
我是用循环发送的,发送257个字节及以下就没有问题,发送258个字节及以上就卡死了,为什么会这样?
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-24 11:22:09 | 显示全部楼层
回复【5楼】zhp:
---------------------------------
这就不是很清楚了,你jtag时在哪里死机啦?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-2-24 11:36:40 | 显示全部楼层
回复【6楼】Badu_Space:
回复【5楼】zhp: --------------------------------- 这就不是很清楚了,你jtag时在哪里死机啦?
---------------------------------
现在测试的板子上面没有留出Jlink接口,目前的程序都是我一部分一部分测试通过后加到工程文件里的,整个工程文件只是改动257为258就卡死了很是郁闷啊
回复 支持 反对

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2014-2-24 13:17:36 | 显示全部楼层
像这种255左右卡死的一般是 u8爆了
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-2-24 13:41:23 | 显示全部楼层
回复【8楼】simms01:
像这种255左右卡死的一般是 u8爆了
---------------------------------
能说清楚些吗?我那个u8是个指针的,不是发送数组的大小范围,后面可以发送最大字节数也是u16型的,从函数上看,最大可以发生2^16=65536个字节啊
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-24 13:55:26 | 显示全部楼层
回复【9楼】zhp:
---------------------------------
最后一段
你前面用指针只给了*(p+i)256个数据,结果让他发257个,那么最后一个指针位置指到哪里了?程序就跑飞了
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-24 13:56:50 | 显示全部楼层
回复【9楼】zhp:
---------------------------------
另外
for(i=0;i<255;i++)
for(i=0;i<256;i++)
分别会运行多少次?
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-2-24 14:03:14 | 显示全部楼层
回复【10楼】ricefat:
回复【9楼】zhp: --------------------------------- 最后一段 你前面用指针只给了*(p+i)256个数据,结果让他发257个,那么最后一个指针位置指到哪里了?程序就跑飞了
---------------------------------
*(p+0)到*(p+256)一共是257个字节没错啊,呵呵,你可能没有仔细看我上面写的程序吧,我上面说的(1)段代码测试可以,(2)段代码测试卡死
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-2-24 14:04:32 | 显示全部楼层
回复【11楼】ricefat:
回复【9楼】zhp: --------------------------------- 另外 for(i=0;i<255;i++) for(i=0;i<256;i++) 分别会运行多少次?
---------------------------------
第一个for,0~254,运行255次啊,后面一个运行256次
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-2-24 14:07:54 | 显示全部楼层
/**********(1)测试可以*****************/    
u16 i;
 for(i=0;i<255;i++)
  *(p+i)=0XEE;
UART1_SendData(p_Buff,257);
//for循环赋255个值,然后UART1_SendData函数中加上两个字节的CRC16的校验位,一共257个字节,然后一起循环发送没有问题


/**********(2)测试不可以*****************/    
u16 i;
 for(i=0;i<256;i++)
  *(p+i)=0XEE;
UART1_SendData(p_Buff,258);
//for循环赋256个值,然后UART1_SendData函数中加上两个字节的CRC16的校验位,一共258个字节,然后一起循环发送就不行了
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-24 14:12:06 | 显示全部楼层
回复【13楼】zhp:
---------------------------------
我看错了 你后面还有两个字节的校验
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-2-24 14:15:16 | 显示全部楼层
回复【15楼】ricefat:
回复【13楼】zhp: --------------------------------- 我看错了 你后面还有两个字节的校验
---------------------------------
之前我也想会不会跟数据类型u8还是u16有关,后来仔细检查了,发现不是,还是没有找到问题所在。。。还是谢谢你
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-24 14:19:16 | 显示全部楼层
回复【16楼】zhp:
---------------------------------
下个断点看看,发送到最后几个字节的时候出了什么问题
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-2-24 14:22:55 | 显示全部楼层
回复【17楼】ricefat:
回复【16楼】zhp: --------------------------------- 下个断点看看,发送到最后几个字节的时候出了什么问题
---------------------------------
呵呵……现在测试板上没有JTAG,不知道怎么调试了都
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-24 14:40:18 | 显示全部楼层
回复【18楼】zhp:
---------------------------------
找个J LINK,用SWD接出来试试看
回复 支持 反对

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2014-2-24 16:14:00 | 显示全部楼层
void UART1_SendData(u8 *ucaBuffer,u16 ucNumber)
{
 //u16 ucCount=0; 
 //unsigned int checksum;
  //  checksum = CRC16(ucaBuffer,ucNumber-2);    //CRC16校验计算最后两位的校验值  u16 CRC16(u8 *p, u16 datalen)函数原型没有问题
  //  *(ucaBuffer+(ucNumber-2)) = checksum;
   // *(ucaBuffer+(ucNumber-1)) = checksum>>8; 
 USART1_TXMode;     //置串口1连接的485处于发送模式
 USART1->SR&=~(1<<6);    //清除发送完成标志
 for(ucCount=0;ucCount<ucNumber;ucCount++)
  UART1_SendByte(*(ucaBuffer+ucCount));
 USART1_RXMode;     //置串口1连接的485处于接收模式   
}

先把不相关的去掉看死不死 

回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-2-24 17:00:19 | 显示全部楼层
回复【20楼】simms01:
---------------------------------
谢谢你的回答,按你说的,我把其它的屏蔽掉,现在可以发送很多字节,我测试过发送1000个字节都没问题,是不是我的CRC16校验算法有问题,还是其它的什么问题?
下面是我的CRC16校验算法。
//CRC16循环冗余校验
u16 CRC16(u8 *p, u16 datalen)
{
    u8 CRC16Lo,CRC16Hi,CL,CH,SaveHi,SaveLo;
    u8 i,Flag;
    CRC16Lo = 0xFF;     CRC16Hi = 0xFF;
    CL = 0x01;          CH = 0xA0;
    for(i=0;i<datalen;i++)
    {
        CRC16Lo ^=*(p+i);
        for(Flag=0;Flag<8;Flag++)
        {
            SaveHi = CRC16Hi;  SaveLo = CRC16Lo;
            CRC16Hi >>= 1 ;CRC16Lo >>= 1 ;
            if ((SaveHi & 0x01) == 0x01)
            CRC16Lo  |=0x80 ;
            if ((SaveLo & 0x01) == 0x01)
            { CRC16Hi  ^= CH;  CRC16Lo  ^= CL; }
        }
    }
    return (CRC16Hi<<8)|CRC16Lo;
}
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-2-24 17:17:02 | 显示全部楼层
回复【20楼】simms01:
---------------------------------
非常感谢!!!!
找到问题了,就是CRC16校验函数的问题,我把变量i定义成了u8型的,太马虎了,改成u16型的就好了
再次感谢!!!!
回复 支持 反对

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2014-2-24 17:17:02 | 显示全部楼层
回复【21楼】zhp:
---------------------------------
还不是 u8爆了

 u8 i,Flag;      ==》》 for(i=0;i<datalen;i++)   

datelen  ==>>u16 datalen
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-2-24 17:27:07 | 显示全部楼层
回复【23楼】simms01:
---------------------------------
是的!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 05:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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