OpenEdv-开源电子网

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

串口问题? 求助

[复制链接]

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-2-25
在线时间
17 小时
发表于 2019-5-7 16:34:54 | 显示全部楼层 |阅读模式
1金钱
背景:我想将串口1和串口2进行互发互收数据
中断1处理如下: 1.png ,中断2基本一样,我单独使用串口1(串口2不接)或者串口2(串口1不接)时,能正常收发,但是只要同时接上那个了,就乱码了。我觉得线缆连接应该没问题的,不然单独使用1个串口时就会乱码。  这种情况咋弄?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2019-4-16
在线时间
41 小时
发表于 2019-5-7 16:58:59 | 显示全部楼层
曾经的沧桑让你我不再纯粹
回复

使用道具 举报

0

主题

79

帖子

0

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2016-5-27
在线时间
91 小时
发表于 2019-5-7 20:00:35 | 显示全部楼层
这样中断接收不会有问题,关键就是在中断中发送很容易出问题,不建议这样编程,如果发送和接收都采用中断方式一定得有接收和发送缓存,在中断函数里只简单的和缓存交回数据。如果接收用中断发送用查询,那么只要接收缓存,在调用函数处理接收缓存的数据就行了(也就是在这里发送数据)。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-5-8 02:04:25 | 显示全部楼层
usart_senddata函数,必须等待发送完成,否则你这么写就会出问题。
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-2-25
在线时间
17 小时
 楼主| 发表于 2019-5-8 10:21:49 | 显示全部楼层
正点原子 发表于 2019-5-8 02:04
usart_senddata函数,必须等待发送完成,否则你这么写就会出问题。

谢谢,我参考的这个帖子http://www.openedv.com/forum.php ... E%BF%DA%BB%A5%B7%A2,我下载了他的源码,也是这么写的,而且好像他能正常收发,我烧录进去还是乱码。  
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-2-25
在线时间
17 小时
 楼主| 发表于 2019-5-8 10:22:50 | 显示全部楼层
哆啦A梦p 发表于 2019-5-7 16:58
中断优先级配置下

谢谢  我修改了中断优先级  但还是乱码
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-2-25
在线时间
17 小时
 楼主| 发表于 2019-5-8 10:23:51 | 显示全部楼层
www88988 发表于 2019-5-7 20:00
这样中断接收不会有问题,关键就是在中断中发送很容易出问题,不建议这样编程,如果发送和接收都采用中断方 ...

谢谢大佬   请问有没有参考例程供我这个小菜鸟学习学习
回复

使用道具 举报

0

主题

79

帖子

0

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2016-5-27
在线时间
91 小时
发表于 2019-5-8 11:57:03 | 显示全部楼层
MrC0713 发表于 2019-5-8 10:23
谢谢大佬   请问有没有参考例程供我这个小菜鸟学习学习

给你个我的程序参考下,当然数据处理部分和串口初始化部分还得自己写下,我只写了一个口的另一个一样的。

#define USART_REC_LEN          1024 // 1K Buffer 如果数据量大的话可以多点但是不能大于64K(估计CPU的RAM也没那么大)
u16  USART1_In,USART1_Out;
u8   USART1_RX_BUF[USART_REC_LEN];

//调用函数  (这个函数得在WHILE中不断的查询缓存)
....
  if(USART1_Out!=USART1_In)
{
   USART_SendData(USART1, GetData());
   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
   //也可以这样
   //while((USART1->SR&0X40)==0);
   //USART1->DR = GetData();               
}
....

void USART1_IRQHandler(void)
{
      if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
     {
       USART1_RX_BUF[USART1_In++] = USART_ReceiveData(USART1);
       if(USART1_In>=USART_REC_LEN) USART1_In=0;                       
     }
}

u8 GetData(void)
{
        u8 data;        
          data=USART1_RX_BUF[USART1_Out++];
                if(USART1_Out>=USART_REC_LEN) USART1_Out=0;        
        return data;
}

另外我这个发送不是中断方式,所有初始化串口时不要开发送中断,
还得注意入口和出口的速率,就像一个池子,如果入水管大于出水管,不停的入水那么谁就会漫出来一样。
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-2-25
在线时间
17 小时
 楼主| 发表于 2019-5-8 13:02:52 | 显示全部楼层
