OpenEdv-开源电子网

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

需要USart1,USart2接收数据,但是printf()输出数据有冲突,想问下怎么才能把两个数据分别通过两个串口输出?

[复制链接]

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
发表于 2018-3-27 18:19:54 | 显示全部楼层 |阅读模式
1金钱

最佳答案

查看完整内容[请看2#楼]

参考我们开发板的扩展例程,比如蓝牙按模块的,就有多个printf。 默认的printf是通过串口1. u2_printf,就是串口2.你只需要实现这个函数即可。 //串口3,printf 函数 //确保一次发送数据不超过USART3_MAX_SEND_LEN字节 void u3_printf(char* fmt,...) { u16 i,j; va_list ap; va_start(ap,fmt); vsprintf((char*)USART3_TX_BUF,fmt,ap); va_end(ap); i=strlen((const char*)USART3_TX_BUF);//此次发送数据的 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-3-27 18:19:55 | 显示全部楼层
参考我们开发板的扩展例程,比如蓝牙按模块的,就有多个printf。
默认的printf是通过串口1.
u2_printf,就是串口2.你只需要实现这个函数即可。
//串口3,printf 函数
//确保一次发送数据不超过USART3_MAX_SEND_LEN字节
void u3_printf(char* fmt,...)  
{  
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF);//此次发送数据的长度
for(j=0;j<i;j++)//循环发送数据
{
  while((USART3->SR&0X40)==0);//循环发送,直到发送完毕   
  USART3->DR=USART3_TX_BUF[j];  
}
}



我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2018-2-11
在线时间
53 小时
发表于 2018-3-27 18:36:22 | 显示全部楼层
没看明白你想干嘛
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 18:41:43 | 显示全部楼层
我想输出两组数据,但现在两组数据争用一个串口,我配置了串口2,但是fputc()只能对一个串口起作用
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 18:42:53 | 显示全部楼层
int fputc(int ch, FILE *f)     //

{

USART_SendData(USART1, (unsigned char) ch);

while (!(USART1->SR & USART_FLAG_TXE));

return (ch);}
就是这个函数
回复

使用道具 举报

4

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2018-2-11
在线时间
53 小时
发表于 2018-3-27 18:45:35 | 显示全部楼层
为什么非要分别从2个串口输出  实在不行 直接用串口发送函数  又不是一定得用printf
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 18:48:42 | 显示全部楼层
两组数据都直接用串口发送,会混淆,就算不用printf也要fputc函数,不然输不出数据,但是我不知道为啥
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 18:50:07 | 显示全部楼层
我做的是一个电子称,称重和触屏部分都做完了,现在就是不能一起使用
回复

使用道具 举报

4

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2018-2-11
在线时间
53 小时
发表于 2018-3-27 18:52:12 | 显示全部楼层

void Usart_Senddata(USART_TypeDef* USARTx,u8* buffer,u16 len)
{
        u16 i;
        for(i=0;i<len;i++)
        {
                USARTx->DR = buffer[i];
                while((USARTx->SR&0x40)==0);
        }
}
回复

使用道具 举报

4

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2018-2-11
在线时间
53 小时
发表于 2018-3-27 18:56:01 | 显示全部楼层
看看你哪里的发送冲突了 怎么用的
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 19:59:41 | 显示全部楼层
我现在是两个数据都靠一个串口接收的,我不知道这两组数是怎么发送到串口的,所以我不能指定一个数据发送到一个串口,
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 20:01:13 | 显示全部楼层
我没看到有发送数据的函数,然后数据就在串口输出了
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-27 20:18:09 来自手机 | 显示全部楼层
重写一个printf1
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 20:25:58 | 显示全部楼层
               adcx1=filter();//计算重量
                        if(adcx1>adcx){
                adcx1=adcx1-adcx;
   
                adcx1=adcx1/100;/
                weight=(float)adcx1/4.29496+0.005;  //
                adcx1=weight;
         
                LCD_ShowxNum(80,10,adcx1,3,16,0);//
就这些代码,串口就可以输出数字了
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 20:34:35 | 显示全部楼层

怎么重写printf1?
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 20:38:09 | 显示全部楼层
void USART2_printf (char *fmt, ...)
{
        char buffer[CMD_BUFFER_LEN+1];  // CMD_BUFFER_LEN长度自己定义吧
        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(USART2, (u8) buffer[i++]);
                while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
        }
        va_end(arg_ptr);
}
我已经试过这样写,但是不行
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-3-27 20:45:18 | 显示全部楼层
本帖最后由 275891381 于 2018-3-27 20:50 编辑

