找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3422|回复: 2
打印 上一主题 下一主题
收起左侧

[原创]分享一个单片机任意串口自定义printf函数方法

[复制链接]
跳转到指定楼层
楼主
ID:73666 发表于 2019-7-19 09:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在嵌入式开发过程中,往往需要多个单片机串口进行通讯,使用printf函数是个不错的选择,格式化输出后方便实用;
不论什么型号的单片机,只要支持标准C的编译器,都可以实现此功能,
    添加如下头文件;
  1. #include "stdio.h"
  2. #include "string.h"
  3. #include "stdarg.h"
复制代码
下面是函数定义,可以移植到任意的串口;
  1. bit S1_busy;
  2. unsigned char idata Put_buf[100];                //最大数量
  3. void my_printf(char* fmt,...)
  4. {
  5.     unsigned char i,len;
  6.     va_list ap;
  7.     va_start(ap,fmt);
  8.     len=vsprintf((char*)Put_buf,fmt,ap);
  9.     va_end(ap);
  10.         
  11.     for(i=0;i<len;i++)                        //把缓存内的字符发送出去
  12.     {        
  13.         while(S1_busy);                     //等待前面的数据发送完成
复制代码
下面是主函数测试;
  1. void main()                        
  2. {
  3.     unsigned int i;
  4.     UartInit();                                                        //串口初始化
  5.     EA=1;                                                                //开总中断
  6.         
  7.     while(1)
  8.     {
  9.         my_printf("Hello World!");
复制代码

最终实现效果如下图:

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:73666 发表于 2019-7-19 17:10 | 只看该作者
上面的代码怎么不完整了,不知道怎么回事,补一个出来。
回复

使用道具 举报

板凳
ID:73666 发表于 2019-7-19 17:11 | 只看该作者
第二段
  1. bit S1_busy;
  2. unsigned char idata Put_buf[100];                //最大数量
  3. void my_printf(char* fmt,...)
  4. {
  5.         unsigned char i,len;
  6.         va_list ap;
  7.         va_start(ap,fmt);
  8.         len=vsprintf((char*)Put_buf,fmt,ap);
  9.         va_end(ap);
  10.        
  11.         for(i=0;i<len;i++)                        //把缓存内的字符发送出去
  12.         {       
  13.                 while(S1_busy);                     //等待前面的数据发送完成
  14.                 S1_busy=1;       
  15.                 SBUF=Put_buf[i];                //发送一个字节
  16.         }
  17.         memset(Put_buf,0,sizeof(Put_buf));        //清空缓存
  18. }
复制代码

第三段
  1. void main()                       
  2. {
  3.         unsigned int i;
  4.         UartInit();                                                        //串口初始化
  5.         EA=1;                                                                //开总中断
  6.        
  7.         while(1)
  8.         {
  9.                 my_printf("Hello World!");
  10.                 my_printf("  i=%03d,0x%03X\r\n",i,i++);
  11.                 Delay_ms(500);
  12.         }
  13. }       
  14.        
  15. void Uart1() interrupt 4       
  16. {       
  17.         if(RI)                                                                //接收中断
  18.                 RI = 0;                                                        //清标志       
  19.         else                                                                //发送中断
  20.         {       
  21.                 TI = 0;                                                        //清标志
  22.                 S1_busy=0;                                                //非忙
  23.         }       
  24. }
复制代码

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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