www88988 发表于 2019-5-8 11:57
给你个我的程序参考下,当然数据处理部分和串口初始化部分还得自己写下,我只写了一个口的另一个一样的。 ...

谢谢  我慢慢消化一下
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-2-25
在线时间
17 小时
 楼主| 发表于 2019-5-8 15:24:53 | 显示全部楼层
www88988 发表于 2019-5-8 11:57
给你个我的程序参考下,当然数据处理部分和串口初始化部分还得自己写下,我只写了一个口的另一个一样的。 ...

大佬  求指导 我用您给的例程  单独串口1或2 都可以正常使用(另外串口不接上开发板)  但是假如我在用串口2正常收发的时候,把串口1的线接到开发板,还不用打开串口1的调试助手  串口2就乱码了 无标题.png ,图中上部分是串口2自发自收,中间乱码是把串口1的线接上(还没打开串口1的调试助手),下面是拔掉串口1的线。

回复

使用道具 举报

0

主题

79

帖子

0

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2016-5-27
在线时间
91 小时
发表于 2019-5-8 16:48:51 | 显示全部楼层
MrC0713 发表于 2019-5-8 15:24
大佬  求指导 我用您给的例程  单独串口1或2 都可以正常使用(另外串口不接上开发板)  但是假如我在用串 ...

先把流程弄明白:
收发数据: 上位机 -> STM_COM1 -> STM_COM2 -> 上位机
是这样吗?
如果是这样,上位机需要开2个串口。
把流程弄明白了,程序如果没写错的话,是没有问题的,这个程序我都做过好几个工控方面的项目了,到目前还没出现过问题,一定要耐心、细心,慢慢来,这也是个学习和积累的过程。
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-2-25
在线时间
17 小时
 楼主| 发表于 2019-5-8 19:38:16 | 显示全部楼层
www88988 发表于 2019-5-8 16:48
先把流程弄明白:
收发数据: 上位机 -> STM_COM1 -> STM_COM2 -> 上位机
是这样吗?

是的,如果要能实现usart1和usart2互相收发是要按“上位机 -> STM_COM1 -> STM_COM2 -> 上位机”,我的想法是先把单个串口调通,现在出现的问题是我的代码只是要实现串口2的自收发,但是只要把串口1的线接上(代码中不含串口1的初始化等),串口2就乱码了,拔掉串口1的线就又好了  这可不可能是硬件本身的问题?
回复

使用道具 举报

0

主题

79

帖子

0

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2016-5-27
在线时间
91 小时
发表于 2019-5-8 19:48:50 | 显示全部楼层
MrC0713 发表于 2019-5-8 19:38
是的,如果要能实现usart1和usart2互相收发是要按“上位机 -> STM_COM1 -> STM_COM2 -> 上位机”,我的想 ...

实验步骤:
1、先把上位机的2串口 RX-TX   TX-RX  GND-GND,用串口助手对收发下看看是否正常。
2、再实验 上位机COM1 -> STM_COM1 -> STMCOM2 -> 上位机COM2 ,COM1 发->COM2收,看看是否正常。
3、再试试COM1,COM2分别接STM的COM1,COM2,收发实验(单对单STM只转发)。找原因
回复

使用道具 举报

0

主题

79

帖子

0

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2016-5-27
在线时间
91 小时
发表于 2019-5-8 19:51:16 | 显示全部楼层
MrC0713 发表于 2019-5-8 15:24
大佬  求指导 我用您给的例程  单独串口1或2 都可以正常使用(另外串口不接上开发板)  但是假如我在用串 ...

看现象,应该是接收有干扰。看看接线,特别是与上位机连接的RX和GND
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-2-25
在线时间
17 小时
 楼主| 发表于 2019-5-9 09:45:59 | 显示全部楼层
www88988 发表于 2019-5-8 19:51
看现象,应该是接收有干扰。看看接线,特别是与上位机连接的RX和GND

嗯嗯  谢谢指导  我自己多捣鼓捣鼓
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 06:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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