#ifndef __USART2_H
#define __USART2_H
#include "stdio.h"        
#include <stdarg.h>
#include "sys.h"

#define    USART2_MAX_RECV_LEN                200                             //最大接收缓存字节数
#define    USART2_MAX_SEND_LEN                300                             //最大发送缓存字节数
extern u8  USART2_RX_BUF[USART2_MAX_RECV_LEN]; //接收缓冲,最大USART1_MAX_RECV_LEN字节
extern u8  USART2_TX_BUF[USART2_MAX_SEND_LEN]; //发送缓冲,最大USART1_MAX_SEND_LEN字节
extern u16 USART2_RX_STA;                                  //接收状态标记                                         


void USART2_Init(u32 bound);
void USART2_printf (char *fmt, ...);
#endif






#include "sys.h"
#include "usart2.h"         


#define USART2_IRQHandler_NVIC_IRQChannelPreemptionPriority          5//USART2全局中断
u8  USART2_TX_BUF[USART2_MAX_SEND_LEN];                 //发送缓冲,最大USART2_MAX_SEND_LEN字节
u8  USART2_RX_BUF[USART2_MAX_RECV_LEN];                 //接收缓冲,最大USART2_MAX_RECV_LEN字节

//接收状态
//bit15,        接收完成标志
//bit14,        接收到0x0d
//bit13~0,        接收到的有效字节数目
u16 USART2_RX_STA=0;       //接收状态标记         


void USART2_Init(u32 bound)
{
                //GPIO端口设置
                GPIO_InitTypeDef GPIO_InitStructure;
                USART_InitTypeDef USART_InitStructure;
                NVIC_InitTypeDef NVIC_InitStructure;
               
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟
                //USART2_TX   GPIOA.2
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
                GPIO_Init(GPIOA, &GPIO_InitStructure);

                //USART2_RX          GPIOA.3初始化
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
                GPIO_Init(GPIOA, &GPIO_InitStructure);  

                //Usart2 NVIC 配置
                NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=USART2_IRQHandler_NVIC_IRQChannelPreemptionPriority;//抢占优先级5
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                //子优先级3
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
                NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
               
                 //USART 初始化设置
                USART_InitStructure.USART_BaudRate = bound;//串口波特率
                USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
                USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
                USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
                USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
                USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

                USART_Init(USART2, &USART_InitStructure); //初始化串口2
                USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
                USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//开启串口空闲IDEL中断
                USART_Cmd(USART2, ENABLE);                    //使能串口2

}
void USART2_printf (char *fmt, ...)
{
                u8 i = 0;
                va_list arg_ptr;
                va_start(arg_ptr, fmt);
                vsnprintf(USART2_TX_BUF, USART2_MAX_SEND_LEN+1, fmt, arg_ptr);
                va_end(arg_ptr);
                while ((i < USART2_MAX_SEND_LEN) && USART2_TX_BUF)
                {
                                USART_SendData(USART2, (u8) USART2_TX_BUF[i++]);
                                while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
                }
}

