OpenEdv-开源电子网

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

关于485以中断的方式发送问题

[复制链接]

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
发表于 2018-10-30 10:18:20 | 显示全部楼层 |阅读模式
5金钱
先贴代码。。。
                if((USART2->SR&0X80))//发送数据寄存器为空
                {   
                          USART2->DR =0xAA;        //往发送数据寄存器写数                                                    
                                if((USART2->SR&0X40)==0)//如果发送完成,开始进入中断发送
                                {
                                        USART2->DR =rs485buf1[count++]; //一个一个发送
                                        //count++;                               
                                }               
                        if(count>6){//直到缓存区发送完成
                          count=0;
                                RS485_TX_Set(0);//485转为接收状态
                                __HAL_UART_DISABLE_IT(&USART2_RS485Handler,UART_IT_TXE);//关闭发送中断
                        }                       
       
   }

这部分是在串口中断函数里面写的。我用了一个按键来开启发送中断,并设置485为发送状态。此时我打断点调试,然后会进入这个函数。读取串口状态,如果发送数据寄存器为空,然后填充一个数据到发送数据寄存器,硬件自动清除发送数据寄存器空标志,串口数据发送开始。此时应该是每当发送完成我就会进入中断一次,count计数就会+1.但现在打断点调试发现,我按下按键,串口会发好多个第一个字节,然后在最后的时候会出现完整的我要发送的数据,并且最后一个字节之后还多了一个FE。如果我在主while加一个延时,或者在发送完成if语句执行完之后加一个延时,按一下按键,发送完整的一串数之后还是会有FE。
我有这么几个疑惑:
1.为什么会连续发送多个第一个字节呢?加了延时就不会这种现象,这和延时有什么关系呢?发送中断不应该是我给发送数据寄存器一个数之后,当发送完成标志位置1就会进行下次中断么?
2.为什么发送完最后一个字节之后总会出现FE,也就说最后一个字节发送错误呢?
各位大佬,大神感谢伸出你们的援助之手,帮帮忙,,小弟感激不尽哇。。。。。。

最佳答案

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

小哥,你的繁体字不错。根据你的提示,我是这么想的。等到串口发送完最后一个字节之后,又会触发中断,我在这个时候关闭中断,应该会好一点啊,也就是我多触发了一次中断。之前是发送完最后一个字节之后,紧接着我就关了中断,改为接收状态,我也不知道发送完成没有,就知道我已经把最后一个数据给了数据寄存器。会不会是这个原因。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2018-10-30 10:18:21 | 显示全部楼层
NickWu 发表于 2018-10-31 09:43
MCU確實已將資料發送出去,但資料還是得透過RS485模組發送出去才是真正的發送完畢,因此在發送後延遲一小段 ...

小哥,你的繁体字不错。根据你的提示,我是这么想的。等到串口发送完最后一个字节之后,又会触发中断,我在这个时候关闭中断,应该会好一点啊,也就是我多触发了一次中断。之前是发送完最后一个字节之后,紧接着我就关了中断,改为接收状态,我也不知道发送完成没有,就知道我已经把最后一个数据给了数据寄存器。会不会是这个原因。
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2018-10-30 10:58:14 | 显示全部楼层
有没有大神知道哇,在线等。。。谢谢了。。
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2018-10-30 12:19:24 | 显示全部楼层
没有大神用过么,,,实在是搞不懂了
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2018-10-31 09:34:19 | 显示全部楼层
主要的机制想错了。应该是这样的。开发送中断,先往发送数据寄存器写第一个数,干别的,串口传送出去第一个数后会引发中断,中断后往发送数据寄存器写第二个数,中断返回,串口传送出去第二个数,再引发中断,写第三个数。。。。
代码如下:
if((USART2->SR)&(1<<7))               //发送数据寄存器为空
                {                         
                          USART2->DR =rs485buf1[count];     //给发送数据寄存器数据
                          count++;
                }       
                if(count>4){//发送完最后一个字节
                          
                                __HAL_UART_DISABLE_IT(&USART2_RS485Handler,UART_IT_TXE);关闭中断
                                RS485_TX_Set(0);改为接收状态
                         count=1;缓存区清1
                        }

因为我在主函数开中断的同时,并给发送数据寄存器写了第一个数,所以,在中断里面是从第二个数开始发送。
但当我发送完成之后,改为接收状态时,会产生最后一个字节发送错误,如果用延时应该会好点,但是有没有不用延时的方法?有没有大神知道嘞。
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-10-18
在线时间
19 小时
发表于 2018-10-31 09:43:13 | 显示全部楼层
MCU確實已將資料發送出去,但資料還是得透過RS485模組發送出去才是真正的發送完畢,因此在發送後延遲一小段時間再關閉DE的智能腳,這樣最後一個BYTE的資料才會完整。

至於不用延遲,可在發送後開一個短時間的timer,timer中斷觸發後再去關閉DE的智能腳。
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-10-18
在线时间
19 小时
发表于 2018-10-31 18:40:34 | 显示全部楼层
10101100 发表于 2018-10-31 10:15
小哥,你的繁体字不错。根据你的提示,我是这么想的。等到串口发送完最后一个字节之后,又会触发中断,我 ...

主要是RS485模組已收到你的MCU資料,但他還要把資料轉成AB訊號,這個時候你關閉DE智能腳後,他發送出去的資料就會不完全,這是我先前遇過類似的,而且當下發現RS485模組會有一個類似電感的聲音,加了延遲後再關閉DE,聲音就不見了,而且訊號就恢復正常了
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2018-10-31 20:38:22 | 显示全部楼层
NickWu 发表于 2018-10-31 18:40
主要是RS485模組已收到你的MCU資料,但他還要把資料轉成AB訊號,這個時候你關閉DE智能腳後,他發送出去的 ...

谢谢,小哥了,已搞定
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 17:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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