OpenEdv-开源电子网

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

Printf只能打印一次

[复制链接]

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-6-3
在线时间
0 小时
发表于 2013-12-10 11:48:56 | 显示全部楼层 |阅读模式
大师。我现在遇到个很蛋疼的问题,
我的Print函数重定向到了串口1,成功了的,但是我打印了int类型的数据,
printf("0x%x\n\n",crc_chk(senddata,6));crc_chk(senddata,6)的返回是个int的类型,下载后打印不出来,
我修改为  printf("1234\n"); 。悲剧来了,只能打印从来1,不知道该怎么把这个修复,
我试过重新烧录程序,重新上电开发板,
还是不行,有没有办法啊,
我用USART_SendData(USART1 ,(uchar )(crc_chk(senddata,6)>>8));
这是能发送从来的,结果也对
dd
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-6-3
在线时间
0 小时
 楼主| 发表于 2013-12-10 11:52:54 | 显示全部楼层
while(1)
{ printf("1234\n"); 
delays(2);
USART_SendData(USART1 ,(uchar )(crc_chk(senddata,6)>>8));
// printf("0x%x\n\n",crc_chk(senddata,6)); 
// delays(4);
}
程序该为这样,也不能发送了,终端上就显示个1;
dd
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-10 12:48:55 | 显示全部楼层
回复【2楼】冷面狼:
---------------------------------
你串口助手上用十六进制显示看下是个什么数据出来
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-6-3
在线时间
0 小时
 楼主| 发表于 2013-12-10 13:43:57 | 显示全部楼层
就是个1。其他都发不从来
dd
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-12-7
在线时间
0 小时
发表于 2013-12-10 14:26:08 | 显示全部楼层
使用printf必须重定义putchar函数,想来你是应该知道这个问题的。但是printf一般不使用中断发送数据,如果打开了发送中断就会出现竞争现象,这个要注意的。还有串口状态寄存器里有一个发送完毕的标志,可以用这个标志取代延时等待。
回复 支持 反对

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-6-3
在线时间
0 小时
 楼主| 发表于 2013-12-10 14:35:27 | 显示全部楼层


重新定义了的啊


int fputc   (int ch,FILE *f)
 {
//??ch????USART
USART_SendData (USART1 ,(unsigned char )ch);

//????·????ê±?
while(USART_GetFlagStatus (USART1 ,USART_FLAG_TC )==RESET  );       在这里查询了发送是否完成
 
//·???ch
return(ch);
 }
 
我的中断的确是打开了。
void  USART1_IRQHandler(void)
{    
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)// 
{     
/* Clear the USART1 Receive interrupt */  
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //??????????
// USART_SendData(USART1 ,USART_ReceiveData(USART1 ));//??????????????·???????
}  
if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)  //????·????ê????????????
{  //KailiaoCheGuaJie;
USART_ClearITPendingBit (USART1,USART_IT_TC);   //????·????ê??????±ê??

但是以前都可以,我加了
printf("0x%X\n\n", crc_chk(senddata,6) );   我是想16进制输出,结果,就出问题了,我发现了,把程序改过来了,就只能打印一个直接了,
我换了个串口工具,还是一样的,我觉得是单片机里面出了问题了。但是不知道怎么 解决








dd
回复 支持 反对

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-6-3
在线时间
0 小时
 楼主| 发表于 2013-12-10 14:39:52 | 显示全部楼层
回复【5楼】zentoku:
使用printf必须重定义putchar函数,想来你是应该知道这个问题的。但是printf一般不使用中断发送数据,如果打开了发送中断就会出现竞争现象,这个要注意的。还有串口状态寄存器里有一个发送完毕的标志,可以用这个标志取代延时等待。
---------------------------------
你这个提醒了我,我关掉串口1的发送中断,就可以了,但是我不知道,为什么我以前没有关掉也同样可以,这是我纳闷的地方。谢谢你
dd
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 16:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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