void USART2_IRQHandler(void)                        //串口1中断服务程序
{
        if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)  // 空闲中断
        {
                        USART_ReceiveData(USART2); // Clear IDLE interrupt flag bit

        }        
        if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) // 检查 ORE 标志,防止开关总中断死机,放在接收中断前面
  {
      USART_ClearFlag(USART2,USART_FLAG_ORE);
      USART_ReceiveData(USART2);
  }
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
        {
               
               
                USART_ClearITPendingBit(USART2, USART_IT_RXNE); //不添加这一句就要关闭接收中断,不然引脚虚脱或者断开会死机                  
  }

}





回复

使用道具 举报

25

主题

161

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2017-7-17
在线时间
149 小时
发表于 2018-3-27 20:45:39 | 显示全部楼层
你是想另写一个 u2_printf() 串口输出?可以参照看下这个程序https://pan.baidu.com/s/1xvzKroTMkeJBnhHb5NMZqw
有兴趣的话关注下我的公众号 智控互联
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 20:45:58 | 显示全部楼层
好像是因为我没有替换掉底层的串口发送函数,不知道啥情况
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 20:47:34 | 显示全部楼层
王建峰 发表于 2018-3-27 20:45
你是想另写一个 u2_printf() 串口输出?可以参照看下这个程序https://pan.baidu.com/s/1xvzKroTMkeJBnhHb5NM ...

我就是想让两组数分开传输,两个串口的话,应该是需要这个
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-3-27 20:47:39 | 显示全部楼层
A2a 发表于 2018-3-27 20:45
好像是因为我没有替换掉底层的串口发送函数,不知道啥情况

刚给你发了  .h  .c 都有 直接用就可以了
回复

使用道具 举报

25

主题

161

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2017-7-17
在线时间
149 小时
发表于 2018-3-27 20:50:34 | 显示全部楼层
A2a 发表于 2018-3-27 20:47
我就是想让两组数分开传输,两个串口的话,应该是需要这个

我的程序和上边那位老兄的类似,看他的也一样。
不忘初心,方得始终!
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 20:51:03 | 显示全部楼层
275891381 发表于 2018-3-27 20:47
刚给你发了  .h  .c 都有 直接用就可以了

我还有一个串口1,用这个的话两个会不会有关联?
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-3-27 20:52:23 | 显示全部楼层
A2a 发表于 2018-3-27 20:51
我还有一个串口1,用这个的话两个会不会有关联?

串口2用 USART2_printf   串口1 用printf  不会冲突的
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 20:59:15 | 显示全部楼层
好,我试试。
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 20:59:56 | 显示全部楼层
王建峰 发表于 2018-3-27 20:50
我的程序和上边那位老兄的类似,看他的也一样。

我知道了,先谢谢大佬
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 21:13:06 | 显示全部楼层
275891381 发表于 2018-3-27 20:52
串口2用 USART2_printf   串口1 用printf  不会冲突的

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=USART2_IRQHandler_NVIC_IRQChannelPreemptionPriority;//后面的参数没定义
SYSTEM\usart\usart.c(37): error:  #20: identifier "USART2_IRQHandler_NVIC_IRQChannelPreemptionPriority" is undefined
                  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=USART2_IRQHandler_NVIC_IRQChannelPreemptionPriority;//
SYSTEM\usart\usart.c(61): warning:  #167-D: argument of type "u8 *" is incompatible with parameter of type "char *restrict"
                  vsnprintf(USART2_TX_BUF, USART2_MAX_SEND_LEN+1, fmt, arg_ptr);
这两个地方有警告,不知道什么原因,这个不行
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-3-27 21:15:13 | 显示全部楼层
A2a 发表于 2018-3-27 21:13
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=USART2_IRQHandler_NVIC_IRQChannelPreemptionPr ...

USART2_IRQHandler_NVIC_IRQChannelPreemptionPriority  你改成个数就可以了 改成5吧,为了方便修改我定义的宏
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 21:16:02 | 显示全部楼层
275891381 发表于 2018-3-27 21:15
USART2_IRQHandler_NVIC_IRQChannelPreemptionPriority  你改成个数就可以了 改成5吧,我定义的宏

