野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11470|回复: 19

F1的串口1和串口3同时使用printf函数

[复制链接]
发表于 2016-3-1 11:21:53 | 显示全部楼层 |阅读模式
F1的串口1和串口3同时使用printf函数,现在出现一个问题,野火的例程里面是一个串口的,fputc这个库函数只重定向到某一个串口,两个串口的话就不行了,有什么解决办法吗?需要实现的功能就是串口1中断接收的数据通过串口3打印到上位机,串口3接收的数据通过串口1打印到上位机。有坛友可以给出思路吗?
回复

使用道具 举报

 楼主| 发表于 2016-3-1 12:35:35 | 显示全部楼层
我改写了新的重定向函数之后,可以收发了。但是似乎还有点问题,就是串口1必须先发给串口3,然后串口3才可以发给串口1,串口3不能直接发给串口1,请问这是为什么呢?
回复 支持 反对

使用道具 举报

发表于 2016-3-1 14:13:06 | 显示全部楼层
不用printf就好了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-1 19:27:32 | 显示全部楼层
海波 发表于 2016-3-1 14:13
不用printf就好了

那用啥?因为是要直接打印到上位机的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-1 20:53:00 | 显示全部楼层
目前我不使用printf函数了,目前的问题是这样的:串口1和串口3可以互相发数据了,但是问题是串口1发给串口3的数据在上位机上显示会发2次,而串口3发给串口1没有什么问题。我上传了工程文件,请路过的前辈们帮忙看看问题出在哪里好吗?

串口1串口3转发数据.rar

697.1 KB, 下载次数: 22

回复 支持 反对

使用道具 举报

发表于 2016-3-1 21:29:41 | 显示全部楼层
首先声明一点,楼主并没有说明 是谁给串口1 串口3发送数据 (是不是电脑,我不知道),所以这点我就不考虑了。
【软件】下面函数为示意性伪代码 :
void  ISR_Usart1() // 串口1的接受中断  
{
     char s[50];
     sprinf(s,"%d%d%d",DDDDD);
     usart3_SendBuf(s,sizeof(s));
}

void ISR_Usart3() // 串口3的接受中断
{
     char s[50];
     sprinf(s,"%d%d%d",DDDDD);
     usart1_SendBuf(s,sizeof(s));
}
【硬件】
将 usar1 和 usart3外部的 TXD端口拧在一起,连接到电脑的 RXD端  
21.png
回复 支持 反对

使用道具 举报

发表于 2016-3-1 21:33:42 | 显示全部楼层
GPPyeye 发表于 2016-3-1 20:53
目前我不使用printf函数了,目前的问题是这样的:串口1和串口3可以互相发数据了,但是问题是串口1发给串口3 ...

我快被你搞乱了,请问搂住 ,您这样来回发有什么意义呢,那个项目中的,不如讲出来,让大家给你提供个较容易的方案。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-1 21:42:45 | 显示全部楼层
易帜 发表于 2016-3-1 21:33
我快被你搞乱了,请问搂住 ,您这样来回发有什么意义呢,那个项目中的,不如讲出来,让大家给你提供个较 ...

不好意思,可能我没有说清楚。我这个是做一个zigbee网关, zigbee接收节点的数据后通过串口3接收,然后数据存进数组,然后把这个数组通过串口1发到服务器;反过来串口1也要把从服务器接收的数据通过串口3发送出去,所以目前我要做的首先就是在电脑上模拟,将数据能够在串口1和串口3之间来回发。请问有没有什么思路呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-1 21:46:53 | 显示全部楼层
@fire,火哥在吗
@易帜,兄弟有何高见?
回复 支持 反对

使用道具 举报

发表于 2016-3-2 14:28:52 | 显示全部楼层
GPPyeye 发表于 2016-3-1 19:27
那用啥?因为是要直接打印到上位机的

/*****************  发送一个字符 **********************/
static void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch )
{
        /* 发送一个字节数据到USART1 */
        USART_SendData(pUSARTx,ch);
               
        /* 等待发送完毕 */
        while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);       
}
/*****************  指定长度的发送字符串 **********************/
void Usart_SendStr_length( USART_TypeDef * pUSARTx, uint8_t *str,uint32_t strlen )
{
        unsigned int k=0;
    do
    {
        Usart_SendByte( pUSARTx, *(str + k) );
        k++;
    } while(k < strlen);
}

