查看: 305|回复: 1

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

[复制链接]

24

主题

0

好友

4216

积分

状元

Rank: 6Rank: 6

  • TA的每日心情
    开心
    半小时前
  • 签到天数: 1309 天

    连续签到: 19 天

    [LV.10]以坛为家III

    爱板会员勋章 活跃会员勋章 发帖机器勋章 在线达人勋章

    发表于 2017-1-4 00:38:17 |显示全部楼层
    本帖最后由 toofree 于 2017-1-17 23:40 编辑

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

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

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


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

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


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


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

            是不清爽了好多

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

            const uint32_t desired_baud = 115200;

            “Board.h”文件中的管脚影射之前已经改过了。
             傲游截图20170103235932.jpg


            编译程序,下载“.HEX”到目标板。
             傲游截图20170103231820.jpg


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

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

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

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

            这就不难理解,为什么会每输入一个字符,都回显一次了。
            要改,一定要改,但是原则是尽可能不动库文件。那我们就把这个文件复制到“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”文件为无效状态,否则编译会出错(有相同的函数名)。
             傲游截图20170104002126.jpg

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

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

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

            这里我们就要说一下“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, 下载次数: 11)
    已有 2 人评分 收起 理由
    EEboard爱板网 + 10 3周发帖养成记 奖励
    loveeeboard + 25

    总评分:  + 35   查看全部评分

    回复

    使用道具 举报

    1

    主题

    0

    好友

    244

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    开心
    2017-6-11 21:30
  • 签到天数: 57 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2017-1-4 21:19:06 |显示全部楼层
    可以试试啦,正好活动期间买了一块这样的板子
    多发发资料就最好了
    回复

    使用道具 举报

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

    关闭

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

    手机版|爱板网 |网站地图  

    GMT+8, 2017-6-25 02:54 , Processed in 0.112868 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部