OpenEdv-开源电子网

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

原子串口实验中的printf()问题

[复制链接]

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-3-6
在线时间
0 小时
发表于 2013-4-19 12:31:48 | 显示全部楼层 |阅读模式

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
int main(void)
{    
 u8 t;
 u8 len;  
 u16 times=0;
 delay_init();                                    //延时函数初始化     
 NVIC_Configuration();                              //设置NVIC 中断分组2  
 uart_init(9600);                                 //串口初始化波特率为 9600
 LED_Init();                                  //LED 端口初始化
 KEY_Init();                                      //初始化与按键连接的硬件接口
 
 
 printf("请输入数据,以回车键结束\n");
 printf("\r\n 战舰 STM32 开发板 串口实验\r\n\r\n");

 while(1)
 {

  if(USART_RX_STA&0x8000)
  {   
   len=USART_RX_STA&0x3f;             //得到此次接收到的数据长度
   printf("\r\n您发送的消息为:\r\n\r\n");
   for(t=0;t<len;t++)
   {  
    USART_SendData(USART1, USART_RX_BUF[t]);   //向串口 1发送数据
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
    //等待发送结束
   }
   printf("\r\n\r\n"); //插入换行
   USART_RX_STA=0;
  }
  else
  {    
   times++;
   /*
   if(times%5000==0)
   {   
    printf("\r\n 战舰 STM32 开发板 串口实验\r\n\r\n");
    printf("正点原子@ALIENTEK\r\n\r\n");
    
   }
   if(times%200==0)
    printf("请输入数据,以回车键结束\n"); 
   */  
   if(times%30==0)
    LED0=!LED0;          //闪烁 LED,提示系统正在运行.
   delay_ms(10);    
  }
 }    
}


我把 printf("请输入数据,以回车键结束\n");   printf("\r\n 战舰 STM32 开发板 串口实验\r\n\r\n"); 语句放到while(1){} 循环体上面,为什么 串口调试助手上显示不了

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

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-3-6
在线时间
0 小时
 楼主| 发表于 2013-4-19 13:45:51 | 显示全部楼层
帖不要沉掉啊,好心人 ,帮忙讲一下
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-19 15:09:56 | 显示全部楼层
回复【楼主位】sheep:
---------------------------------
按一次复位,才发送一次
你按下复位看看.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-3-6
在线时间
0 小时
 楼主| 发表于 2013-4-19 15:17:27 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
是的 复位了  发送了  不明白缘由??
回复 支持 反对

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-3-6
在线时间
0 小时
 楼主| 发表于 2013-4-19 15:56:55 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥能讲下缘由,,或是提示下看那部分资料能搞懂???
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-19 16:28:39 | 显示全部楼层
回复【5楼】sheep:
---------------------------------
看错,你是说放到while里面,就不执行
是不是你没等这么久啊
你的times要加到200和500才输出一次
这个,你如果单纯想测试,直接把其他的都砍掉,只留下printf,你看看还输出不了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-3-6
在线时间
0 小时
 楼主| 发表于 2013-4-19 18:49:43 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
不是的  我是想问问把printf(“字符串”);放到while(1){}循环体外面,为什么要每按下一次复位键,才会执行一次 。  下载进去了不就该执行一次吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-19 22:32:30 | 显示全部楼层
因为main函数的执行顺序就是这样的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2013-4-5
在线时间
0 小时
发表于 2013-4-19 23:00:43 | 显示全部楼层
原子哥,这个串口调试助手是不是就不需要芯片了,只要用数据线就可以了?那这与max232有什么区别?我今天弄了一个430的东西,就是用的max232。有点犯晕。求助!!!
回复 支持 反对

使用道具 举报

11

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2013-4-5
在线时间
0 小时
发表于 2013-4-19 23:02:22 | 显示全部楼层
还有,为什么printf函数这样就能输出汉字了?你给的头文件中关于printf函数的东西不明白。。。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-19 23:19:37 | 显示全部楼层
回复【9楼】hiayan19910702:
---------------------------------
串口条数助手是个纯软件.不需要IC,但是需要你的电脑有串口,电脑有串口又分为电脑本身带的RS232串口,或者外接USB转串口.这些都是需要芯片的.
我们的开发板是板载了USB转串口芯片,所以通过USB线连接开发板和电脑就可以了.

回复【10楼】hiayan19910702:
---------------------------------
stm32的printf,都是通过调用底层的fputc实现的,该函数在usart.c里面实现.
中文,在电脑上表示就是2个字节的GBK码,你在单片机发送对应汉字的gbk码到电脑,电脑就将其转换为汉字了.

你要学的东西有很多,慢慢来吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-3-6
在线时间
0 小时
 楼主| 发表于 2013-4-20 10:05:40 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