我改过5了,但是不行,
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 21:18:19 | 显示全部楼层
就算是我能用这个函数,那我怎么指定串口2 输出的是称重传感器的值?
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-3-27 21:31:11 | 显示全部楼层
A2a 发表于 2018-3-27 21:18
就算是我能用这个函数,那我怎么指定串口2 输出的是称重传感器的值?

那你需要理解的三两句就说不清了
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 21:32:40 | 显示全部楼层
275891381 发表于 2018-3-27 21:31
那你需要理解的三两句就说不清了

那现在这个不行咋办?
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-3-27 21:40:48 | 显示全部楼层
A2a 发表于 2018-3-27 21:32
那现在这个不行咋办?

printf 怎么用 USART2_printf 就怎么用就可以了呀,不知道你纠结啥
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 21:44:02 | 显示全部楼层
275891381 发表于 2018-3-27 21:40
printf 怎么用 USART2_printf 就怎么用就可以了呀,不知道你纠结啥

这个我知道,现在是 USART2_printf这个函数不起作用,运行没错误,但是下载到板上没有输出
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-3-27 21:47:25 | 显示全部楼层
A2a 发表于 2018-3-27 21:44
这个我知道,现在是 USART2_printf这个函数不起作用,运行没错误,但是下载到板上没有输出

初始化没,用的是不是串口2 的引脚,
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 22:09:27 | 显示全部楼层
275891381 发表于 2018-3-27 21:47
初始化没,用的是不是串口2 的引脚,

初始化了,串口引脚也用了,就是Usart_printf函数不能用
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-27 22:12:48 | 显示全部楼层
int fputc(int ch, FILE *f)     //
{

USART_SendData(USART2, (unsigned char) ch);//
while (!(USART2->SR & USART_FLAG_TXE));   //
return (ch);}
用这个函数替换就可以
回复

使用道具 举报

0

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2016-9-21
在线时间
63 小时
发表于 2018-3-27 22:13:28 | 显示全部楼层
用 snprintf 格式化输出函数,分别生成需要printf的字符串后分别用USART发送输出
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-28 08:55:18 | 显示全部楼层
A2a 发表于 2018-3-27 20:34
怎么重写printf1?

#include <stdio.h>
#include <stdarg.h>


void printf1 (char *fmt, ...)
{
char buffer[CMD_BUFFER_LEN+1];  // CMD_BUFFER_LEN长度自己定义吧
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(USART1, (u8) buffer[i++]);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);  
}
va_end(arg_ptr);
}
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-28 21:05:00 | 显示全部楼层
正点原子 发表于 2018-3-27 18:19
参考我们开发板的扩展例程,比如蓝牙按模块的,就有多个printf。
默认的printf是通过串口1.
u2_printf, ...

那我有办法把一组数从指定的串口输出吗?例程能发给我一份吗?我现在没找到
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-3-29 09:42:06 | 显示全部楼层
A2a 发表于 2018-3-28 21:05
那我有办法把一组数从指定的串口输出吗?例程能发给我一份吗?我现在没找到

串口1输出就用printf("%d",123);
串口2输出就用USART2_printf("%d",123);
不就可以了,你在纠结啥呢
回复

使用道具 举报

2

主题

27

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-3-27
在线时间
5 小时
 楼主| 发表于 2018-3-29 14:51:58 | 显示全部楼层
275891381 发表于 2018-3-29 09:42
串口1输出就用printf("%d",123);
串口2输出就用USART2_printf("%d",123);
不就可以了,你在纠结啥呢

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "tftlcd.h"
#include "key.h"
#include "touch.h"
#include "math.h"                                                        //&#212;&#203;&#203;&#227;í·&#206;&#196;&#188;
#include "HX711.h"
#include "usart2.h"

        void Usart_Senddata(USART_TypeDef* USARTx,u32 buffer);
