打印
[信息]

现在才知道打好基础是多么的重要啊!发贴纪念下!

[复制链接]
1441|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tianli1980|  楼主 | 2014-1-9 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这C语言学的太烂了,到现在才知道printf怎么用。


--------------------------------------------------------------------------------


                if(USART_RX_STA & 0X8000) //接接收完成
                {
                       
                        printf("USART_RX_STA = %#x\n",USART_RX_STA); //输出USART_RX_STA内容
                        len = USART_RX_STA &0x3fff;
                        USART_RX_STA = 0;                                                        //重置等待下次接收
                        printf("USART_RX_BUFF = %s\n",USART_RX_BUF);        //输出USART_RX_BUF内容
                        printf("接收到%*s\n",len,USART_RX_BUF);                        //指定长度输出USART_RX_BUF
                        printf("Len = %0*d\n",tmp,len);                                         //接收到的字符长度  tmp = 4;                       
                }



--------------------------------------------------------------------------------

刚开始学STM32,下午测试 战舰源码 system文件夹下提供的usart接收ISR,以及printf输出功能。
使用战舰提供的串口助手,虚拟串口和MDK软件调试

很简单的几句,本意是想将 USART_RX_STA的状态,接收的字符,缓冲区内容 再发出来
测试时发生了一些事:
1 我输入123456,没有按回车,没有任何回应,这是正确的,因为 串口接收ISR 将回车符作为结束符
2 再发送一次带上回车的123456,有了回应,没有问题。
再发送一次之后,问题出现了,
这句
printf("接收到%*s\n",len,USART_RX_BUF);                        //指定长度输出USART_RX_BUF
这句输出不是我想要的了,因为这时 BUFF中的内容是这样的 123456123456,而我的想法是指定输出宽度为上次接收到的字符宽度,即预想输出为123456
明显错了。
不得已,去查了printf函数。发现改成这样才对。
printf("接收到%.*s\n",len,USART_RX_BUF);                        //指定长度输出USART_RX_BUF

学C语言也很久了,printf函数可以说是最早接触到的函数,可是,万万没想到在这翻船,
发个帖子纪念下,提醒下自己,也提醒下朋友们,很多东西,自己真的是一知半解,搞好基础是多么的重要啊!



沙发
2000zxy| | 2014-1-10 01:30 | 只看该作者
是啊,学习要打好基础,学习要重娃娃抓起。谢谢了,学习了

使用特权

评论回复
板凳
bruce_helen| | 2014-1-10 13:20 | 只看该作者
这么高级的用法,我表示从来没用过

使用特权

评论回复
地板
huangfeng33| | 2014-1-10 21:53 | 只看该作者
%s输出的时候,必须遇到结束符才结束,结束符就是数字0,如果接收到2次123456,且连在一起,那就可能使你这种输出两次123456了.

使用特权

评论回复
5
shdjdq| | 2014-1-11 09:11 | 只看该作者
第一次看到这样的用法,很有价值。

使用特权

评论回复
6
shdjdq| | 2014-1-11 10:05 | 只看该作者
printf("Len=%0*.*f$\n",5+i,i,f); //前面加0,打印长度:5+I,小数点位数:,数据:f,
printf("Len=%*.*f$\n",5+i,i,f); //前面不加0,打印长度:5+I,小数点位数:,数据:f,
printf("Len=%.*d$\n",i+2,d); //前面加0,长度:i+2,数据:d;
printf("Len=%*.d$\n",i+2,d);//前面不加0,长度:i+2,数据:d;
printf("Len=%*.*d$\n",i+5,i+3,d);//总长度:i+5,数据加0的有效位:i+3,数据:d;
以上语句vs2010通过。

使用特权

评论回复
7
ahuzjh| | 2014-1-11 11:37 | 只看该作者
C语言其实很高深的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

482

主题

2214

帖子

11

粉丝