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

2019-07-20 05:24发布

先贴代码。。。
                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,也就说最后一个字节发送错误呢?
各位大佬,大神感谢伸出你们的援助之手,帮帮忙,,小弟感激不尽哇。。。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
10101100
2019-07-20 09:23
NickWu 发表于 2018-10-31 09:43
MCU確實已將資料發送出去,但資料還是得透過RS485模組發送出去才是真正的發送完畢,因此在發送後延遲一小段 ...

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

一周热门 更多>