使用485串口方式发送、接收数据,怎么保证其发送、接收数据的完整性

2019-07-20 07:27发布

在学习485发送接收的时候,(有文章中说)在发送模式下,数据发送完成之后不能马上把发送使能拉低,需要等待一会儿(大约发送1-2位的时间,视波特率而定),等待收方确认收到停止位后,再把使能位给拉低进入接收模式。
我的疑问是,如果发送完成后不立即进入接收状态,(数据发送过去后,从机接收到主机发送的数据,会立即返回响应数据)会不会接收到的数据会不完整。那么485在发送时的程序应该如何去写呢?需要加延时吗?
void RS485_Send_Data(u8 *buf,u8 len)
{
        u8 t;
        RS485_TX_EN=1;                        //设置为发送模式
        delay_ms(1);//使总线在状态切换时,有一个稳定的工作过程。
          for(t=0;t<len;t++)                //循环发送数据
        {
          while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //等待发送结束               
    USART_SendData(USART2,buf[t]); //发送数据
        }         
        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //等待发送结束               
        delay_ms(1);//使总线在状态切换时,有一个稳定的工作过程。?????需要加吗
        RS485_TX_EN=0;                                //设置为接收模式       
}

此外,在数据接收中断里,为了保证数据接收的完整性。我采取的方法是,因为我接收的数据是固定的长度的7位字节,所以我定义了一个
计数标志。当累加到7时,表明已经接收完成,开始处理接收到的数据,并且把计数标志清零,以便下次使用。但是,感觉这样确定数据是否接收完成,
这中方法不是很好,不严谨。有时会出错,不知大家有没有好的想法,欢迎大家交流。谢谢!!!
void USART2_IRQHandler(void)  //MODBUS一个字节接收中断
{
         u8 res;          
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
               
        {                
          res =USART_ReceiveData(USART2);//;读取接收到的数据USART2->DR
                RS485_RX_BUF[RS485_RX_CNT]=res;                //记录接收到的值
                        RS485_RX_CNT++;        //接受一个字节累加一次,7次累加

               

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
bufangqi
1楼-- · 2019-07-21 02:20
 精彩回答 2  元偷偷看……
1812090658@qq.c
2楼-- · 2019-07-21 04:31
这个问题我也在思考,我要做一对多通信,接收从机响应数据,需要轮训,如果你是一对一,可以把485电路设计成自动收发
bufangqi
3楼-- · 2019-07-21 08:19
1812090658@qq.c 发表于 2018-6-27 19:35
这个问题我也在思考,我要做一对多通信,接收从机响应数据,需要轮训,如果你是一对一,可以把485电路设计 ...

我现在是一对二通信的。还是有些不完善。

一周热门 更多>