u8 tab[20]={0};                                                                                        //êy&#190;Y±í&#187;o3&#229;&#199;&#248;
u8 empty[]="                    ";        //2á3y&#189;á1&#251;ó&#195;£¨20&#206;&#187;&#191;&#213;×&#214;·&#251;£&#169;
int cc[20],dd[20];                                                                        //′&#230;′¢&#212;&#203;&#203;&#227;&#189;á1&#251;×&#214;·&#251;′&#230;′¢&#187;o3&#229;
int buff[20];                                                                                                //ê&#228;è&#235;êy&#190;Y&#187;o3&#229;êy×é
u8 flag,zero,one,two,point,point_flag;//±ê&#214;&#190;&#206;&#187;
int a,b;                                                                                                                //′¥&#195;t·μ&#187;&#216;&#214;μ
int i,j;                                                                                                                //&#209;-&#187;·ó&#195;±&#228;á&#191;
int x,y,x1,y1;                                                                                            //×&#248;±ê&#198;&#171;ò&#198;á&#191;
int k,v,t,l,h,m,n;
float num1,num2,num3,sum1,sum;                        //êy&#190;Y&#212;&#203;&#203;&#227;&#189;á1&#251;′&#230;′¢&#187;o3&#229;
int times;                                                                                                        //êy&#190;Y&#206;&#187;êy
int ch,pp;
char table[16]={'7','4','1','.',                         //êy&#190;Y±í
                          '8','5','2','0',
                          '9','6','3','=',
       'c','q','t','a'};

void kai_display()  //&#191;a&#187;ú&#207;&#212;ê&#190;
{
        FRONT_COLOR=BLACK;
        LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,16,"Touch Test");
        LCD_ShowString(10,30,tftlcd_data.width,tftlcd_data.height,16,"www.prechin.net");
        LCD_ShowString(10,50,tftlcd_data.width,tftlcd_data.height,16,"K_UP:Adjust");       
}

void display_init()  //3&#245;ê&#188;&#187;ˉ&#207;&#212;ê&#190;
{
        FRONT_COLOR=BLACK;
        LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,16,"Weight:");
        LCD_ShowString(10,60,tftlcd_data.width,tftlcd_data.height,16,"Price:");
        LCD_ShowString(10,110,tftlcd_data.width,tftlcd_data.height,16,"total:");       
        LCD_DrawRectangle(5,160,230,390);       

        for(j=35;j<230;j=j+55){
                                                       
                                                        for(k=195;k<390;k=k+55){
                                                        LCD_ShowChar(j,k,table[v],16,0);
                                                                v++;
                                                               
                                                               
                                                        }
                                                       
                                                }               
}

