OpenEdv-开源电子网

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

RS485发送中断数据丢失问题

[复制链接]

28

主题

100

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-4-28
在线时间
44 小时
发表于 2019-9-3 16:53:40 | 显示全部楼层 |阅读模式
1金钱
485 用中断发送,正常运行的时候,会丢数据。但是单步运行的话,输出数据是正常的,在发送中断加点延时,发送也是正常的。 这是什么情况?大佬又知道的没有,



中断代码是这样的:
void UART4_IRQHandler(void)               
{
    if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
    {
       if(uart4_recv_struct.data_size<UART4_RECV_SIZE)
       {
          uart4_recv_struct.buf[uart4_recv_struct.buf_write]=UART4->DR;
          uart4_recv_struct.buf_write=( uart4_recv_struct.buf_write+1)%UART4_RECV_SIZE;
          uart4_recv_struct.data_size++;      
       }   
    }
    if(USART_GetITStatus(UART4, USART_IT_TC) != RESET)
    {
       if(uart4_sent_struct.data_size>0)
       {
        UART4->DR=uart4_sent_struct.buf[uart4_sent_struct.buf_read];           
         uart4_sent_struct.buf_read=(uart4_sent_struct.buf_read+1)%UART4_SENT_SIZE;

         uart4_sent_struct.data_size--;
           
       }else
        USART_ITConfig(UART4, USART_IT_TC, DISABLE);
    }else
    {
        USART_ITConfig(UART4, USART_IT_TC, DISABLE);
        USART_ITConfig(UART4, USART_IT_RXNE, DISABLE);
    }   
}


最佳答案

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

虚惊一场 !!串口调试助手的问题!! 用的原子的那个调试助手。接收就有问题。 换成 sscon 调试助手就接收到了!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

100

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-4-28
在线时间
44 小时
 楼主| 发表于 2019-9-3 16:53:41 | 显示全部楼层
虚惊一场 !!串口调试助手的问题!!  用的原子的那个调试助手。接收就有问题。    换成 sscon 调试助手就接收到了!!
回复

使用道具 举报

3

主题

93

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1087
金钱
1087
注册时间
2018-12-24
在线时间
113 小时
发表于 2019-9-3 17:20:02 | 显示全部楼层
你要等待串口发送完成吧,例如这样的一行代码
while((USART1->SR&0X40)==0);//等待发送结束

说个题外话,最好不要在中断函数里做什么多事情,发送数据可以放外面处理
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14424
金钱
14424
注册时间
2018-8-3
在线时间
1157 小时
发表于 2019-9-3 17:22:00 | 显示全部楼层
是不是数据发送的太快了 在485发送函数加个延时看看
回复

使用道具 举报

7

主题

59

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1159
金钱
1159
注册时间
2018-5-30
在线时间
151 小时
发表于 2019-9-3 17:47:12 | 显示全部楼层
接收中断时,先读入接收数据(同时清中断标志),再判断接收长度,是否写入数组。(用个局部变量)
发送中断时,应将uart4_sent_struct.data_size--;放在UART4->DR=uart4_sent_struct.buf[uart4_sent_struct.buf_read]; 前面,你这个程序0组数据发不出去。
回复

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-9-3 17:59:32 | 显示全部楼层
之前做了一个对时间敏感的485通信,也算有一点心得吧
一个是接收与发送状态转换之间需要一个延时来保证电平稳定,这个可能跟每块芯片有关,以几微秒的间隔慢慢测出稳定通信的值
二来是发送完成以后需要一个延时来保证链路上的信号真正已经传输到对方了,这个可以根据发送的数据量估算
别的地方的延时都不需要
世界和平
回复

使用道具 举报

28

主题

100

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-4-28
在线时间
44 小时
 楼主| 发表于 2019-9-4 10:52:42 | 显示全部楼层
小灰灰Veni 发表于 2019-9-3 17:20
你要等待串口发送完成吧,例如这样的一行代码
while((USART1->SR&0X40)==0);//等待发送结束

发送完成加过,但是不好使,
我这个中断也就发一个字节,在外边组包。您说的发送放外边是什么意思
回复

使用道具 举报

28

主题

100

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-4-28
在线时间
44 小时
 楼主| 发表于 2019-9-4 10:54:31 | 显示全部楼层
翼行园子 发表于 2019-9-3 17:22
是不是数据发送的太快了 在485发送函数加个延时看看

感觉跟485 有关系,不知道485发送有什么问题。外边加延时没有用,只有 UART->DR 这里加延时才管用,但是中断里加的延时,会影响其他程序。
回复

使用道具 举报

28

主题

100

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2017-4-28
在线时间
44 小时
 楼主| 发表于 2019-9-4 11:16:43 | 显示全部楼层
大个之 发表于 2019-9-3 17:47
接收中断时,先读入接收数据(同时清中断标志),再判断接收长度,是否写入数组。(用个局部变量)
发送中 ...

接收哪里没有问题,现在是我用串口调试助手作为接收,单片机作为发送。接收到的数据是不对的。
另外 uart4_sent_struct.data_size--;   这我写入的时候uart4_sent_struct.data_size++也是放在后面的。没事影响。
回复

使用道具 举报

0

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
887
金钱
887
注册时间
2018-4-20
在线时间
491 小时
发表于 2019-9-4 11:29:52 | 显示全部楼层
485不能同时发送和接收,需要转换收发模式,每次转换模式需要延时2ms左右
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 16:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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