我把原先程序改成printf()语句放到while(){}外边,while(){}里面的printf()都删掉

运行结果:串口助手不能显示printf()语句的内容,输入数据能显示发送内容。  按你的意思按了复位键,会打印printf()内容。

疑惑:不应该程序下载进去,一开始就应该要先打印printf()语句的内容吗。为什么要按下复位键,才能显示?难道每次程序下载进去都要按下复位键才能运行,前几个实验怎么没有要,下载进去了不按复位键就运行正确呢

#include "..." 
int main(void) 
{     
 xxxx_init(); 
  
 printf("字符串"); 
 
 while(1) 
 { 
      ....;
 }     
}

main()函数里执行顺序 ,不是应该先执行printf("字符串");打印字符串,然后再进入while(1) {}等待中断触发响应。
回复 支持 反对

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-3-6
在线时间
0 小时
 楼主| 发表于 2013-4-20 10:36:22 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
我知道原因了。是不是由于下载和通信都是用的同一个串口usart1,所以下载程序时不能同时打开串口助手。

下载好程序后再打开助手就看不到while(1){}外的打印语句了,按下复位键就能看到了。

次奥,感觉有点庸人自扰了。
回复 支持 反对

使用道具 举报

11

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2013-4-5
在线时间
0 小时
发表于 2013-4-21 19:04:10 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
谢谢原子哥,正在学习中,新手。。。。以后还要靠原子哥多多帮小弟。
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-2-19
在线时间
0 小时
发表于 2014-2-20 00:59:29 | 显示全部楼层


11
回复 支持 反对

使用道具 举报

5

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-9-3
在线时间
2 小时
发表于 2015-3-31 22:59:02 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,我正在做一样东西,需要用到AD与串口显示,可以我用你的代码,printf是不能输出值的。 adcx=Get_Adc_Average(ADC_Channel_1,20);
LCD_ShowxNum(156,130,adcx,4,16,0); //显示模拟的值

temp=(float)adcx*3.3/4096;
adcx=temp;
LCD_ShowxNum(156,150,adcx,1,16,0);//显示ADC转换的电压值
temp-=adcx;                      //减去整数部分
temp*=1000;

printf("temp=\r\n",temp);                     //小数部分扩大1000倍

LCD_ShowxNum(172,150,temp,3,16,0X80);
LED0=!LED0;
delay_ms(250);
如上的代码,串口一直只是显示temp=       而等于号的右边什么都没有,这是怎么回事啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-1 00:03:07 | 显示全部楼层
回复【16楼】冬迹:
---------------------------------
学习下printf 的使用。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-3-25
在线时间
0 小时
发表于 2015-5-27 10:49:58 | 显示全部楼层
 原子哥好,我想问一下,printf("\r\n你所发的消息为:\r\n\r\n");中\r\n的使用,串口调试时:“你所发的消息为:”和"www.openedv.com" (发送内容)之间应该有空一行的呀,怎么调试结果没有

回复 支持 反对

使用道具 举报

19

主题

107

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2015-3-5
在线时间
44 小时
发表于 2015-5-27 18:56:02 | 显示全部楼层
/data/attachment/forum/2015/5/27/947252e666ffb22f7df5e53ad61687d9_412.png


中间的for循环里,有一行被注释了,写着向串口1发送数据
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-27 22:57:14 | 显示全部楼层
回复【18楼】duoyidu:
---------------------------------
在第一个printf后,加delay_ms(10)即可解决。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-10-10
在线时间
2 小时
发表于 2015-10-12 21:00:12 | 显示全部楼层
回复【18楼】duoyidu:
---------------------------------
你好,我刚开始学。和你截图的界面一样,printf还有几行都是前面有带有感叹号的黄色三角,编译下载程序都没有错误。 三角是啥原因呢?
想学习,想进步
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-10-10
在线时间
2 小时
发表于 2015-10-12 21:01:35 | 显示全部楼层
回复【20楼】正点原子:
---------------------------------
原子哥,我的界面和17楼截图的一样,printf还有几行,_sys_exit(int x) 都是前面有带有感叹号的黄色三角,编译下载程序都没有错误。 三角是啥原因呢?
想学习,想进步
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-10-12 22:24:05 | 显示全部楼层
回复【22楼】hongzhen91:
---------------------------------
鼠标停留在三角上面,会提示你具体警告内容
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-8
在线时间
14 小时
发表于 2015-12-18 15:53:19 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
我的就是只在while()里面放一句printf()也无法打印呢。另外,程序完整的用的MINI的程序,但是板子用的是自己的,根据自己的板子修改了管脚,LED等倒是一直闪烁,但串口调试助手(XCOM)上面一直都没显示文字,想请教一下是为什么?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 05:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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