查看: 926|回复: 30
收起左侧

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

[复制链接]
     

60

主题

576

帖子

1758

积分

助理工程师

 楼主| 发表于 2017-10-10 14:37 | 显示全部楼层 |返回版面||阅读模式
STM32 串口进行红外通讯,在发送完成之后开启接收中断,总能收到自己发送的数据帧的最后一个字节。分别采用普通发送模式和DMA发送模式测试,效果都一样。求解?
     

22

主题

193

帖子

2563

积分

初级工程师

发表于 2017-10-10 15:16 | 显示全部楼层 |返回版面
程序问题,问题在于最后一个字节根本没有发完就开始接收了
      

4

主题

806

帖子

2462

积分

初级工程师

发表于 2017-10-10 16:05 | 显示全部楼层 |返回版面
在发送完成之后等待一会儿再接收(1ms)
     

12

主题

698

帖子

3343

积分

中级工程师

发表于 2017-10-10 16:14 | 显示全部楼层 |返回版面
估计你的发送中断采用的是输出缓冲区空中断,用发送完成中断
     

47

主题

2100

帖子

8092

积分

技术达人

发表于 2017-10-10 16:27 | 显示全部楼层 |返回版面
串扰吧。或者软件bug吧。
你写入到硬件的发送队列里面的,你从接收队列读不出来。哪怕发送和接收是一个寄存器,但是实际上硬件不是一个地方。
I find it amusing that you didn't even consider a third reason for the problem was an error on your part.
     

47

主题

2100

帖子

8092

积分

技术达人

发表于 2017-10-10 16:28 | 显示全部楼层 |返回版面
你把接收接电源看看还会有这个现象吗。
I find it amusing that you didn't even consider a third reason for the problem was an error on your part.
     

7

主题

25

帖子

75

积分

初级技术员

发表于 2017-10-10 16:56 | 显示全部楼层 |返回版面
你是一次发送好几个字节吗,一次中断应该只能接受一个字节
     

60

主题

576

帖子

1758

积分

助理工程师

 楼主| 发表于 2017-10-10 21:02 | 显示全部楼层 |返回版面
steelen 发表于 2017-10-10 15:16
程序问题,问题在于最后一个字节根本没有发完就开始接收了

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

60

主题

576

帖子

1758

积分

助理工程师

 楼主| 发表于 2017-10-10 21:03 | 显示全部楼层 |返回版面
feelhyq 发表于 2017-10-10 16:05
在发送完成之后等待一会儿再接收(1ms)

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

60

主题

576

帖子

1758

积分

助理工程师

 楼主| 发表于 2017-10-10 21:03 | 显示全部楼层 |返回版面
sjnh 发表于 2017-10-10 16:14
估计你的发送中断采用的是输出缓冲区空中断,用发送完成中断

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

60

主题

576

帖子

1758

积分

助理工程师

 楼主| 发表于 2017-10-10 21:04 | 显示全部楼层 |返回版面
linqing171 发表于 2017-10-10 16:27
串扰吧。或者软件bug吧。
你写入到硬件的发送队列里面的,你从接收队列读不出来。哪怕发送和接收是一个寄存 ...

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

60

主题

576

帖子

1758

积分

助理工程师

 楼主| 发表于 2017-10-10 21:06 | 显示全部楼层 |返回版面
linqing171 发表于 2017-10-10 16:28
你把接收接电源看看还会有这个现象吗。

感觉还是使能接收太早了
     

60

主题

576

帖子

1758

积分

助理工程师

 楼主| 发表于 2017-10-10 21:07 | 显示全部楼层 |返回版面
lilyzigbee 发表于 2017-10-10 16:56
你是一次发送好几个字节吗,一次中断应该只能接受一个字节

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

12

主题

698

帖子

3343

积分

中级工程师

发表于 2017-10-10 21:14 | 显示全部楼层 |返回版面
"在发送完成之后开启接收中断",是不是 红外通讯其实接收一直有接收数据,其实你发送多少接收多少,只不过,后面的覆盖前面的,只剩下最后一个字节;
你可以验证一下;看看有没有覆盖标志;
你开接收中断的时候清除一下接收缓存;
     

60

主题

576

帖子

1758

积分

助理工程师

 楼主| 发表于 2017-10-10 21:30 | 显示全部楼层 |返回版面
sjnh 发表于 2017-10-10 21:14
"在发送完成之后开启接收中断",是不是 红外通讯其实接收一直有接收数据,其实你发送多少接收多少,只不过 ...

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

47

主题

2100

帖子

8092

积分

技术达人

发表于 2017-10-11 09:19 | 显示全部楼层 |返回版面
这样看来应该是空间的串扰,自己的发射从空中串到了自己的接收。发送寄存器填写完后,等发送完成,然后清一下自己的接收。
I find it amusing that you didn't even consider a third reason for the problem was an error on your part.
     

22

主题

193

帖子

2563

积分

初级工程师

发表于 2017-10-11 11:36 | 显示全部楼层 |返回版面
STM32串口有TC标志位
是完全发送完成标识
     

12

主题

698

帖子

3343

积分

中级工程师

发表于 2017-10-11 15:47 | 显示全部楼层 |返回版面
it_yrj 发表于 2017-10-10 21:03
普通模式和DMA模式都是用的发送完成中断来着

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

12

主题

698

帖子

3343

积分

中级工程师

发表于 2017-10-11 15:52 | 显示全部楼层 |返回版面
it_yrj 发表于 2017-10-10 21:30
确定没有覆盖,我添加了接收测试数组,确认只接收最后一个字节。
明天试下在使能接收之前读一下接收寄存 ...

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

16

主题

882

帖子

2669

积分

版主

发表于 2017-10-12 10:27 | 显示全部楼层 |返回版面
上程序吧!
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

关闭

热门推荐上一条 /5 下一条

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