int main()
{
        u32 adcx;
        u32 adcx1;
        float weight;
       
        u8 key;
        u16 penColor = BLUE;
        x=35;                                        //×&#214;·&#251;oá×&#248;±ê3&#245;&#214;μ
        y=195;                                        //×&#214;·&#251;×Y×&#248;±ê3&#245;&#214;μ
        k=0;                                        //
        x1=10;                                        //×&#214;·&#251;&#191;òoá×&#248;±ê3&#245;&#214;μ
        y1=170;                                //×&#214;·&#251;&#191;ò×&#248;±ê3&#245;&#214;μ
        v=0;
        t=0;//×a&#187;&#187;êy×éμ&#196;&#214;μ
        l=0;
        zero=0;       
        times=0;
        sum1=0;
        m=80;//&#188;&#219;&#184;&#241;&#207;&#212;ê&#190;oá×&#248;±êx
        n=60;//&#188;&#219;&#184;&#241;&#207;&#212;ê&#190;×Y×&#248;±êy
        point_flag=0;
        SysTick_Init(72);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é ·&#214;2×é
        LED_Init();
        USART1_Init(9600);
        USART2_Init(9600);

        TFTLCD_Init();                        //LCD3&#245;ê&#188;&#187;ˉ
        KEY_Init();
        kai_display();
        delay_ms(20000);       
        LCD_Clear(WHITE);
        TOUCH_Init();
        display_init();
       
        RCC_Configuration();//RCC&#214;&#184;ê±&#214;ó&#191;&#216;&#214;&#198;&#212;¤·&#214;&#198;μ&#198;÷
  GPIO_Configuration();//3&#245;ê&#188;&#187;ˉGPIO&#191;ú×′ì&#172;
  
        adcx=filter();
        while(1)
        {
               
                delay_ms(1000);//&#209;óê±1s,&#191;é&#196;üê&#199;&#206;aá&#203;μè&#182;áêy&#206;è&#182;¨£¨&#213;a&#184;&#246;&#209;óê±ê&#199;&#206;aá&#203;&#206;è&#182;¨£&#172;ò2&#191;éò&#212;á&#244;ê±&#188;&#228;&#194;&#203;2¨£&#169;
    adcx1=filter();
                        if(adcx1>adcx){
                adcx1=adcx1-adcx;
   
                adcx1=adcx1/100;//&#206;a&#189;úê&#161;&#212;&#203;&#203;&#227;á&#191;£&#172;&#189;&#171;AD&#214;μ1ì&#182;¨&#203;&#245;D&#161;100±&#182;
                weight=(float)adcx1/4.29496+0.005;  //êμ&#188;êó&#195;μ&#196;ê±oòDèòaμ÷ê&#212;£&#172;429.496óéóú′&#171;&#184;D&#198;÷2&#238;òì&#213;a&#184;&#246;&#207;μêyò&#187;°&#227;&#212;ú400μ&#189;500&#214;&#174;&#188;&#228;£&#172;&#188;ó0.005ê&#199;&#206;aá&#203;&#203;&#196;éá&#206;&#229;è&#235;
                adcx1=weight;
                 USART2_printf("%f",adcx1);
                LCD_ShowxNum(80,10,adcx1,3,16,0);//&#207;&#212;ê&#190;&#214;&#216;á&#191;&#214;μ&#213;&#251;êy2&#191;·&#214;
      
                weight-=adcx1;
                weight*=1000;
               
               
                        }
               
               
                key=KEY_Scan(0);
                if(key==KEY_UP)
                {
                        TOUCH_Adjust(); //D£&#213;y
                        display_init();
                }
               
       
                if(TOUCH_Scan() == 0)
        {          
                                       
                                                                        if(TouchData.lcdx>x1&&TouchData.lcdx<x1+55&&TouchData.lcdy>y1&&TouchData.lcdy<y1+55)
                                                                                {
                                                                                       
                                                                        LCD_ShowChar(m,n,table[0],16,0);
                                                                                        buff[t++]=(int)table[0]-'0';
                                                                                        delay_ms(2000);       
                                                                                        m=m+8;
                                                                                }
                                                                                if(TouchData.lcdx>x1&&TouchData.lcdx<x1+55&&TouchData.lcdy>y1+55&&TouchData.lcdy<y1+110)
                                                                                {
                                                                                       
                                                                        LCD_ShowChar(m,n,table[1],16,0);
                                                                                        buff[t++]=(int)table[1]-'0';
                                                                                        delay_ms(2000);       
                                                                                        m=m+8;
                                                                                }
                                                                                if(TouchData.lcdx>x1&&TouchData.lcdx<x1+55&&TouchData.lcdy>y1+110&&TouchData.lcdy<y1+165)
                                                                                {
                                                                                       
                                                                        LCD_ShowChar(m,n,table[2],16,0);
                                                                                        buff[t++]=(int)table[2]-'0';
                                                                                        delay_ms(2000);       
                                                                                        m=m+8;
                                                                                }
                                                                                if(TouchData.lcdx>x1&&TouchData.lcdx<x1+55&&TouchData.lcdy>y1+165&&TouchData.lcdy<y1+220)
                                                                                {
                                                                                       
                                                                        LCD_ShowChar(m,n,table[3],16,0);
                                                                                        buff[t++]=(int)table[3]-'0';
                                                                                       
                                                                                        delay_ms(2000);       
                                                                                        m=m+8;
                                                                                }
                                                                                if(TouchData.lcdx>x1+55&&TouchData.lcdx<x1+110&&TouchData.lcdy>y1&&TouchData.lcdy<y1+55)
                                                                                {
                                                                                       
                                                                        LCD_ShowChar(m,n,table[4],16,0);
                                                                                        buff[t++]=(int)table[4]-'0';
                                                                                        delay_ms(2000);       
                                                                                        m=m+8;
                                                                                }
                                                                                if(TouchData.lcdx>x1+55&&TouchData.lcdx<x1+110&&TouchData.lcdy>y1+55&&TouchData.lcdy<y1+110)
                                                                                {
                                                                                       
                                                                        LCD_ShowChar(m,n,table[5],16,0);
                                                                                        buff[t++]=(int)table[5]-'0';
                                                                                        delay_ms(2000);       
                                                                                        m=m+8;
                                                                                }
                                                                                if(TouchData.lcdx>x1+55&&TouchData.lcdx<x1+110&&TouchData.lcdy>y1+110&&TouchData.lcdy<y1+165)
                                                                                {
                                                                                       
                                                                        LCD_ShowChar(m,n,table[6],16,0);
                                                                                        buff[t++]=(int)table[6]-'0';
                                                                                        delay_ms(2000);       
                                                                                        m=m+8;
                                                                                }
                                                                                if(TouchData.lcdx>x1+55&&TouchData.lcdx<x1+110&&TouchData.lcdy>y1+165&&TouchData.lcdy<y1+220)
                                                                                {
                                                                                       
                                                                        LCD_ShowChar(m,n,table[7],16,0);
                                                                                        buff[t++]=(int)table[7]-'0';
                                                                                        delay_ms(2000);       
                                                                                        m=m+8;
                                                                                }
                                                                                if(TouchData.lcdx>x1+110&&TouchData.lcdx<x1+165&&TouchData.lcdy>y1&&TouchData.lcdy<y1+55)
                                                                                {
                                                                                       
                                                                        LCD_ShowChar(m,n,table[8],16,0);
                                                                                        buff[t++]=(int)table[8]-'0';
                                                                                        delay_ms(2000);       
                                                                                        m=m+8;
                                                                                }
                                                                                if(TouchData.lcdx>x1+110&&TouchData.lcdx<x1+165&&TouchData.lcdy>y1+55&&TouchData.lcdy<y1+110)
                                                                                {
                                                                                       
                                                                        LCD_ShowChar(m,n,table[9],16,0);
                                                                                        buff[t++]=(int)table[9]-'0';
                                                                                        delay_ms(2000);       
                                                                                        m=m+8;
                                                                                }
                                                                                if(TouchData.lcdx>x1+110&&TouchData.lcdx<x1+165&&TouchData.lcdy>y1+110&&TouchData.lcdy<y1+165)
                                                                                {
                                                                                       
                                                                        LCD_ShowChar(m,n,table[10],16,0);
                                                                                        buff[t++]=(int)table[10]-'0';
                                                                                        delay_ms(2000);       
                                                                                        m=m+8;
                                                                                }
                                                                                if(TouchData.lcdx>x1+110&&TouchData.lcdx<x1+165&&TouchData.lcdy>y1+165&&TouchData.lcdy<y1+220)
                                                                                { sum1=0;num1=0;
                                                                                        for(i=0;i<t;i++){printf("%d\n",buff);delay_ms(2000);
                                                                                        }
                                                                                        if(buff[0]<0)
                                        LCD_ShowString(80,110,tftlcd_data.width,tftlcd_data.height,16,"Error");
                                else{
            for(i=0;buff>0;i++)
                                sum1=sum1*10+buff;
                                        printf("sum1=%f\n",sum1);
                                 printf("i=%d\n",i);
         v=t-i-1;
                                        printf("V=%d\n",t-i-1);
                            for(i=0;i<v;i++)
                                        num1=num1/10+(float)buff[t-1-i]/10;
                                printf("num1=%f\n",num1);
                                sum=num1+sum1;
                                }
                                //printf("%f\n",sum);
                                                                       
                                                                                }
                                                                                if(TouchData.lcdx>x1+165&&TouchData.lcdx<x1+220&&TouchData.lcdy>y1&&TouchData.lcdy<y1+55)
                                                                                {
                                                                                        LCD_Fill(80,60,230,110,BACK_COLOR);
                                                                                       
                                                                                        m=80;
                                                                                        t=0;
                                                                                        sum1=0;num1=0;sum=0;
                                                                                }
                                                                                if(TouchData.lcdx>x1+165&&TouchData.lcdx<x1+220&&TouchData.lcdy>y1+55&&TouchData.lcdy<y1+110)
                                                                                {
                                                                                        LCD_Fill(80,60,230,110,BACK_COLOR);
                                                                                       
                                                                                        m=80;
                                                                                }
                                                                                if(TouchData.lcdx>x1+165&&TouchData.lcdx<x1+220&&TouchData.lcdy>y1+110&&TouchData.lcdy<y1+165)
                                                                                {
                                                                                        LCD_Fill(80,60,230,110,BACK_COLOR);
                                                                                       
                                                                                        m=80;
                                                                                }
                                                                                if(TouchData.lcdx>x1+165&&TouchData.lcdx<x1+220&&TouchData.lcdy>y1+165&&TouchData.lcdy<y1+220)
                                                                                {
                                                                                        LCD_Fill(80,60,230,110,BACK_COLOR);
                                                                                       
                                                                                        m=80;
                                                                                }
                                                                       
           }
               
                                                                               
                                                                               
                                                                       
       }
                                 }
       
