OpenEdv-开源电子网

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

STM32多串口printf问题

[复制链接]

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-6-19
在线时间
5 小时
发表于 2012-7-15 15:28:30 | 显示全部楼层 |阅读模式
网上找到的资料,支持多串口printf,但编译提示:
..\SYSTEM\usart\usart.c(64): error:  #77-D: this declaration has no storage class or type specifier

PUTCHAR_POTOTYPE 该如何操作?

#include <stdarg.h>

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc (int ch, FILE *f)
#endif

PUTCHAR_POTOTYPE
{
USART_SendData(USART1, (u8) ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);     
return ch;
}
void  USART3_printf(char *fmt, ...)
{
  char buffer[CMD_BUFFER_LEN+1];
u8 i=0;
va_list arg_ptr;

va_start(arg_ptr,fmt);
vsnprintf(buffer,CMD_BUFFER_LEN+1,fmt,arg_ptr);
while((i<CMD_BUFFER_LEN) && buffer)
{
USART_SendData(USART3, (u8)buffer[i++]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);
}
  va_end(arg_ptr);
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-15 19:11:24 | 显示全部楼层
这等于你自己重构了一个...
printf一个就够了吧,其他可以直接用写DR的方式.没发现printf不够用过...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-6-19
在线时间
5 小时
 楼主| 发表于 2012-7-15 22:24:12 | 显示全部楼层
现在是要用2个串口,如果不用printf函数的话,程序处理上比较麻烦,输出的格式有点多
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-15 23:06:22 | 显示全部楼层
哦,那你得找找能支持2个printf的实现方法.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-6-19
在线时间
5 小时
 楼主| 发表于 2012-8-5 11:20:06 | 显示全部楼层
这两天有空研究了下printf函数,参照网上资料自己写了个模拟printf函数,这样可以方便实现多串口printf了

其实printf函数最关键的就是可变参数的获取了,这里要用到stdarg.h库,经过测试基本没有问题了。

void myitoa(int data,char *buf )
{
int temp,j=0,i=0;
  while(data)    //反序生成数字,可自己取个数字测试,如123,反序字符数组中的值为321
  {
    buf[i++] = data%10+'0';//将转换后的数字字符存放在字符数组中
    data = data/10;    //删除已经转换的数字,为取下一个数字做好准备
  }
  buf[i--]='\0';    //转换完后还需要在字符数组后面加一个字符串结束标志'/0',代表是一个字符串
  while( j < i )    //刚刚转换好的字符串是逆序的必须把它反转过来
  {
  temp = buf[j];
  buf[j] = buf;
  buf = temp;
  i--,j++;
  }
}
//------------------------COM3 printf------------------------------//
void DBGprintf(const char *format, ...)
{
va_list ap;
char c,nc;

va_start(ap, format);  //从右到左将参数入栈,ap指向format
while (c = *format++)
{
if(c == '%'&&(nc = *format++) != '\0')
{
switch(nc)
  {
          case 'c':  //输出1个字符
  {
                        char ch = va_arg(ap, int);  //调用后栈位置+1
                        DBG_SendASC(ch);        //com3发送字符
                        break;
          }
          case 's': //输出字符串
{
                        char *p = va_arg(ap, char *);
                        DBG_SendStr((u8 *)p);    //com3发送字符串
                        break;
          }
case 'd':
{
int data = va_arg(ap,int);
        char buf[16];
        myitoa(data,buf);
        DBG_SendStr((u8 *)buf);
        break;
}
          default:
                    DBG_SendASC(nc); 
        }
    }else
{DBG_SendASC(c);}
}
     va_end(ap); //关闭指针
}


回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-5 11:24:56 | 显示全部楼层
可以写成形如:
myprintf(u8 uartx,const char *format, ...)
其中,uartx,就是要输出的串口,比如1,2,3,4,5对应串口1~5.
后见面的两个参数就是标准的printf参数了.
这样使用起来更方便.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-6-19
在线时间
5 小时
 楼主| 发表于 2012-8-5 11:54:35 | 显示全部楼层
后面是要这样写方便些,贴出代码来主要是让大家看下,顺便测试看有没有什么问题,目前测试都还正常

刚才测试打印INT整数,发现STM32int是32位的,上面程序默认的INT类型是有符号的,超出0x7fffffff,输出不正常。
这个要对程序做些修改才行,这点使用的时候要注意了
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-8-10
在线时间
0 小时
发表于 2013-8-11 09:55:56 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
想弱弱地问一句:那个myprintf(u8 uartx,const char *format, ...) 中的“...”是什么啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-11 12:07:37 | 显示全部楼层
回复【8楼】Aningsk:
---------------------------------
可变参数.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-8-10
在线时间
0 小时
发表于 2013-8-11 16:38:50 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
哦~谢谢!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-3-18
在线时间
0 小时
发表于 2014-6-10 12:15:08 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
请教  写DR的方法是指什么
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-3-18
在线时间
0 小时
发表于 2014-6-10 12:24:48 | 显示全部楼层
回复【11楼】zoupengju:
---------------------------------
回复【2楼】正点原子:
---------------------------------
主要是想通过Printf函数减少数据的出来不用再变换数据类型  丰富打印内容
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-10 23:25:21 | 显示全部楼层
回复【11楼】zoupengju:
---------------------------------
请参考寄存器版本的usart.c,fputc.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

20

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2015-5-5
在线时间
0 小时
发表于 2015-11-17 11:27:33 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥,我看他写的函数入口参数不是指针吗,为什么调用的时候直接(“%d”,i)就可以了,数据类型不是不一样吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 07:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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