打印

串口发送完成后总是接收到自己发送数据帧的最后一个字节

[复制链接]
6041|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
it_yrj|  楼主 | 2017-10-10 14:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32 串口进行红外通讯,在发送完成之后开启接收中断,总能收到自己发送的数据帧的最后一个字节。分别采用普通发送模式和DMA发送模式测试,效果都一样。求解?

相关帖子

沙发
steelen| | 2017-10-10 15:16 | 只看该作者
程序问题,问题在于最后一个字节根本没有发完就开始接收了

使用特权

评论回复
板凳
feelhyq| | 2017-10-10 16:05 | 只看该作者
在发送完成之后等待一会儿再接收(1ms)

使用特权

评论回复
地板
sjnh| | 2017-10-10 16:14 | 只看该作者
估计你的发送中断采用的是输出缓冲区空中断,用发送完成中断

使用特权

评论回复
5
linqing171| | 2017-10-10 16:27 | 只看该作者
串扰吧。或者软件bug吧。
你写入到硬件的发送队列里面的,你从接收队列读不出来。哪怕发送和接收是一个寄存器,但是实际上硬件不是一个地方。

使用特权

评论回复
6
linqing171| | 2017-10-10 16:28 | 只看该作者
你把接收接电源看看还会有这个现象吗。

使用特权

评论回复
7
lilyzigbee| | 2017-10-10 16:56 | 只看该作者
你是一次发送好几个字节吗,一次中断应该只能接受一个字节

使用特权

评论回复
8
it_yrj|  楼主 | 2017-10-10 21:02 | 只看该作者
steelen 发表于 2017-10-10 15:16
程序问题,问题在于最后一个字节根本没有发完就开始接收了

红外串口发送时关闭了接收中断,在发送完一帧数据的最后一个字节之后开启发送完成中断,然后在发送完成中断中开启接收中断,这么着还是能收到自己发送的最后一个字节。
同样DMA模式下也是在DMA发送完成中断中开启接收中断,二者结局都一样。
以前485通讯时有方向控制,没遇到这个问题,现在红外通讯碰到了。

使用特权

评论回复
9
it_yrj|  楼主 | 2017-10-10 21:03 | 只看该作者
feelhyq 发表于 2017-10-10 16:05
在发送完成之后等待一会儿再接收(1ms)

这个延时加在哪里比较合适,我是在发送完成中断中开启的接收使能。

使用特权

评论回复
10
it_yrj|  楼主 | 2017-10-10 21:03 | 只看该作者
sjnh 发表于 2017-10-10 16:14
估计你的发送中断采用的是输出缓冲区空中断,用发送完成中断

普通模式和DMA模式都是用的发送完成中断来着

使用特权

评论回复
11
it_yrj|  楼主 | 2017-10-10 21:04 | 只看该作者
linqing171 发表于 2017-10-10 16:27
串扰吧。或者软件bug吧。
你写入到硬件的发送队列里面的,你从接收队列读不出来。哪怕发送和接收是一个寄存 ...

红外可以边法边收的,发什么收什么

使用特权

评论回复
12
it_yrj|  楼主 | 2017-10-10 21:06 | 只看该作者
linqing171 发表于 2017-10-10 16:28
你把接收接电源看看还会有这个现象吗。

感觉还是使能接收太早了

使用特权

评论回复
13
it_yrj|  楼主 | 2017-10-10 21:07 | 只看该作者
lilyzigbee 发表于 2017-10-10 16:56
你是一次发送好几个字节吗,一次中断应该只能接受一个字节

一次发一帧数据,modbus协议,现在问题卡在了接受自己发送的最后一个字节这了

使用特权

评论回复
14
sjnh| | 2017-10-10 21:14 | 只看该作者
"在发送完成之后开启接收中断",是不是 红外通讯其实接收一直有接收数据,其实你发送多少接收多少,只不过,后面的覆盖前面的,只剩下最后一个字节;
你可以验证一下;看看有没有覆盖标志;
你开接收中断的时候清除一下接收缓存;

使用特权

评论回复
15
it_yrj|  楼主 | 2017-10-10 21:30 | 只看该作者
sjnh 发表于 2017-10-10 21:14
"在发送完成之后开启接收中断",是不是 红外通讯其实接收一直有接收数据,其实你发送多少接收多少,只不过 ...

确定没有覆盖,我添加了接收测试数组,确认只接收最后一个字节。
明天试下在使能接收之前读一下接收寄存器。
貌似之前是会收到两个字节,在使能接收之前读一下是会屏蔽掉倒数第二个,但还是会接收最后一个。我试着在发送完成中断之后开启接收中断之前加了延时,延时短了没效果,延时长了就收不到数据了

使用特权

评论回复
16
linqing171| | 2017-10-11 09:19 | 只看该作者
这样看来应该是空间的串扰,自己的发射从空中串到了自己的接收。发送寄存器填写完后,等发送完成,然后清一下自己的接收。

使用特权

评论回复
17
steelen| | 2017-10-11 11:36 | 只看该作者
STM32串口有TC标志位
是完全发送完成标识

使用特权

评论回复
18
sjnh| | 2017-10-11 15:47 | 只看该作者
it_yrj 发表于 2017-10-10 21:03
普通模式和DMA模式都是用的发送完成中断来着

你确认是发送完成中断?不是缓冲区空中断,
DMA应该是缓冲区空中断而不是发送完成中断

使用特权

评论回复
19
sjnh| | 2017-10-11 15:52 | 只看该作者
it_yrj 发表于 2017-10-10 21:30
确定没有覆盖,我添加了接收测试数组,确认只接收最后一个字节。
明天试下在使能接收之前读一下接收寄存 ...

从原理上讲,你只要开着接收功能(不是接收中断),那么应该是你发一个自己会收一个(如果能收到最后一个字节)

使用特权

评论回复
20
gujiamao12345| | 2017-10-12 10:27 | 只看该作者
上程序吧!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

614

帖子

0

粉丝