/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, uint8_t *str)
{
        unsigned int k=0;
    do
    {
        Usart_SendByte( pUSARTx, *(str + k) );
        k++;
    } while(*(str + k)!='\0');
}
回复 支持 反对

使用道具 举报

发表于 2016-3-2 14:35:07 | 显示全部楼层
GPPyeye 发表于 2016-3-1 21:46
@fire,火哥在吗
@易帜,兄弟有何高见?

这问题不很简单吗, 你这能够在串口1 和串口2 之间来回发把问题搞复杂了, 用两个USB to TTL 分别接在STM32网关上的uart1 和 uart3 上 ,电脑上会两个串口, 一个相当于 GSM等设备  一个相当于 Zigbee  。程序怎么写不用我说了吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-2 19:51:53 | 显示全部楼层
易帜 发表于 2016-3-2 14:35
这问题不很简单吗, 你这能够在串口1 和串口2 之间来回发把问题搞复杂了, 用两个USB to TTL 分别接在STM ...

额,我就是用的你说的这种啊。两个CP2102,两个上位机。结果就是串口1发到串口3会发两次,程序检查了很久,不知道问题出在哪里。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-2 19:53:11 | 显示全部楼层
海波 发表于 2016-3-2 14:28
/*****************  发送一个字符 **********************/
static void Usart_SendByte( USART_TypeDe ...

谢谢!这个发送的函数我已经弄好了。现在的问题是串口1发到串口3会发2次,而串口3发到串口1是没有问题的,能提供下思路吗?
回复 支持 反对

使用道具 举报

发表于 2016-3-3 11:11:38 | 显示全部楼层
本帖最后由 易帜 于 2016-3-3 11:13 编辑

我觉得解决嵌入式问题时,关键是认真,细致,使用排除法 ,对比程序,观察不同,修改程序,验证程序 反复这个过程。
对于这个问题吧,导致这个问题的原因可能有多种(可能吧)
1,程序问题,(包括库,串口中断接受,轮询接受都试试)
2,CP2101这个串口芯片的问题, 换其他 CH340G FT232 等试试
3,板子问题,换个板子试试
4,上位机问题,换个上位机试试
5,电脑系统问题, 换个电脑试试
等, 其他你自己再想想。
你要多使用排除法,一项项排除, 切记控制变量法,每次只改变一个条件,观察现象,还就就是不要忽视那些低级错误。 一切皆有可能。
程序我就不帮你看了哈, 最近较忙,见谅,你可以找些其他例程做对比,祝你成功!
回复 支持 反对

使用道具 举报

发表于 2016-3-3 13:10:44 | 显示全部楼层
GPPyeye 发表于 2016-3-2 19:53
谢谢!这个发送的函数我已经弄好了。现在的问题是串口1发到串口3会发2次,而串口3发到串口1是没有问题的 ...

把你代码发出来
回复 支持 反对

使用道具 举报

发表于 2016-3-3 13:22:43 | 显示全部楼层
。。。。。。。。。。。。。。。。。。。。。。。。。
QQ截图20160303132213.png
回复

使用道具 举报

 楼主| 发表于 2016-3-3 23:17:11 | 显示全部楼层
易帜 发表于 2016-3-3 11:11
我觉得解决嵌入式问题时,关键是认真,细致,使用排除法 ,对比程序,观察不同,修改程序,验证程序 反复这 ...

嗯嗯,还是要谢谢你哈!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-3 23:17:36 | 显示全部楼层
海波 发表于 2016-3-3 13:10
把你代码发出来

我已经上传了整个工程了呀
回复 支持 反对

使用道具 举报

发表于 2016-3-4 11:10:40 | 显示全部楼层
GPPyeye 发表于 2016-3-3 23:17
我已经上传了整个工程了呀

回复过你了
回复 支持 反对

使用道具 举报

发表于 2016-3-5 14:36:10 | 显示全部楼层
自己定义一个不定参的伪printf函数就行了,参考文章:http://blog.chinaunix.net/xmlrpc ... 1521&id=4326789
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 11:13 , Processed in 0.049079 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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