打印

STM32做485通讯,发送接收到的数据时丢数据的问题。

[复制链接]
8530|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
初学485通讯,遇到了些问题。。
之前用232调了个接收串口精灵发送的数据然后发送到串口精灵。。
是正常的。。见下图:

现在换成485,结果发现,数据接收是正常的。。
但是发送后,数据丢了两位。。
见下图:


程序的话也就中断中处理的,和232的程序没啥区别,就加了个485控制端。。
程序如下:

void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET)   // 接收
中断有效 ;
   {
  
     /* Read one byte from the receive data register */
     RxBuffer[RxCounter++] = USART_ReceiveData(USART2);//
(USART_ReceiveData(USART2) & 0x7F); // 返回USARTx最近接收到的数据 ;  
  /* Clear the USART2 Receive interrupt */
     USART_ClearITPendingBit(USART2, USART_IT_RXNE);  // 清除
USART2的接收中断 ;              
     if(RxCounter == RxBufferSize)
     {
        /* Disable the USART2 Receive interrupt */
        USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); // 失能
USART2的接收中断 ;
   TX_EN_485;      
    //发送状态
   USART_ITConfig(USART2, USART_IT_TXE, ENABLE);   
// 使能指定的USART2发送中断 ;
   RxCounter=0;      
   //接收计数标志清零   
     }
   }
   if(USART_GetITStatus(USART2, USART_IT_TXE) == SET)   
// 发送中断有效 ;
   {   
     /* Write one byte to the transmit data register */
     USART_SendData(USART2, RxBuffer[TxCounter++]);   // 发送
数据 ;                  
     /* Clear the USART2 transmit interrupt */
     USART_ClearITPendingBit(USART2, USART_IT_TXE);   // 清除
USART2的发送中断 ;
     if(TxCounter == RxBufferSize)
     {
        /* Disable the USART2 Transmit interrupt */
        USART_ITConfig(USART2, USART_IT_TXE, DISABLE);  // 失能
USART2的发送中断 ;
   RX_EN_485;      
    //接收状态
   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);  
//使能接收中断
   TxCounter=0;      
   //接收计数标志清零
     }   
   }
}

注:其中RxBufferSize=8;

各位帮忙分析下是啥原因。。
沙发
香水城| | 2011-9-1 12:24 | 只看该作者
板凳
sjnh| | 2011-9-1 13:11 | 只看该作者
USART_IT_TXE中断是传输寄存器空(数据已经传输到移位寄存器),最后一个字节数据并没有发送出去,可以用TC中断

使用特权

评论回复
地板
hackthree|  楼主 | 2011-9-1 14:00 | 只看该作者
2# 香水城

THX香主。。。

使用特权

评论回复
5
hackthree|  楼主 | 2011-9-1 14:00 | 只看该作者
3# sjnh

关键是丢了两个数据。。

使用特权

评论回复
6
yujie870705| | 2011-9-1 14:26 | 只看该作者
发送之后需要等待发送完成
while ( USART_GetFlagStatus(COM_USART[UART_PORT],  USART_FLAG_TC ) == RESET )
                    {}
加上这句试一下

使用特权

评论回复
7
hackthree|  楼主 | 2011-9-1 16:10 | 只看该作者
6# yujie870705

谢谢,我再琢磨琢磨。。

使用特权

评论回复
8
qnqanger| | 2012-11-24 10:57 | 只看该作者
现在我也遇到同样的问题了,楼主解决了吗?怎么解决的,告诉一下方法,万分感谢

使用特权

评论回复
9
zcl_l| | 2013-5-18 10:25 | 只看该作者
这个问题我也遇到过,用TC标志解决了,但效率是不是不如TXE高啊?

使用特权

评论回复
10
aaa1125456| | 2015-5-5 16:19 | 只看该作者
我也遇到这个问题 了 无论多长 都是最后2个发布了

使用特权

评论回复
11
aaa1125456| | 2015-5-5 16:21 | 只看该作者
我的要是后面加个延迟  最后一个 会跑到下轮接收到

使用特权

评论回复
12
zzwcn2012| | 2015-5-7 16:42 | 只看该作者
学习一下!

使用特权

评论回复
13
zh113214| | 2015-5-7 22:20 | 只看该作者

有没有DAC产生固定电压的程序,可以设置的。。

使用特权

评论回复
14
yangguangchenju| | 2016-11-28 16:47 | 只看该作者
谢谢分享

使用特权

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

本版积分规则

1

主题

220

帖子

1

粉丝