这是用你发的usart2的代码写的串口2部分,然后在输出质量的地方用了usart2_printf(),但是不能输出质量,还会影响触屏部分。但是把触屏或者称重屏蔽掉一个,两个都可以
我虽然用了usart2_printf(),但是称重部分还是通过串口1 传输的数据。
我是在纠结怎么才能把称重通过串口2传输,不要影响到串口1 的触屏
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-3-29 14:55:03 | 显示全部楼层
A2a 发表于 2018-3-29 14:51
#include "system.h"
#include "SysTick.h"
#include "led.h"

你称重 或者屏幕占用串口2的引脚了吧,不行映射到别的引脚或者用串口3也行呀
回复

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-6-1
在线时间
20 小时
发表于 2018-8-1 12:07:57 | 显示全部楼层
A2a 发表于 2018-3-27 18:48
两组数据都直接用串口发送,会混淆,就算不用printf也要fputc函数,不然输不出数据,但是我不知道为啥

串口1用printf();
串口2用USART_SendData(USART2, (unsigned char) ch);这样试过吗?
回复

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-6-1
在线时间
20 小时
发表于 2018-8-1 12:15:27 | 显示全部楼层
A2a 发表于 2018-3-27 20:25
adcx1=filter();//计算重量
                        if(adcx1>adcx){
                adcx1=adcx1-adcx;

数字是些啥,是你想得到的数吗?
还是LCD_ShowxNum()在Time.c里输出的帧率呢?
回复

使用道具 举报

4

主题

178

帖子

0

精华

高级会员

Rank: 4

积分
668
金钱
668
注册时间
2019-7-28
在线时间
60 小时
发表于 2020-4-27 08:37:35 | 显示全部楼层
使用发送之前自己重新定向不久好了,非要难为片子!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 11:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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