1回答

2收藏

【赚周年币】技术帖Week1-Day4——LPC824 Breakout之四,串口printf

#线上活动 #线上活动 3027 人阅读 | 1 人回复 | 2017-01-04

本帖最后由 toofree 于 2017-1-17 23:40 编辑

        【赚周年币】技术帖Week1-Day4——LPC824 Breakout之四,串口printf、scanf

        串口printf用的比较多吧,但并不是每个人都会用。即便会用,也可能没考虑太多,只是用用而已。
        虽然是简单应用,就怕认真,能用好了就不简单。

        老规矩,还以上一贴最后上传压缩包做主工程模板。参见贴子最末尾的附件。
        [技术] 【赚周年币】技术帖Week1-Day3——LPC824 Breakout之三、LEDs_Toggle
        https://www.cirmall.com/bbs/thread-59467-1-1.html
        


        这次就不用"Example_GPIO_Pattern_Match"工程了,复制一下改个名,另开个工程方便编辑。
        复制“Example_GPIO_PatternMatch”,改名为“Example_My_Printf”。“Keil_Projects”和“Keil_Projects”两个目录下对应文件夹,都复制改名。
        将工程目录下的“Example_GPIO_Pattern_Match.uvprojx”工程也改名为“Example_My_Printf.uvprojx”,同目录下的其它文件和文件夹全部删除。
      

        用文本编辑工具打开“Example_My_Printf.uvprojx”,本人用的是ultraedit。把所有关于“Example_GPIO_Pattern_Match”和“Example_GPIO_PatternMatch”全部统统替换为“Example_My_Printf”。
      
        将源文件夹下的相应的两个文件也改名为“Example_My_Printf.c”和“Example_My_Printf_ISR.c
        


        打开工程合集,将工程添加到工程合集中(添加方法就不说了吧,应该都会,不会也容易摸索),调整顺序放到GPIO的底下,并设置为活动工程。
        


        打开“Example_My_Printf.c”,将不必要的注释,不用的程序段,该删的删,该收的收。改完后效果如下:
        

        是不清爽了好多

        打开“Serial.c”文件,波特率改为115200。LPC824支持115200的波特率,下载程序就是用的115200,默认的9600速度太低了。
        

        const uint32_t desired_baud = 115200;

        “Board.h”文件中的管脚影射之前已经改过了。
        


        编译程序,下载“.HEX”到目标板。
        


        打开Flash Magic工具自带的终端工具,“tools”菜单-->“Terminal...”,波特设置为115200,串口号选择与下载程序串口号相同。
        

        
        输入字符串,以回车符结束。每输入一组,回显一次。并且板上红色LED灯,会亮灭交替变化一次。
        

        但是问题来了,明明输入了一次,终端却显示两次。这是什么个鬼。

        要找原因,查看文件“Keil_Retarget.c”,发现第33行是这么个情况。
         return (sendchar(getkey()));
        

        这就不难理解,为什么会每输入一个字符,都回显一次了。
        要改,一定要改,但是原则是尽可能不动库文件。那我们就把这个文件复制到“user_bsp\src”目录下,并改名为“Keil_Retarget1.c”,防止两个文件混淆。
        然后把对应的行改为:
  1. int fgetc(FILE *f) {
  2.     //return (sendchar(getkey()));
  3.     return (getkey());
  4. }
复制代码
将“Keil_Retarget1.c”文件添加到工程中,并且设置“Keil_Retarget.c”文件为无效状态,否则编译会出错(有相同的函数名)。
        

        上图中“Keil_Retarget.c”文件上有个红圈里有白杠杠表示无效状态了,设置方法是此文件在工程中的属性里把"Include in target Build"前面的勾勾点掉。
        

        
        重新编译,下载新的“.HEX”到目标板。打开终端看效果。
        

        可以看到,输入一行,只回显一行。这个就是我们想要的效果

        这里我们就要说一下“Keil_Retarget.c”文件的作用。在本工程中,即便去掉了“Keil_Retarget.c”文件,编译也不会有问题,但是就不能用printf、scanf等函数通过串口输入输出数据了。这个文件的作用实质上就是,把标准 fputc()、fgetc()强行绑架到串口,而printf、scanf实现是要靠调用 fputc()、fgetc()的。

        在用scanf时用了,scanf( "%[^\n]",a);,而不是用scanf( "%s",a);。这是因为想要输入空格,如果用后者恐怕无法输入空格,一旦输入空格,那么就认为字符串输入结束。这个属于C语言范畴,就不多啰嗦了。

        好了,用串口printf、scanf到此结束,完美收工。

        依照惯例, 修改后工程文件打包附上,走起!
      
LPC824_Example_Code_Bundle_Keil_r1.0.rar (1.28 MB, 下载次数: 43)

关注下面的标签,发现更多相似文章

评分

参与人数 2 +35 收起 理由
EEboard爱板网 + 10 3周发帖养成记 奖励
loveeeboard + 25

查看全部评分

分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

baleandmodric

发表于 2017-1-4 21:19:06 | 只看该作者

可以试试啦,正好活动期间买了一块这样的板子
多发发资料就最好了
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条